progress.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. <template>
  2. <div class="list-container">
  3. <vab-query-form>
  4. <vab-query-form-top-panel>
  5. <el-form ref="queryForm" :inline="true" :model="queryForm" @submit.native.prevent>
  6. <el-form-item prop="progressTitle">
  7. <el-input v-model="queryForm.progressTitle" placeholder="任务标题" @keyup.enter.native="restFetchData" />
  8. </el-form-item>
  9. <el-form-item prop="progressType">
  10. <el-select
  11. v-model="queryForm.progressType"
  12. clearable
  13. placeholder="任务类型"
  14. style="width: 100%"
  15. @keyup.enter.native="restFetchData">
  16. <el-option label="发货任务单" value="10" />
  17. <el-option label="组装任务单" value="20" />
  18. <el-option label="部署安装单" value="30" />
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item prop="progressStatus">
  22. <el-select
  23. v-model="queryForm.progressStatus"
  24. clearable
  25. placeholder="任务状态"
  26. style="width: 100%"
  27. @keyup.enter.native="restFetchData">
  28. <el-option label="未开始" value="10" />
  29. <el-option label="进行中" value="20" />
  30. <el-option label="已完成" value="30" />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item>
  34. <el-button icon="el-icon-search" type="primary" @click="restFetchData">查询</el-button>
  35. <el-button icon="el-icon-refresh-right" @click="reset">重置</el-button>
  36. </el-form-item>
  37. </el-form>
  38. </vab-query-form-top-panel>
  39. <vab-query-form-left-panel :span="12" />
  40. <vab-query-form-right-panel :span="12">
  41. <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="ProgressTable" />
  42. </vab-query-form-right-panel>
  43. </vab-query-form>
  44. <el-table ref="table" v-loading="listLoading" border :data="list" :height="$baseTableHeight(2)">
  45. <el-table-column align="center" label="序号" show-overflow-tooltip width="80">
  46. <template #default="{ $index }">
  47. {{ $index + 1 }}
  48. </template>
  49. </el-table-column>
  50. <el-table-column
  51. v-for="(item, index) in showColumns"
  52. :key="index"
  53. align="center"
  54. :label="item.label"
  55. :min-width="item.minWidth"
  56. :prop="item.prop"
  57. show-overflow-tooltip
  58. :sortable="item.sortable"
  59. :width="item.width">
  60. <template #default="{ row }">
  61. <el-button
  62. v-if="item.prop === 'progressTitle'"
  63. style="font-size: 14px"
  64. type="text"
  65. @click="handleWorkDetail(row)">
  66. {{ row.progressTitle }}
  67. </el-button>
  68. <span v-else-if="item.prop === 'progressLevel'">
  69. <el-select
  70. v-model="row.progressLevel"
  71. :disabled="row.progressStatus == 30"
  72. placeholder="请选择"
  73. @change="changeprogressLevel($event, row)">
  74. <el-option label="最高" value="10" />
  75. <el-option label="普通" value="20" />
  76. <el-option label="较低" value="30" />
  77. </el-select>
  78. </span>
  79. <span v-else-if="item.prop === 'progressStatus'">
  80. {{ progressStatusObj[row.progressStatus] }}
  81. </span>
  82. <span v-else-if="item.prop === 'startDate'">
  83. {{ parseTime(row.startDate, '{y}-{m}-{d}') }}
  84. </span>
  85. <span v-else-if="item.prop === 'endDate'">
  86. {{ parseTime(row.endDate, '{y}-{m}-{d}') }}
  87. </span>
  88. <span v-else-if="item.prop === 'reaStartDate'">
  89. {{ parseTime(row.reaStartDate, '{y}-{m}-{d}') }}
  90. </span>
  91. <span v-else-if="item.prop === 'reaEndDate'">
  92. {{ parseTime(row.reaEndDate, '{y}-{m}-{d}') }}
  93. </span>
  94. <span v-else-if="item.prop == 'progressType'">
  95. {{ getProgressType(row.progressType) }}
  96. </span>
  97. <span v-else>{{ row[item.prop] }}</span>
  98. </template>
  99. </el-table-column>
  100. <el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="120">
  101. <template #default="{ row }">
  102. <el-button v-if="row.progressStatus != 30" type="text" @click="handleWorkEdit(row)">编辑</el-button>
  103. <el-button
  104. v-if="row.progressStatus == 10 && userId == row.principalPersonId"
  105. type="text"
  106. @click="handleStartWork(row)">
  107. 开始
  108. </el-button>
  109. <el-button
  110. v-if="
  111. row.progressStatus == 20 &&
  112. row.deliverStatus == '20' &&
  113. row.progressType == '10' &&
  114. userId == row.principalPersonId
  115. "
  116. type="text"
  117. @click="handleDeliverGoods(row)">
  118. 发货
  119. </el-button>
  120. <!-- <el-button
  121. v-if="row.progressStatus == 20 && row.deliverStatus == '30' && row.progressType == '10' && userId == saleId"
  122. type="text"
  123. @click="handleInspectGoods(row)">
  124. 验收
  125. </el-button> -->
  126. <el-button
  127. v-if="
  128. row.progressStatus == 20 &&
  129. row.deliverStatus == '40' &&
  130. row.progressType == '10' &&
  131. userId == row.principalPersonId
  132. "
  133. type="text"
  134. @click="handleConfirmArrival(row)">
  135. 确认到货
  136. </el-button>
  137. <el-button
  138. v-if="row.progressStatus == 20 && row.progressType == '' && userId == row.principalPersonId"
  139. type="text"
  140. @click="handleFinishWork(row)">
  141. 完成
  142. </el-button>
  143. <el-button
  144. v-if="
  145. row.progressStatus == 20 &&
  146. row.deliverStatus == '60' &&
  147. row.progressType == '10' &&
  148. userId == row.principalPersonId
  149. "
  150. type="text"
  151. @click="handleFinishWork(row)">
  152. 完成
  153. </el-button>
  154. <el-button
  155. v-if="row.progressStatus == 20 && row.progressType == '20' && userId == row.principalPersonId"
  156. type="text"
  157. @click="handleComplete(row)">
  158. 完成
  159. </el-button>
  160. <el-button
  161. v-if="row.progressStatus == 20 && row.progressType == '30' && userId == row.principalPersonId"
  162. type="text"
  163. @click="handleComplete(row)">
  164. 完成
  165. </el-button>
  166. <!-- <el-button v-show="row.progressStatus == 10" type="text" @click="handleDelete(row)">删除</el-button> -->
  167. </template>
  168. </el-table-column>
  169. <template #empty>
  170. <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
  171. </template>
  172. </el-table>
  173. <el-pagination
  174. background
  175. :current-page="queryForm.pageNum"
  176. :layout="layout"
  177. :page-size="queryForm.pageSize"
  178. :total="total"
  179. @current-change="handleCurrentChange"
  180. @size-change="handleSizeChange" />
  181. <!-- 完成 -->
  182. <completeProgress ref="complete" @fetch-data="fetchData" />
  183. <!-- 发货 -->
  184. <deliver ref="deliver" @fetch-data="fetchData" />
  185. <!-- 验收 -->
  186. <inspect ref="inspect" @fetch-data="fetchData" />
  187. <!-- 编辑 -->
  188. <edit-work ref="editWork" @fetch-data="fetchData" />
  189. <!-- 详情 -->
  190. <detailWork ref="detailWork" />
  191. </div>
  192. </template>
  193. <script>
  194. import to from 'await-to-js'
  195. import TableTool from '@/components/table/TableTool'
  196. import deliverWorkApi from '@/api/work/deliverWork'
  197. import { mapGetters } from 'vuex'
  198. import completeProgress from '@/views/work/deliver/components/completeProgress'
  199. import deliver from '@/views/work/deliver/components/deliver'
  200. import inspect from '@/views/work/deliver/components/inspect'
  201. import EditWork from '@/views/work/deliver/components/editWork'
  202. import detailWork from '@/views/work/deliver/components/detailWork'
  203. export default {
  204. name: 'Progress',
  205. components: { TableTool, completeProgress, deliver, inspect, EditWork, detailWork },
  206. data() {
  207. return {
  208. progressStatusObj: {
  209. 10: '未开始',
  210. 20: '进行中',
  211. 30: '已完成',
  212. },
  213. layout: 'total, sizes, prev, pager, next, jumper',
  214. queryForm: {
  215. progressTitle: '',
  216. progressType: '',
  217. progressStatus: '',
  218. pageNum: 1,
  219. pageSize: 10,
  220. isPrincipalPerson: '1',
  221. },
  222. total: 0,
  223. listLoading: false,
  224. list: [],
  225. showColumns: [],
  226. columns: [
  227. {
  228. label: '任务标题',
  229. width: '160px',
  230. prop: 'progressTitle',
  231. sortable: false,
  232. disableCheck: true,
  233. },
  234. {
  235. label: '任务类型',
  236. width: '120px',
  237. prop: 'progressType',
  238. sortable: false,
  239. },
  240. // {
  241. // label: '任务内容',
  242. // prop: 'progressContext',
  243. // minWidth: 'auto',
  244. // sortable: false,
  245. // disableCheck: true,
  246. // },
  247. {
  248. label: '优先级',
  249. width: '120px',
  250. prop: 'progressLevel',
  251. sortable: false,
  252. },
  253. {
  254. label: '负责人',
  255. width: '120px',
  256. prop: 'principalPerson',
  257. sortable: false,
  258. },
  259. {
  260. label: '状态',
  261. width: '120px',
  262. prop: 'progressStatus',
  263. sortable: false,
  264. },
  265. {
  266. label: '计划开始时间',
  267. width: '160px',
  268. prop: 'startDate',
  269. sortable: false,
  270. },
  271. {
  272. label: '计划结束时间',
  273. width: '160px',
  274. prop: 'endDate',
  275. sortable: false,
  276. },
  277. {
  278. label: '实际开始时间',
  279. width: '160px',
  280. prop: 'reaStartDate',
  281. sortable: false,
  282. },
  283. {
  284. label: '实际结束时间',
  285. width: '160px',
  286. prop: 'reaEndDate',
  287. sortable: false,
  288. },
  289. {
  290. label: '备注',
  291. width: 'auto',
  292. prop: 'remark',
  293. sortable: false,
  294. },
  295. ],
  296. }
  297. },
  298. computed: {
  299. ...mapGetters({
  300. userId: 'user/id',
  301. }),
  302. },
  303. watch: {
  304. showColumns: function () {
  305. this.$nextTick(() => this.$refs.table.doLayout())
  306. },
  307. },
  308. activated() {
  309. this.fetchData()
  310. },
  311. mounted() {
  312. this.fetchData()
  313. },
  314. methods: {
  315. restFetchData() {
  316. this.queryForm.pageNum = 1
  317. this.fetchData()
  318. },
  319. async fetchData() {
  320. this.listLoading = true
  321. const params = { ...this.queryForm }
  322. params.isPage = '1'
  323. const [err, res] = await to(deliverWorkApi.list({ ...params }))
  324. this.listLoading = false
  325. if (err) return (this.listLoading = false)
  326. if (res.code == 200 && res.data) {
  327. this.list = res.data.list || []
  328. this.total = res.data.total
  329. }
  330. this.$nextTick(() => this.$refs.table.doLayout())
  331. },
  332. reset() {
  333. this.queryForm = {
  334. progressTitle: '',
  335. progressType: '',
  336. progressStatus: '',
  337. pageNum: 1,
  338. pageSize: 10,
  339. isPrincipalPerson: '1',
  340. }
  341. this.fetchData()
  342. },
  343. handleSizeChange(val) {
  344. this.queryForm.pageSize = val
  345. this.fetchData()
  346. },
  347. handleCurrentChange(val) {
  348. this.queryForm.pageNum = val
  349. this.fetchData()
  350. },
  351. //工作项详情
  352. handleWorkEdit(row) {
  353. this.$refs['editWork'].open(row.planId, row.deliverOrderId, '', row.progressStatus != 30, row)
  354. },
  355. //工作项详情
  356. handleWorkDetail(row) {
  357. this.$refs['detailWork'].open(row.planId, row.deliverOrderId, row)
  358. },
  359. // 获取任务类型
  360. getProgressType(type) {
  361. if (type == '') {
  362. return '软件任务单'
  363. } else if (type == '10') {
  364. return '发货任务单'
  365. } else if (type == '20') {
  366. return '组装任务单'
  367. } else if (type == '30') {
  368. return '部署安装单'
  369. }
  370. return '未知类型'
  371. },
  372. // 开始工作项
  373. async handleStartWork(row) {
  374. this.$prompt('你确定要开始当前任务吗', '提示', {
  375. confirmButtonText: '确定',
  376. cancelButtonText: '取消',
  377. })
  378. .then(async ({ value }) => {
  379. // 当用户点击确定按钮时,执行的逻辑
  380. const [err, res] = await to(deliverWorkApi.startWork({ id: row.id, remark: value }))
  381. if (err) return
  382. if (res.code == 200) {
  383. this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
  384. this.fetchData()
  385. }
  386. })
  387. .catch(() => {
  388. // 当用户点击取消按钮时,执行的逻辑
  389. console.log('取消输入')
  390. })
  391. },
  392. // 打开组装完成弹窗
  393. handleComplete(row) {
  394. this.$refs.complete.open(row)
  395. },
  396. // 发货
  397. handleDeliverGoods(row) {
  398. this.$refs.deliver.open(row)
  399. },
  400. // 验收
  401. handleInspectGoods(row) {
  402. this.$refs.inspect.open(row)
  403. },
  404. // 确认到货
  405. async handleConfirmArrival(row) {
  406. this.$prompt('你确定货物已到达吗', '提示', {
  407. confirmButtonText: '确定',
  408. cancelButtonText: '取消',
  409. })
  410. .then(async ({ value }) => {
  411. // 当用户点击确定按钮时,执行的逻辑
  412. const [err, res] = await to(deliverWorkApi.confirmArrival({ id: row.id, remark: value }))
  413. if (err) return
  414. if (res.code == 200) {
  415. this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
  416. this.fetchData()
  417. }
  418. })
  419. .catch(() => {
  420. // 当用户点击取消按钮时,执行的逻辑
  421. console.log('取消输入')
  422. })
  423. },
  424. // 完成工作项
  425. async handleFinishWork(row) {
  426. this.$prompt('你确定要完成当前任务吗', '提示', {
  427. confirmButtonText: '确定',
  428. cancelButtonText: '取消',
  429. })
  430. .then(async ({ value }) => {
  431. // 当用户点击确定按钮时,执行的逻辑
  432. console.log('输入的值为:', value)
  433. const [err, res] = await to(deliverWorkApi.finishWork({ id: row.id, remark: value }))
  434. if (err) return
  435. if (res.code == 200) {
  436. this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
  437. this.fetchData()
  438. }
  439. })
  440. .catch(() => {
  441. // 当用户点击取消按钮时,执行的逻辑
  442. console.log('取消输入')
  443. })
  444. },
  445. handleDelete(row) {
  446. this.$baseConfirm('你确定要删除当前项吗', null, async () => {
  447. const { msg } = await deliverWorkApi.delete({ id: [row.id] })
  448. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  449. await this.fetchData()
  450. })
  451. },
  452. async changeprogressLevel(val, row) {
  453. const params = {
  454. id: row.id,
  455. progressLevel: val,
  456. }
  457. const [err, res] = await to(deliverWorkApi.update(params))
  458. if (err) return
  459. if (res.code == 200) {
  460. this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
  461. }
  462. this.fetchData()
  463. },
  464. },
  465. }
  466. </script>
  467. <style lang="scss" scoped>
  468. $base: '.list';
  469. </style>