index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-crud
  4. ref="crudRef"
  5. v-model:search="search"
  6. v-model="form"
  7. :data="data"
  8. :option="option"
  9. v-model:page="page"
  10. @row-save="createRow"
  11. @row-update="updateRow"
  12. @row-del="deleteRow"
  13. @tree-load="treeLoad"
  14. @search-change="searchChange"
  15. @search-reset="resetChange"
  16. @size-change="dataList"
  17. @current-change="dataList"
  18. @selection-change="selectionChange"
  19. :span-method="spanMethod"
  20. >
  21. <template #orderCode="{ row }">
  22. <el-text v-if="row.orderCode">{{row.orderCode}}</el-text>
  23. <div style="width: 100%; height: 100%;display: flex" v-if="!row.orderCode && row.operationDetails">
  24. <div style="width: 120px;height: 100%" v-for="item in row.operationDetails">
  25. <el-progress
  26. :text-inside="true"
  27. :stroke-width="35"
  28. :font-color="'#ff0000'"
  29. :percentage="item.completeNum/row.workOrderNum * 100"
  30. status="success"
  31. >{{item.operationName}}(完成{{item.completeNum}})
  32. </el-progress>
  33. </div>
  34. </div>
  35. <el-tag v-if="row.workOrderCode === '-'" type="primary">库存数量:{{ row.stockNum }}</el-tag>
  36. </template>
  37. <template #menu="{size,row,index}">
  38. <!-- <el-button
  39. type="primary"
  40. link
  41. v-if="row.bom === '0' || row.dataFile === '0'|| row.routeId === '0'|| row.craftFile === '0'"
  42. size="small"
  43. @click="handleEdit(row,0)"
  44. ><i-ep-edit />编辑
  45. </el-button>-->
  46. <el-button
  47. type="primary"
  48. link
  49. v-if="row.materialState === '-' || row.deviceState === '-' || row.bom === '-' || row.craftFile === '-'"
  50. size="small"
  51. @click="handleRefresh(row.workOrderCode)"
  52. ><i-ep-edit />刷新
  53. </el-button>
  54. <!-- <el-button
  55. type="primary"
  56. link
  57. v-if="row.bom === '0' || row.dataFile === '0'|| row.routeId === '0'|| row.craftFile === '0' || row.materialState === '0' || row.deviceState === '0'"
  58. size="small"
  59. @click="deleteRow(row)"
  60. ><i-ep-edit />删除
  61. </el-button>-->
  62. </template>
  63. <!-- <template #menu-left="{ size }">
  64. <el-button
  65. :disabled="toDeleteIds.length < 1"
  66. type="danger"
  67. icon="el-icon-delete"
  68. :size="size"
  69. @click="multipleDelete"
  70. >删除</el-button
  71. >
  72. </template>-->
  73. </avue-crud>
  74. <el-dialog
  75. v-model="dialog.visible"
  76. :title="dialog.title"
  77. width="80%"
  78. @close="dialog.visible = false"
  79. >
  80. <work-order-page queryType="1" @orderInfo="orderInfo"/>
  81. </el-dialog>
  82. </div>
  83. </template>
  84. <script setup>
  85. import { ref, getCurrentInstance } from "vue";
  86. import { useCrud } from "@/hooks/userCrud";
  87. import {prepareCheckInfo,refreshPrepareCheckInfo} from "@/api/order"
  88. import {queryChildrenInfo} from "@/api/process"
  89. import { useCommonStoreHook } from "@/store";
  90. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  91. const router = useRouter();
  92. const test = () => {
  93. isShowTable.value = true;
  94. tableType.value = tableType.value == 1 ? 2 : 1;
  95. };
  96. // 传入一个url,后面不带/
  97. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  98. useCrud({
  99. src: "/api/v1/plan/prepare",
  100. });
  101. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
  102. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  103. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  104. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  105. const dialog = reactive({
  106. title: "订单选择",
  107. visible: false,
  108. });
  109. const merginState = ref(false)
  110. const spanMethod = ({ row, column, rowIndex, columnIndex })=>{
  111. if(row.hasParent){
  112. if(columnIndex === 6){
  113. merginState.value = true
  114. return [1, 11]
  115. }else if(columnIndex > 6 && merginState){
  116. return [0,0]
  117. }
  118. }else{
  119. merginState.value = false
  120. }
  121. /*if (rowIndex % 2 === 0) {
  122. if (columnIndex === 0) {
  123. return [1, 2]
  124. } else if (columnIndex === 1) {
  125. return [0, 0]
  126. }
  127. }*/
  128. }
  129. const checkInfo = (code) =>{
  130. prepareCheckInfo(code).then((data)=>{
  131. form.value.deviceStr = data.data.deviceStr
  132. form.value.deviceState = data.data.deviceState
  133. form.value.materialState = data.data.materialState
  134. form.value.materialStr = data.data.materialStr
  135. })
  136. }
  137. const treeLoad = (tree, treeNode, resolve) =>{
  138. queryChildrenInfo(tree.workOrderCode).then((data)=>{
  139. resolve(data.data)
  140. })
  141. }
  142. const handleEdit =(row,index)=>{
  143. crudRef.value && crudRef.value.rowEdit(row,index);
  144. }
  145. const handleRefresh =(code)=>{
  146. refreshPrepareCheckInfo(code).then((data)=>{
  147. if(data.code === '200'){
  148. ElMessage.success("刷新成功")
  149. dataList()
  150. }else{
  151. ElMessage.error(data.msg)
  152. }
  153. })
  154. }
  155. const orderInfo = (value) => {
  156. form.value.workOrderCode = value.workOrderCode
  157. form.value.orderCode = value.orderCode
  158. form.value.orderName = value.orderName
  159. form.value.materialCode = value.materialCode
  160. form.value.materialName = value.materialName
  161. form.value.materialModel = value.materialModel
  162. dialog.visible = false
  163. }
  164. // 设置表格列或者其他自定义的option
  165. option.value = Object.assign(option.value, {
  166. delBtn: false,
  167. selection: false,
  168. editBtn: false,
  169. tree: true,
  170. viewBtn: false,
  171. lazy: true,
  172. menuWidth: 100,
  173. rowKey: 'workOrderCode',
  174. addBtn: false,
  175. dialogWidth: '45%', // 设置编辑弹窗的宽度为50%
  176. column: [
  177. {
  178. label: "工单号",
  179. prop: "workOrderCode",
  180. search: true,
  181. minWidth: 200,
  182. editDisabled : true,
  183. rules: [
  184. {
  185. required: true,
  186. message: "工单号不能为空",
  187. trigger: "trigger",
  188. },
  189. ],
  190. click: ({ value, column }) => {
  191. if(column.boxType){
  192. dialog.visible = true
  193. }
  194. },
  195. change:({ value, column }) =>{
  196. if(value){
  197. checkInfo(value)
  198. }
  199. }
  200. },
  201. {
  202. label: "产品编码",
  203. prop: "materialCode",
  204. search: true,
  205. width: 130,
  206. overHidden: true,
  207. disabled: true,
  208. rules: [
  209. {
  210. required: true,
  211. message: "产品编码不能为空",
  212. trigger: "trigger",
  213. },
  214. ],
  215. },
  216. {
  217. label: "产品名称",
  218. prop: "materialName",
  219. disabled: true,
  220. width: 140,
  221. overHidden: true,
  222. search: true,
  223. rules: [
  224. {
  225. required: true,
  226. message: "产品名称不能为空",
  227. trigger: "trigger",
  228. },
  229. ],
  230. },
  231. {
  232. label: "产品规格",
  233. prop: "materialModel",
  234. disabled: true,
  235. search: true,
  236. width: 140,
  237. overHidden: true,
  238. rules: [
  239. {
  240. required: true,
  241. message: "产品规格不能为空",
  242. trigger: "trigger",
  243. },
  244. ],
  245. },
  246. {
  247. label: "数量",
  248. prop: "workOrderNum",
  249. disabled: true,
  250. width: 80,
  251. overHidden: true,
  252. },
  253. {
  254. label: "计划单号",
  255. prop: "orderCode",
  256. search: true,
  257. width: 130,
  258. overHidden: true,
  259. disabled: true,
  260. rules: [
  261. {
  262. required: true,
  263. message: "计划单号不能为空",
  264. trigger: "trigger",
  265. },
  266. ],
  267. },
  268. {
  269. label: "计划名称",
  270. prop: "orderName",
  271. search: true,
  272. disabled: true,
  273. width: 150,
  274. overHidden: true,
  275. rules: [
  276. {
  277. required: true,
  278. message: "计划名称不能为空",
  279. trigger: "trigger",
  280. },
  281. ],
  282. },
  283. {
  284. label: "文件资料",
  285. width: 350,
  286. overHidden: true,
  287. prop: "craftFile",
  288. addDisplay: false,
  289. viewDisplay: false,
  290. editDisplay: false,
  291. html: true,
  292. formatter: (val) => {
  293. if (val.craftFile !== '-') {
  294. return '<b class="el-tag el-tag--success el-tag--light">'+val.craftFile+'</b>';
  295. }
  296. return '<b class="el-tag el-tag--danger el-tag--light">-</b>';
  297. },
  298. },
  299. {
  300. label: "工艺BOM",
  301. width: 115,
  302. overHidden: true,
  303. prop: "bom",
  304. viewDisplay: false,
  305. addDisplay: false,
  306. editDisplay: false,
  307. html: true,
  308. formatter: (val) => {
  309. if (val.bom !== '-') {
  310. return '<b class="el-tag el-tag--success el-tag--light">'+val.bom+'</b>';
  311. }
  312. return '<b class="el-tag el-tag--danger el-tag--light">-</b>';
  313. },
  314. },
  315. {
  316. label: "工艺路线",
  317. width: 115,
  318. overHidden: true,
  319. viewDisplay: false,
  320. addDisplay: false,
  321. editDisplay: false,
  322. prop: "routeId",
  323. html: true,
  324. formatter: (val) => {
  325. if (val.routeId !== '-') {
  326. return '<b class="el-tag el-tag--success el-tag--light">'+val.routeId+'</b>';
  327. }
  328. return '<b class="el-tag el-tag--danger el-tag--light">-</b>';
  329. },
  330. },
  331. /*{
  332. label: "设计文件",
  333. prop: "dataFile",
  334. width: 115,
  335. overHidden: true,
  336. viewDisplay: false,
  337. addDisplay: false,
  338. editDisplay: false,
  339. html: true,
  340. formatter: (val) => {
  341. if (val.dataFile === '1') {
  342. return '<b class="el-tag el-tag--success el-tag--light">已齐套</b>';
  343. }
  344. return '<b class="el-tag el-tag--danger el-tag--light">未齐套</b>';
  345. },
  346. },*/
  347. /* {
  348. label: "工艺文件",
  349. width: 115,
  350. overHidden: true,
  351. prop: "craftFiles",
  352. type: 'checkbox',
  353. span: 12,
  354. hide: true,
  355. dicData: [{label: '已齐套', value: '1'}],
  356. },
  357. {
  358. label: "工艺BOM",
  359. width: 150,
  360. span: 12,
  361. type: "checkbox",
  362. overHidden: true,
  363. prop: "boms",
  364. hide: true,
  365. dicData: [ { label: "已齐套", value: "1", }, ],
  366. },
  367. {
  368. label: "工艺路线",
  369. width: 150,
  370. span: 12,
  371. type: "checkbox",
  372. overHidden: true,
  373. hide: true,
  374. prop: "routeIds",
  375. dicData: [ { label: "已齐套", value: "1", }, ],
  376. },*/
  377. /* {
  378. label: "设计文件",
  379. prop: "dataFiles",
  380. width: 150,
  381. overHidden: true,
  382. type: 'checkbox',
  383. span: 12,
  384. multiple: true,
  385. hide: true,
  386. dicData: [ { label: "已齐套", value: "1", }, ],
  387. },*/
  388. {
  389. label: "设备状况",
  390. prop: "deviceState",
  391. width: 150,
  392. hide: true,
  393. addDisplay: false,
  394. overHidden: true,
  395. viewDisplay: false,
  396. editDisplay: false,
  397. span: 24,
  398. dicData: [ { label: "已齐套", value: "1", },{ label: "未齐套", value: "0", }, ],
  399. },
  400. {
  401. label: "物料状态",
  402. prop: 'materialState',
  403. width: 130,
  404. hide: true,
  405. editDisplay: false,
  406. addDisplay: false,
  407. viewDisplay: false,
  408. overHidden: true,
  409. span: 24,
  410. dicData: [ { label: "已齐套", value: "1", },{ label: "未齐套", value: "0", }, ],
  411. },
  412. {
  413. label: "设备状况",
  414. prop: "deviceStr",
  415. disabled: true,
  416. width: 200,
  417. overHidden: true,
  418. span: 24,
  419. html: true,
  420. formatter: (val) => {
  421. if (val.deviceState === '1') {
  422. return '<b class="el-tag el-tag--success el-tag--light">已齐套</b>';
  423. }
  424. return '<b class="el-tag el-tag--danger el-tag--light">'+val.deviceStr+'</b>';
  425. },
  426. },
  427. {
  428. label: "物料状态",
  429. prop: 'materialStr',
  430. disabled: true,
  431. width: 200,
  432. overHidden: true,
  433. span: 24,
  434. html: true,
  435. formatter: (val) => {
  436. if (val.materialState === '1') {
  437. return '<b class="el-tag el-tag--success el-tag--light">已齐套</b>';
  438. }
  439. return '<b class="el-tag el-tag--danger el-tag--light">'+val.materialStr+'</b>';
  440. },
  441. },
  442. {
  443. label: "创建时间",
  444. prop: "created",
  445. width: 200,
  446. display: false
  447. },
  448. {
  449. label: "创建人",
  450. width: 200,
  451. prop: "creator",
  452. display: false
  453. },
  454. ],
  455. });
  456. onMounted(() => {
  457. form.value.routeId = "1"
  458. form.value.materialState = 1
  459. let url = window.location.href
  460. if(url.includes("workOrderCode")){
  461. search.value.workOrderCode = url.substring(url.indexOf("workOrderCode")+ 14)
  462. }
  463. dataList();
  464. });
  465. </script>
  466. <style scoped>
  467. :deep(.el-progress-bar__innerText) {
  468. color: #737674;
  469. display: inline-block;
  470. font-size: 12px;
  471. margin: 0 5px;
  472. vertical-align: middle;
  473. }
  474. </style>