work.vue 17 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="140"
  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. fixed="right"
  95. header-align="center"
  96. align="center"
  97. width="180"
  98. label="操作">
  99. <template slot-scope="scope">
  100. <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>
  101. <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>
  102. <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>
  103. <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>
  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, 2)">不通过</el-button>
  105. <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.taskId)">操作损坏</el-button>
  106. </template>
  107. </el-table-column>
  108. </el-table>
  109. <el-pagination
  110. @size-change="sizeChangeHandle"
  111. @current-change="currentChangeHandle"
  112. :current-page="pageIndex"
  113. :page-sizes="[10, 20, 50, 100]"
  114. :page-size="pageSize"
  115. :total="totalPage"
  116. layout="total, sizes, prev, pager, next, jumper">
  117. </el-pagination>
  118. <el-dialog title="移交任务" width="30%" :visible.sync="transferDialogFormVisible">
  119. <el-form :model="transferDialogForm" :rules="transferDialogFormRules" ref="transferDialogForm">
  120. <!-- <el-form-item label="检验类型" prop="checkType" label-width="120px">
  121. <el-select v-model="transferDialogForm.checkType" placeholder="请选择检验类型">
  122. <el-option label="通过" value="1"></el-option>
  123. <el-option label="不通过" value="2"></el-option>
  124. </el-select>
  125. </el-form-item> -->
  126. <el-form-item label="移交类型" prop="transferType" label-width="120px">
  127. <el-select v-model="transferDialogForm.transferType" placeholder="请选择移交类型">
  128. <el-option label="工作移交" value="1"></el-option>
  129. </el-select>
  130. </el-form-item>
  131. <el-form-item label="移交用户" prop="transferUserId" label-width="120px">
  132. <el-select v-model="transferDialogForm.transferUserId" placeholder="请选择移交用户">
  133. <el-option
  134. v-for="item in transferUserList"
  135. :key="item.userId"
  136. :label="item.name"
  137. :value="item.userId">
  138. </el-option>
  139. </el-select>
  140. </el-form-item>
  141. <el-form-item label="移交说明" prop="transferExplain" label-width="120px">
  142. <el-input v-model="transferDialogForm.transferExplain" placeholder="请输入"></el-input>
  143. </el-form-item>
  144. </el-form>
  145. <div slot="footer" class="dialog-footer">
  146. <el-button @click="transferDialogFormVisible = false">取 消</el-button>
  147. <el-button type="primary" @click="transferSubmit">确 定</el-button>
  148. </div>
  149. </el-dialog>
  150. <el-dialog title="检验任务" width="30%" :visible.sync="checkDialogFormVisible">
  151. <el-form :model="checkDialogForm" :rules="checkDialogFormRules" ref="checkDialogForm">
  152. <el-form-item label="检验类型" prop="checkType" label-width="80px">
  153. <el-select v-model="checkDialogForm.checkType" placeholder="请选择检验类型" style="width:100%">
  154. <el-option label="返回上一级" value="2"></el-option>
  155. <el-option label="报损" value="3"></el-option>
  156. </el-select>
  157. </el-form-item>
  158. <el-form-item label="备注" prop="notes" label-width="80px">
  159. <el-input v-model="checkDialogForm.notes" type="textarea" :rows="2" placeholder="请输入备注"></el-input>
  160. </el-form-item>
  161. </el-form>
  162. <div slot="footer" class="dialog-footer">
  163. <el-button @click="checkDialogFormVisible = false">取 消</el-button>
  164. <el-button type="primary" @click="checkSubmit">确 定</el-button>
  165. </div>
  166. </el-dialog>
  167. <el-dialog title="操作损坏" width="30%" :visible.sync="damageDialogFormVisible">
  168. <el-form :model="damageDialogForm" :rules="damageDialogFormRules" ref="checkDialogForm">
  169. <el-form-item label="损坏原因" prop="damageReason" label-width="80px">
  170. <el-input v-model="damageDialogForm.damageReason" type="textarea" :rows="2" placeholder="请输入"></el-input>
  171. </el-form-item>
  172. </el-form>
  173. <div slot="footer" class="dialog-footer">
  174. <el-button @click="damageDialogFormVisible = false">取 消</el-button>
  175. <el-button type="primary" @click="damageSubmit">确 定</el-button>
  176. </div>
  177. </el-dialog>
  178. </div>
  179. </template>
  180. <script>
  181. import { getTaskList, startTask, transferTask, completeTask, checkTask, damageTask } from '@/api/task'
  182. import { workTypeMasterList } from '@/api/worktype'
  183. import template from '../warehouse/template.vue'
  184. import { downloadUrl } from '@/api/file'
  185. export default {
  186. components: { template },
  187. name: 'work',
  188. data () {
  189. return {
  190. addOrUpdateVisible: false,
  191. dataForm: {
  192. state: '1'
  193. },
  194. dataList: [],
  195. pageIndex: 1,
  196. pageSize: 10,
  197. totalPage: 0,
  198. dataListLoading: false,
  199. dataListSelections: [],
  200. optionsState: [
  201. {
  202. code: '1', value: '未完成'
  203. },
  204. {
  205. code: '2', value: '待操作'
  206. },
  207. {
  208. code: '3', value: '已完成'
  209. }
  210. ],
  211. transferDialogFormVisible: false,
  212. transferDialogForm: {},
  213. transferUserList: [],
  214. transferDialogFormRules: {
  215. transferType: [{required: true, message: '请选择移交类型', trigger: 'blur'}],
  216. transferUserId: [{required: true, message: '请选择移交用户', trigger: 'blur'}]
  217. },
  218. checkDialogFormVisible: false,
  219. checkDialogForm: {},
  220. checkDialogFormRules: {
  221. checkType: [{required: true, message: '请选择', trigger: 'blur'}]
  222. },
  223. damageDialogFormVisible: false,
  224. damageDialogForm: {},
  225. damageDialogFormRules: {
  226. damageReason: [{required: true, message: '请输入', trigger: 'blur'}]
  227. },
  228. // 是否显示进度条列
  229. showProgress: true
  230. }
  231. },
  232. created () {
  233. this.getDataList()
  234. },
  235. methods: {
  236. // 查询
  237. queryData () {
  238. this.pageIndex = 1
  239. if(this.dataForm.state === '2'){
  240. this.showProgress = false
  241. } else {
  242. this.showProgress = true
  243. }
  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(taskId, productionId){
  438. this.damageDialogFormVisible = true
  439. this.damageDialogForm.taskId = taskId
  440. this.damageDialogForm.productionId = productionId
  441. },
  442. // 确认操作损坏
  443. damageSubmit(){
  444. this.$refs['damageDialogForm'].validate((valid) => {
  445. if (valid) {
  446. let submitData = this.checkDialogForm
  447. damageTask(submitData).then(({data}) => {
  448. if (data && data.code === '200') {
  449. this.$message({
  450. type: 'success',
  451. message: '操作成功!'
  452. })
  453. this.checkDialogFormVisible = 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>