work.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. <!-- 我的工作台 -->
  2. <template>
  3. <div class="works">
  4. <el-form :inline="true" :model="dataForm" @keyup.enter.native="queryData()">
  5. <el-form-item label="状态">
  6. <el-select
  7. v-model="dataForm.state"
  8. remote
  9. placeholder="请选择">
  10. <el-option
  11. v-for="item in optionsState"
  12. :key="item.code"
  13. :label="item.value"
  14. :value="item.code">
  15. </el-option>
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item>
  19. <el-button @click="queryData()">查询</el-button>
  20. </el-form-item>
  21. </el-form>
  22. <el-table
  23. :data="dataList"
  24. border
  25. v-loading="dataListLoading"
  26. style="width: 100%;">
  27. <el-table-column
  28. label="序号"
  29. type="index"
  30. width="50"
  31. align="center">
  32. </el-table-column>
  33. <el-table-column
  34. prop="taskName"
  35. header-align="center"
  36. align="center"
  37. min-width="140"
  38. :show-tooltip-when-overflow="true"
  39. label="任务名称">
  40. </el-table-column>
  41. <el-table-column
  42. v-if="showProgress"
  43. prop="completeNum"
  44. header-align="center"
  45. align="center"
  46. min-width="160"
  47. label="任务进度">
  48. <template slot-scope="scope">
  49. <el-progress :percentage="getPercentage(scope.row.completeNum, scope.row.totalNum)"></el-progress>
  50. </template>
  51. </el-table-column>
  52. <el-table-column
  53. prop="endTime"
  54. header-align="center"
  55. align="center"
  56. min-width="160"
  57. label="规定完成时间">
  58. </el-table-column>
  59. <el-table-column
  60. prop="nodeName"
  61. header-align="center"
  62. align="center"
  63. min-width="160"
  64. :show-tooltip-when-overflow="true"
  65. label="工序内容">
  66. </el-table-column>
  67. <el-table-column
  68. prop="require"
  69. header-align="center"
  70. align="center"
  71. min-width="160"
  72. :show-tooltip-when-overflow="true"
  73. label="工序要求">
  74. </el-table-column>
  75. <el-table-column
  76. prop="explain"
  77. header-align="center"
  78. align="center"
  79. min-width="160"
  80. :show-tooltip-when-overflow="true"
  81. label="工序说明">
  82. </el-table-column>
  83. <el-table-column
  84. header-align="center"
  85. align="center"
  86. min-width="160"
  87. :show-tooltip-when-overflow="true"
  88. label="工序附件">
  89. <template slot-scope="scope">
  90. <li v-for="(item, index) in scope.row.attachList" :key="index"><a @click="previewFile(item.url)">{{item.fileName}}</a></li>
  91. </template>
  92. </el-table-column>
  93. <el-table-column
  94. v-if="dataForm.state !== '3'"
  95. fixed="right"
  96. header-align="center"
  97. align="center"
  98. width="180"
  99. label="操作">
  100. <template slot-scope="scope">
  101. <el-button v-if="isAuth('work:clt:start') && (scope.row.state == 0 || scope.row.state == 1)" :disabled="scope.row.state == 0" type="text" size="small" @click="startTask(scope.row.taskId)">开始</el-button>
  102. <el-button v-if="isAuth('work:clt:complete') && scope.row.state != 3" type="text" size="small" @click="transferTask(scope.row.taskId, scope.row.workTypeId)">移交</el-button>
  103. <el-button v-if="isAuth('work:clt:complete') && scope.row.state == 2 && (scope.row.nodeType == null || scope.row.nodeType == 'start' || scope.row.nodeType == 'produce')" type="text" size="small" @click="completeTask(scope.row.taskId)">完成</el-button>
  104. <el-button v-if="isAuth('work:clt:complete') && scope.row.state == 2 && (scope.row.nodeType == 'check' || scope.row.nodeType == 't-check')" type="text" size="small" @click="checkTask(scope.row.taskId, 1)">通过</el-button>
  105. <el-button v-if="isAuth('work:clt:complete') && scope.row.state == 2 && (scope.row.nodeType == 'check' || scope.row.nodeType == 't-check')" type="text" size="small" @click="checkTask(scope.row.taskId, 2)">不通过</el-button>
  106. <el-button v-if="isAuth('work:clt:complete') && scope.row.state == 2 && (scope.row.nodeType == null || scope.row.nodeType == 'produce')" type="text" size="small" @click="damageTask(scope.row.nodeId, scope.row.productionId)">操作损坏</el-button>
  107. </template>
  108. </el-table-column>
  109. </el-table>
  110. <el-pagination
  111. @size-change="sizeChangeHandle"
  112. @current-change="currentChangeHandle"
  113. :current-page="pageIndex"
  114. :page-sizes="[10, 20, 50, 100]"
  115. :page-size="pageSize"
  116. :total="totalPage"
  117. layout="total, sizes, prev, pager, next, jumper">
  118. </el-pagination>
  119. <el-dialog title="移交任务" width="30%" :visible.sync="transferDialogFormVisible">
  120. <el-form :model="transferDialogForm" :rules="transferDialogFormRules" ref="transferDialogForm">
  121. <!-- <el-form-item label="检验类型" prop="checkType" label-width="120px">
  122. <el-select v-model="transferDialogForm.checkType" placeholder="请选择检验类型">
  123. <el-option label="通过" value="1"></el-option>
  124. <el-option label="不通过" value="2"></el-option>
  125. </el-select>
  126. </el-form-item> -->
  127. <el-form-item label="移交类型" prop="transferType" label-width="120px">
  128. <el-select v-model="transferDialogForm.transferType" placeholder="请选择移交类型">
  129. <el-option label="工作移交" value="1"></el-option>
  130. </el-select>
  131. </el-form-item>
  132. <el-form-item label="移交用户" prop="transferUserId" label-width="120px">
  133. <el-select v-model="transferDialogForm.transferUserId" placeholder="请选择移交用户">
  134. <el-option
  135. v-for="item in transferUserList"
  136. :key="item.userId"
  137. :label="item.name"
  138. :value="item.userId">
  139. </el-option>
  140. </el-select>
  141. </el-form-item>
  142. <el-form-item label="移交说明" prop="transferExplain" label-width="120px">
  143. <el-input v-model="transferDialogForm.transferExplain" placeholder="请输入"></el-input>
  144. </el-form-item>
  145. </el-form>
  146. <div slot="footer" class="dialog-footer">
  147. <el-button @click="transferDialogFormVisible = false">取 消</el-button>
  148. <el-button type="primary" @click="transferSubmit">确 定</el-button>
  149. </div>
  150. </el-dialog>
  151. <el-dialog title="检验任务" width="30%" :visible.sync="checkDialogFormVisible">
  152. <el-form :model="checkDialogForm" :rules="checkDialogFormRules" ref="checkDialogForm">
  153. <el-form-item label="检验类型" prop="checkType" label-width="80px">
  154. <el-select v-model="checkDialogForm.checkType" placeholder="请选择检验类型" style="width:100%">
  155. <el-option label="返回上一级" value="2"></el-option>
  156. <el-option label="报损" value="3"></el-option>
  157. </el-select>
  158. </el-form-item>
  159. <el-form-item label="备注" prop="notes" label-width="80px">
  160. <el-input v-model="checkDialogForm.notes" type="textarea" :rows="2" placeholder="请输入备注"></el-input>
  161. </el-form-item>
  162. </el-form>
  163. <div slot="footer" class="dialog-footer">
  164. <el-button @click="checkDialogFormVisible = false">取 消</el-button>
  165. <el-button type="primary" @click="checkSubmit">确 定</el-button>
  166. </div>
  167. </el-dialog>
  168. <el-dialog title="操作损坏" width="30%" :visible.sync="damageDialogFormVisible">
  169. <el-form :model="damageDialogForm" :rules="damageDialogFormRules" ref="damageDialogForm">
  170. <el-form-item label="损坏原因" prop="damageReason" label-width="80px">
  171. <el-input v-model="damageDialogForm.damageReason" type="textarea" :rows="2" placeholder="请输入"></el-input>
  172. </el-form-item>
  173. </el-form>
  174. <div slot="footer" class="dialog-footer">
  175. <el-button @click="damageDialogFormVisible = false">取 消</el-button>
  176. <el-button type="primary" @click="damageSubmit">确 定</el-button>
  177. </div>
  178. </el-dialog>
  179. </div>
  180. </template>
  181. <script>
  182. import { getTaskList, startTask, transferTask, completeTask, checkTask, damageTask } from '@/api/task'
  183. import { workTypeMasterList } from '@/api/worktype'
  184. import templateList from '../warehouse/template-list'
  185. import { downloadUrl } from '@/api/file'
  186. export default {
  187. components: { templateList },
  188. name: 'work',
  189. data () {
  190. return {
  191. addOrUpdateVisible: false,
  192. dataForm: {
  193. state: '1'
  194. },
  195. dataList: [],
  196. pageIndex: 1,
  197. pageSize: 10,
  198. totalPage: 0,
  199. dataListLoading: false,
  200. dataListSelections: [],
  201. optionsState: [
  202. {
  203. code: '1', value: '未完成'
  204. },
  205. {
  206. code: '2', value: '待操作'
  207. },
  208. {
  209. code: '3', value: '已完成'
  210. }
  211. ],
  212. transferDialogFormVisible: false,
  213. transferDialogForm: {},
  214. transferUserList: [],
  215. transferDialogFormRules: {
  216. transferType: [{required: true, message: '请选择移交类型', trigger: 'blur'}],
  217. transferUserId: [{required: true, message: '请选择移交用户', trigger: 'blur'}]
  218. },
  219. checkDialogFormVisible: false,
  220. checkDialogForm: {
  221. checkType: '',
  222. notes: ''
  223. },
  224. checkDialogFormRules: {
  225. checkType: [{required: true, message: '请选择', trigger: 'blur'}]
  226. },
  227. damageDialogFormVisible: false,
  228. damageDialogForm: {},
  229. damageDialogFormRules: {
  230. damageReason: [{required: true, message: '请输入', trigger: 'blur'}]
  231. },
  232. // 是否显示进度条列
  233. showProgress: true
  234. }
  235. },
  236. created () {
  237. this.getDataList()
  238. },
  239. methods: {
  240. // 查询
  241. queryData () {
  242. this.pageIndex = 1
  243. this.showProgress = this.dataForm.state !== '2'
  244. this.getDataList()
  245. },
  246. // 获取数据列表
  247. getDataList () {
  248. this.dataListLoading = true
  249. let params = {
  250. 'current': this.pageIndex,
  251. 'size': this.pageSize,
  252. 'state': this.dataForm.state
  253. }
  254. getTaskList(params).then(({data}) => {
  255. if (data && data.code === '200') {
  256. this.dataList = data.data.records
  257. this.totalPage = Number(data.data.total)
  258. } else {
  259. this.dataList = []
  260. this.totalPage = 0
  261. }
  262. this.dataListLoading = false
  263. })
  264. },
  265. // 每页数
  266. sizeChangeHandle (val) {
  267. this.pageSize = val
  268. this.pageIndex = 1
  269. this.getDataList()
  270. },
  271. // 当前页
  272. currentChangeHandle (val) {
  273. this.pageIndex = val
  274. this.getDataList()
  275. },
  276. // 多选
  277. selectionChangeHandle (val) {
  278. this.dataListSelections = val
  279. },
  280. // 开始
  281. startTask (taskId) {
  282. this.$confirm('是否开始任务?', '提示', {
  283. confirmButtonText: '确定',
  284. cancelButtonText: '取消',
  285. type: 'warning'
  286. }).then(() => {
  287. startTask({taskId}).then(({data}) => {
  288. if (data && data.code === '200') {
  289. this.$message({
  290. type: 'success',
  291. message: '操作成功!'
  292. })
  293. this.getDataList()
  294. } else {
  295. this.$message({
  296. type: 'error',
  297. message: data.msg
  298. })
  299. }
  300. })
  301. }).catch(() => {
  302. this.$message({
  303. type: 'info',
  304. message: '已取消'
  305. })
  306. })
  307. },
  308. // 移交
  309. transferTask (taskId, workTypeId) {
  310. this.transferDialogFormVisible = true
  311. this.transferDialogForm.taskId = taskId
  312. workTypeMasterList(workTypeId).then(({data}) => {
  313. if (data && data.code === '200') {
  314. this.transferUserList = data.data
  315. }
  316. })
  317. },
  318. // 确认移交
  319. transferSubmit () {
  320. this.$refs['transferDialogForm'].validate((valid) => {
  321. if (valid) {
  322. transferTask(this.transferDialogForm).then(({data}) => {
  323. if (data && data.code === '200') {
  324. this.$message({
  325. type: 'success',
  326. message: '移交成功!'
  327. })
  328. this.transferDialogFormVisible = false
  329. this.getDataList()
  330. } else {
  331. this.$message({
  332. type: 'error',
  333. message: data.msg
  334. })
  335. }
  336. })
  337. }
  338. })
  339. },
  340. // 完成
  341. completeTask (taskId) {
  342. this.$confirm('是否完成任务?', '提示', {
  343. confirmButtonText: '确定',
  344. cancelButtonText: '取消',
  345. type: 'warning'
  346. }).then(() => {
  347. completeTask({taskId}).then(({data}) => {
  348. if (data && data.code === '200') {
  349. this.$message({
  350. type: 'success',
  351. message: '操作成功!'
  352. })
  353. this.getDataList()
  354. } else {
  355. this.$message({
  356. type: 'error',
  357. message: data.msg
  358. })
  359. }
  360. })
  361. }).catch(() => {
  362. this.$message({
  363. type: 'info',
  364. message: '已取消'
  365. })
  366. })
  367. },
  368. // 检验
  369. checkTask (taskId, checkType) {
  370. this.checkDialogForm.taskId = taskId
  371. if (checkType === 1) {
  372. this.checkDialogForm.checkType = checkType
  373. this.passTask()
  374. } else {
  375. this.checkDialogForm.checkType = null
  376. this.refuseTask()
  377. }
  378. },
  379. // 通过
  380. passTask () {
  381. this.$confirm('是否完成任务?', '提示', {
  382. confirmButtonText: '确定',
  383. cancelButtonText: '取消',
  384. type: 'warning'
  385. }).then(() => {
  386. let submitData = this.checkDialogForm
  387. checkTask(submitData).then(({data}) => {
  388. if (data && data.code === '200') {
  389. this.$message({
  390. type: 'success',
  391. message: '移交成功!'
  392. })
  393. this.checkDialogFormVisible = false
  394. this.getDataList()
  395. } else {
  396. this.$message({
  397. type: 'error',
  398. message: data.msg
  399. })
  400. }
  401. })
  402. }).catch(() => {
  403. this.$message({
  404. type: 'info',
  405. message: '已取消'
  406. })
  407. })
  408. },
  409. refuseTask () {
  410. this.checkDialogFormVisible = true
  411. },
  412. // 不通过
  413. // 确认检验
  414. checkSubmit () {
  415. this.$refs['checkDialogForm'].validate((valid) => {
  416. if (valid) {
  417. let submitData = this.checkDialogForm
  418. checkTask(submitData).then(({data}) => {
  419. if (data && data.code === '200') {
  420. this.$message({
  421. type: 'success',
  422. message: '检验成功!'
  423. })
  424. this.checkDialogFormVisible = false
  425. this.getDataList()
  426. } else {
  427. this.$message({
  428. type: 'error',
  429. message: data.msg
  430. })
  431. }
  432. })
  433. }
  434. })
  435. },
  436. // 操作损坏
  437. damageTask (nodeId, productionId) {
  438. this.damageDialogFormVisible = true
  439. this.damageDialogForm.nodeId = nodeId
  440. this.damageDialogForm.productionId = productionId
  441. },
  442. // 确认操作损坏
  443. damageSubmit () {
  444. this.$refs['damageDialogForm'].validate((valid) => {
  445. if (valid) {
  446. let submitData = this.damageDialogForm
  447. damageTask(submitData).then(({data}) => {
  448. if (data && data.code === '200') {
  449. this.$message({
  450. type: 'success',
  451. message: '操作成功!'
  452. })
  453. this.damageDialogFormVisible = false
  454. this.getDataList()
  455. } else {
  456. this.$message({
  457. type: 'error',
  458. message: data.msg
  459. })
  460. }
  461. })
  462. }
  463. })
  464. },
  465. // 预览
  466. previewFile (url) {
  467. // 弹出新页面显示下载文件
  468. window.open(downloadUrl + url, '_blank')
  469. },
  470. // 计算进度百分比,返回0到100的整数
  471. getPercentage (completeNum, totalNum) {
  472. completeNum = completeNum == null ? 0 : parseInt(completeNum)
  473. totalNum = totalNum == null ? 100 : parseInt(totalNum)
  474. if (totalNum === 0) {
  475. return 100
  476. }
  477. return (completeNum / totalNum).toFixed(2) * 100
  478. }
  479. }
  480. }
  481. </script>
  482. <style scoped>
  483. li {list-style-type:none;}
  484. </style>