index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. <template>
  2. <div>
  3. <el-breadcrumb class="heading">
  4. <el-breadcrumb-item :to="{ path: '/' }">平台首页</el-breadcrumb-item>
  5. <el-breadcrumb-item :to="{ path: '/oilsupplier/oilcontract' }">承包商评价</el-breadcrumb-item>
  6. </el-breadcrumb>
  7. <el-card class="box-card" style="height: calc(100vh - 115px);">
  8. <div slot="header">
  9. <span>
  10. <i class="icon icon-table2"></i> 承包商评价
  11. </span>
  12. <span style="float: right;">
  13. <!-- <router-link :to="'/oilcontract/contract-basis/add/operation'">
  14. <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;">添加</el-button>
  15. </router-link> -->
  16. <!-- <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;" @click="exportExcel">导出</el-button> -->
  17. <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;" v-if="!selectAllButtonBoolean&&userSelectBoolean" @click="onSelectAllButton">一键处理</el-button>
  18. <el-button type="info" size="mini" style="margin-left:10px; margin-top: -4px;" v-if="selectAllButtonBoolean" @click="onSelectAllButtonDelete">取消</el-button>
  19. <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;" v-if="selectAllButtonBoolean" @click="onSelectAllButtonTrue">确定</el-button>
  20. </span>
  21. <el-form ref="form" :inline="true" style="float: right; margin-top: -10px">
  22. <el-form-item label="上报时间">
  23. <el-date-picker size="mini" style="width: 220px" v-model="CreateOn" type="daterange" range-separator="至"
  24. start-placeholder="生成日期" end-placeholder="结束日期"></el-date-picker>
  25. </el-form-item>
  26. <el-form-item>
  27. <el-dropdown split-button type="primary" size="mini" @click="handleSearch" @command="searchCommand">
  28. 查询
  29. <el-dropdown-menu slot="dropdown">
  30. <el-dropdown-item command="search">高级查询</el-dropdown-item>
  31. <el-dropdown-item command="clear">查询重置</el-dropdown-item>
  32. </el-dropdown-menu>
  33. </el-dropdown>
  34. </el-form-item>
  35. </el-form>
  36. </div>
  37. <el-table size="mini" highlight-current-row stripe id="rebateSetTable" :data="entityList" border height="calc(100vh - 243px)" style="width: 100%" @sort-change="orderby" @selection-change="onSelectAll">
  38. <el-table-column v-if="selectAllButtonBoolean" :selectable="selectableFun" type="selection" width="55"></el-table-column>
  39. <el-table-column label="操作" min-width="210" align="center" fixed>
  40. <template slot-scope="scope">
  41. <el-button v-if="editeBoolean" type="text" title="编辑" size="small" icon="el-icon-edit" @click="onNavigateEvaluate(scope.row)">编辑</el-button>
  42. <el-button v-else type="text" title="编辑" size="small" icon="el-icon-edit" @click="onNavigateEvaluate(scope.row)">查看</el-button>
  43. <el-popover placement="top" title="提示" :ref="'popover-' + `${scope.$index}`" v-if="deleteBoolean&&scope.row.Status<=0">
  44. <el-alert
  45. title=""
  46. description="确认要删除吗?"
  47. type="warning"
  48. :closable="false">
  49. </el-alert>
  50. <br/>
  51. <div style="text-align: right; margin: 0">
  52. <el-button type="primary" size="mini" @click="deleteEntity(scope.row,scope.$index)">删除</el-button>
  53. </div>
  54. <el-button slot="reference" type="text" style="margin-left:3px" icon="el-icon-delete" size="small" >删除</el-button>
  55. </el-popover>
  56. </template>
  57. </el-table-column>
  58. <el-table-column v-for="column in tableColumns" :key="column.Id"
  59. v-if="column.prop != 'CreateOn'" :prop="column.prop" sortable min-width="100" :label="column.label" align="center" show-overflow-tooltip>
  60. <template slot-scope="scope" >
  61. <div>{{columnFun(scope.row[column.prop],column.prop) }}</div>
  62. </template>
  63. </el-table-column>
  64. <!--<el-table-column prop="CreateOn" sortable min-width="150" label="生成时间" align="center" show-overflow-tooltip>
  65. <template slot-scope="scope">
  66. {{ jstimehandle(scope.row.CreateOn+'') }}
  67. </template>
  68. </el-table-column>-->
  69. </el-table>
  70. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
  71. :page-sizes="[10, 15, 20, 25]" :page-size="size" layout="total, sizes, prev, pager, next, jumper" :total="currentItemCount">
  72. </el-pagination>
  73. </el-card>
  74. <el-dialog title="高级查询" :visible.sync="dialogVisible" width="720px">
  75. <el-form ref="advancedsearchForm" label-width="110px">
  76. <el-row>
  77. <el-col :span="12">
  78. <el-form-item label="生成时间">
  79. <el-date-picker size="mini" v-model="CreateOn" type="daterange" style="width:100%" range-separator="至"
  80. start-placeholder="生成日期" end-placeholder="结束日期"></el-date-picker>
  81. </el-form-item>
  82. </el-col>
  83. <el-col :span="12">
  84. <el-form-item label="供应商ID">
  85. <el-input size="mini" v-model="searchForm.SupplierId" style="width:100%" placeholder="请输入"></el-input>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="12">
  89. <el-form-item label="企业名称">
  90. <el-input size="mini" v-model="searchForm.SupplierName" style="width:100%" placeholder="请输入"></el-input>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="12">
  94. <el-form-item label="项目名称">
  95. <el-input size="mini" v-model="searchForm.ProjectName" style="width:100%" placeholder="请输入"></el-input>
  96. </el-form-item>
  97. </el-col>
  98. <el-col :span="12">
  99. <el-form-item label="合同编号">
  100. <el-input size="mini" v-model="searchForm.ContractNo" style="width:100%" placeholder="请输入"></el-input>
  101. </el-form-item>
  102. </el-col>
  103. <el-col :span="12">
  104. <el-form-item label="工程地点">
  105. <el-input size="mini" v-model="searchForm.ProjectPlace" style="width:100%" placeholder="请输入"></el-input>
  106. </el-form-item>
  107. </el-col>
  108. <el-col :span="12">
  109. <el-form-item label="项目负责人">
  110. <el-input size="mini" v-model="searchForm.ProjectOwner" style="width:100%" placeholder="请输入"></el-input>
  111. </el-form-item>
  112. </el-col>
  113. <el-col :span="12">
  114. <el-form-item label="联系人电话">
  115. <el-input size="mini" v-model="searchForm.Telephone" style="width:100%" placeholder="请输入"></el-input>
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="12">
  119. <el-form-item label="项目类别">
  120. <el-input size="mini" v-model="searchForm.ProjectType" style="width:100%" placeholder="请输入"></el-input>
  121. </el-form-item>
  122. </el-col>
  123. <el-col :span="12">
  124. <el-form-item label="合同模式">
  125. <el-input size="mini" v-model="searchForm.ContractMode" style="width:100%" placeholder="请输入"></el-input>
  126. </el-form-item>
  127. </el-col>
  128. <el-col :span="12">
  129. <el-form-item label="合同总金额(万元)">
  130. <el-input size="mini" v-model="searchForm.Amount" style="width:100%" placeholder="请输入"></el-input>
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span="12">
  134. <el-form-item label="合同总工期(天)">
  135. <el-input size="mini" v-model="searchForm.ContractPeriod" style="width:100%" placeholder="请输入"></el-input>
  136. </el-form-item>
  137. </el-col>
  138. <el-col :span="12">
  139. <el-form-item label="开工日期">
  140. <el-input size="mini" v-model="searchForm.OpenDate" style="width:100%" placeholder="请输入"></el-input>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="12">
  144. <el-form-item label="计划竣工时间">
  145. <el-input size="mini" v-model="searchForm.PlanFinishDate" style="width:100%" placeholder="请输入"></el-input>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="12">
  149. <el-form-item label="备注">
  150. <el-input size="mini" v-model="searchForm.Remark" style="width:100%" placeholder="请输入"></el-input>
  151. </el-form-item>
  152. </el-col>
  153. </el-row>
  154. </el-form>
  155. <span slot="footer" class="dialog-footer">
  156. <el-button size="mini" @click="dialogVisible = false">取 消</el-button>
  157. <el-button size="mini" type="primary" @click="handleSearch">查 询</el-button>
  158. </span>
  159. </el-dialog>
  160. <!-- :selectDeptBoolean="false"-->
  161. <submitPopup ref="submitpopup" :eveId="eveIdList" @refreshPage="initDatas" ></submitPopup>
  162. </div>
  163. </template>
  164. <script>
  165. import { mapGetters } from 'vuex';
  166. import api from '@/api/oilcontract/contract';
  167. import apiReview from '@/api/oilcontract/contractReview';
  168. import permissionApi from '@/api/oilcontract/permission';
  169. import FileSaver from 'file-saver'
  170. import XLSX from 'xlsx'
  171. export default {
  172. computed: {
  173. ...mapGetters({
  174. authUser: 'authUser'
  175. })
  176. },
  177. computed:{
  178. columnFun:function(){
  179. return function(item,index){
  180. if(index == 'Status'){
  181. var index = Number(item)
  182. switch(index){
  183. case 0:
  184. return '已保存'
  185. break;
  186. case 1:
  187. return '待初审'
  188. break;
  189. case 2:
  190. return '待复审'
  191. break;
  192. case 3:
  193. return '专业科室接收'
  194. break;
  195. case 4:
  196. return '待专业科室审核'
  197. break;
  198. case 7:
  199. return '待企管法规处审批'
  200. break;
  201. case 8:
  202. return '已完成'
  203. break;
  204. case -1:
  205. return '初审未通过'
  206. break;
  207. case -2:
  208. return '复审未通过'
  209. break;
  210. case -3:
  211. return '专业处室未通过'
  212. break;
  213. case -4:
  214. return '专业处室审核未通过'
  215. break;
  216. case -7:
  217. return '企管法规处审批未通过'
  218. break;
  219. default:
  220. return '--'
  221. break;
  222. }
  223. }else{
  224. return item;
  225. }
  226. }
  227. }
  228. },
  229. name: 'oilcontract',
  230. data() {
  231. return {
  232. userSelectBoolean:false,
  233. eveIdList:'',
  234. selectAllButtonBoolean:false,
  235. editeBoolean:false,
  236. deleteBoolean:false,
  237. dialogVisible: false,
  238. //列表数据
  239. entityList: [],
  240. //分页参数
  241. size: 10,
  242. currentPage: 1,
  243. currentItemCount: 0,
  244. //列表排序
  245. Column: {
  246. Order: '',
  247. Prop: ''
  248. },
  249. //查询时间 new Date(new Date().getTime() - 30 * 24 * 60 * 60 * 1000), new Date()
  250. CreateOn: [],
  251. //查询项
  252. searchFormReset: {},
  253. searchForm: {
  254. Id: '',
  255. SupplierId: '',
  256. SupplierName: '',
  257. ProjectName: '',
  258. ContractNo: '',
  259. ProjectPlace: '',
  260. ProjectOwner: '',
  261. Telephone: '',
  262. ProjectType: '',
  263. ContractMode: '',
  264. Amount: '',
  265. ContractPeriod: '',
  266. OpenDate: '',
  267. PlanFinishDate: '',
  268. ConstructionUnit: '',
  269. ConstructionOwner: '',
  270. ConstructionTelphone: '',
  271. BuildUnit: '',
  272. BuildOwner: '',
  273. BuildTelphone: '',
  274. SuperviseUnit: '',
  275. SuperviseOwner: '',
  276. SuperviseTelphone: '',
  277. QualityUnit: '',
  278. QualityOwner: '',
  279. QualityTelphone: '',
  280. Remark: '',
  281. IsDelete: '',
  282. CreateOn: '',
  283. CreateUserId: '',
  284. CreateBy: '',
  285. ModifiedOn: '',
  286. ModifiedUserId: '',
  287. ModifiedBy: '',
  288. },
  289. tableColumns: [
  290. {
  291. prop: "Status",
  292. label: '状态',
  293. width: 100,
  294. sort: true
  295. },
  296. // {
  297. // prop: "SupplierId",
  298. // label: '评价单位',
  299. // width: 100,
  300. // sort: true
  301. // },
  302. {
  303. prop: "SupplierName",
  304. label: '企业名称',
  305. width: 100,
  306. sort: true
  307. },
  308. {
  309. prop: "ProjectName",
  310. label: '项目名称',
  311. width: 100,
  312. sort: true
  313. },
  314. {
  315. prop: "ContractNo",
  316. label: '合同编号',
  317. width: 100,
  318. sort: true
  319. },
  320. {
  321. prop: "ProjectPlace",
  322. label: '工程地点',
  323. width: 100,
  324. sort: true
  325. },
  326. {
  327. prop: "ProjectOwner",
  328. label: '项目负责人',
  329. width: 100,
  330. sort: true
  331. },
  332. {
  333. prop: "Telephone",
  334. label: '联系人电话',
  335. width: 100,
  336. sort: true
  337. },
  338. {
  339. prop: "ProjectType",
  340. label: '项目类别',
  341. width: 100,
  342. sort: true
  343. },
  344. // {
  345. // prop: "ContractMode",
  346. // label: '合同模式',
  347. // width: 100,
  348. // sort: true
  349. // },
  350. {
  351. prop: "Amount",
  352. label: '合同总金额(万元)',
  353. width: 100,
  354. sort: true
  355. },
  356. {
  357. prop: "ContractPeriod",
  358. label: '合同总工期(天)',
  359. width: 100,
  360. sort: true
  361. },
  362. {
  363. prop: "OpenDate",
  364. label: '开工日期',
  365. width: 100,
  366. sort: true
  367. },
  368. {
  369. prop: "PlanFinishDate",
  370. label: '计划竣工时间',
  371. width: 100,
  372. sort: true
  373. },
  374. ]
  375. }
  376. },
  377. created() {
  378. //查询条件初始值备份
  379. Object.assign(this.searchFormReset, this.searchForm);
  380. //查询列表
  381. this.initDatas();
  382. //this.getDictOptions()
  383. this.statusFun()
  384. // console.log(8888888,localStorage.getItem('userRoleids'))
  385. // if(localStorage.getItem('userRoleids')!=''&&localStorage.getItem('userRoleids')!=undefined){
  386. // this.userRoleids = localStorage.getItem('userRoleids').indexOf('10000221')
  387. // console.log(8888888,this.userRoleids)
  388. // }else{
  389. // this.userRoleids = -1
  390. // }
  391. },
  392. methods: {
  393. //一键处理
  394. onSelectAll(e){
  395. console.log(e)
  396. var list = []
  397. e.map((item,index) => {
  398. list.push(item.Id)
  399. })
  400. this.eveIdList = String(list)
  401. },
  402. //筛选
  403. selectableFun(row,index){
  404. if(row.Status==4){
  405. return true;
  406. }else{
  407. return false;
  408. }
  409. },
  410. //一键处理按钮
  411. onSelectAllButton(){
  412. this.selectAllButtonBoolean = true
  413. },
  414. //一键处理确定
  415. onSelectAllButtonTrue(){
  416. if(this.eveIdList!=''&&this.eveIdList!=undefined){
  417. this.$refs.submitpopup.dialogCommonAuditMakeSureVisible = true
  418. }else{
  419. this.$message({
  420. type: 'warning',
  421. message: '请选择评价'
  422. });
  423. }
  424. },
  425. //一键处理取消
  426. onSelectAllButtonDelete(){
  427. this.selectAllButtonBoolean = false
  428. },
  429. //状态判断
  430. statusFun(){
  431. // 一键处理权限
  432. var data = {
  433. percode:'oil_contract.Review.Batch',
  434. }
  435. permissionApi.permissionIsauth(data, this.$axios).then(res => {
  436. console.log('一键处理权限权限',res.data)
  437. if(res.data.code==0){
  438. if(res.data.message=='有权限'){
  439. this.userSelectBoolean = true
  440. }
  441. }
  442. }).catch(err => {
  443. console.error(err)
  444. })
  445. var data = {
  446. percode:'oil_contract.Review.Delete',
  447. }
  448. permissionApi.permissionIsauth(data, this.$axios).then(res => {
  449. console.log('权限',res.data)
  450. if(res.data.code==0){
  451. if(res.data.message=='有权限'){
  452. this.deleteBoolean = true
  453. }
  454. }
  455. }).catch(err => {
  456. console.error(err)
  457. })
  458. var data = {
  459. percode:'oil_contract.Review.Edit',
  460. }
  461. permissionApi.permissionIsauth(data, this.$axios).then(res => {
  462. console.log('权限',res.data)
  463. if(res.data.code==0){
  464. if(res.data.message=='有权限'){
  465. this.editeBoolean = true
  466. }
  467. }
  468. }).catch(err => {
  469. console.error(err)
  470. })
  471. },
  472. //跳转评价
  473. onNavigateEvaluate(item){
  474. console.log('跳转',item)
  475. this.$router.push({
  476. path:'/oilcontract/contract-basis/' + item.Id + '/evaluate',
  477. query:{
  478. item:item,
  479. type:2,
  480. }
  481. })
  482. },
  483. initDatas() {
  484. //分页及列表条件
  485. let params = {
  486. _currentPage: this.currentPage,
  487. _size: this.size,
  488. Order: this.Column.Order,
  489. Prop: this.Column.Prop,
  490. ContractClass:'02',
  491. }
  492. // <el-option label="物资类" value="01" key="01"></el-option>
  493. // <el-option label="基建类" value="02" key="02"></el-option>
  494. // <el-option label="技术服务" value="03" key="03"></el-option>
  495. let myCreateOn = []
  496. // 解析时间
  497. if (this.CreateOn.length == 2) {
  498. this.CreateOn[1].setHours(23)
  499. this.CreateOn[1].setMinutes(59)
  500. this.CreateOn[1].setSeconds(59)
  501. myCreateOn.push(this.formatDateTime(this.CreateOn[0]))
  502. myCreateOn.push(this.formatDateTime(this.CreateOn[1]))
  503. }
  504. //查询条件
  505. Object.assign(params, this.searchForm)
  506. //访问接口
  507. api.getReviewList(myCreateOn.join(','), params, this.$axios).then(res => {
  508. console.log('评价接口',res)
  509. this.entityList = res.data.items
  510. this.currentItemCount = res.data.currentItemCount
  511. }).catch(err => {
  512. console.error(err)
  513. })
  514. },
  515. getDictOptions() {
  516. api.getDictList(this.$axios).then(res => {
  517. //this.dictOptions.customerList = res.data.items['customerList']
  518. //this.dictOptions.projectList = res.data.items['projectList']
  519. }).catch(err => {
  520. console.error(err)
  521. })
  522. },
  523. searchCommand(command) {
  524. if (command == 'search') {
  525. this.dialogVisible = true
  526. } else if (command == 'clear') {
  527. this.clearSearch()
  528. }
  529. },
  530. //列表排序功能
  531. orderby(column) {
  532. if (column.order == 'ascending') {
  533. this.Column.Order = 'asc'
  534. } else if (column.order == 'descending') {
  535. this.Column.Order = 'desc'
  536. }
  537. this.Column.Prop = column.prop
  538. this.initDatas()
  539. },
  540. clearSearch() {
  541. Object.assign(this.searchForm, this.searchFormReset);
  542. //this.searchForm = this.searchFormReset;
  543. this.CreateOn = ''
  544. this.initDatas()
  545. },
  546. handleSearch() {
  547. this.currentPage = 1;
  548. this.dialogVisible = false;
  549. this.initDatas();
  550. },
  551. handleCurrentChange(value) {
  552. this.currentPage = value
  553. this.initDatas()
  554. },
  555. handleSizeChange(value) {
  556. this.size = value
  557. this.currentPage = 1
  558. this.initDatas()
  559. },
  560. deleteEntity(row,index) {
  561. this.$refs['popover-' + `${index}`].doClose()
  562. apiReview.deleteEntity(row.Id, this.$axios).then(res => {
  563. if (res.data.code === 0) {
  564. this.initDatas();
  565. this.$message({
  566. type: 'success',
  567. message: res.data.message
  568. });
  569. } else {
  570. this.$message({
  571. type: 'warning',
  572. message: res.data.message
  573. });
  574. }
  575. }).catch(err => {
  576. console.error(err)
  577. });
  578. },
  579. jstimehandle(val) {
  580. if (val === '') {
  581. return '----'
  582. } else if (val === '0001-01-01T08:00:00+08:00') {
  583. return '----'
  584. } else if (val === '5000-01-01T23:59:59+08:00') {
  585. return '永久'
  586. } else {
  587. val = val.replace('T', ' ')
  588. return val.substring(0, 10)
  589. }
  590. },
  591. exportExcel () {
  592. /* generate workbook object from table */
  593. let wb = XLSX.utils.table_to_book(
  594. document.querySelector('#rebateSetTable')
  595. )
  596. /* get binary string as output */
  597. let wbout = XLSX.write(wb, {
  598. bookType: 'xlsx',
  599. bookSST: true,
  600. type: 'array'
  601. })
  602. try {
  603. FileSaver.saveAs(
  604. new Blob([wbout], {
  605. type: 'application/octet-stream'
  606. }),
  607. 'SupplierUsedName.xlsx'
  608. )
  609. } catch (e) {
  610. if (typeof console !== 'undefined') console.log(e, wbout)
  611. }
  612. return wbout
  613. },
  614. formatDateTime(date) {
  615. var y = date.getFullYear();
  616. var m = date.getMonth() + 1;
  617. m = m < 10 ? ('0' + m) : m;
  618. var d = date.getDate();
  619. d = d < 10 ? ('0' + d) : d;
  620. var h = date.getHours();
  621. var minute = date.getMinutes();
  622. minute = minute < 10 ? ('0' + minute) : minute;
  623. return y + '-' + m + '-' + d + ' ' + h + ':' + minute;
  624. }
  625. }
  626. }
  627. </script>
  628. <style lang="scss">
  629. .el-pagination {
  630. margin: 1rem 0 2rem;
  631. text-align: right;
  632. }
  633. </style>