ConfigDrawerProduction.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. <template>
  2. <el-drawer
  3. v-model="visible"
  4. title="制造BOM详情配置"
  5. size="600"
  6. v-loading="loading"
  7. >
  8. <el-form
  9. ref="form"
  10. label-position="top"
  11. :model="formData"
  12. :disabled="nodeData?.is_disable || readonly"
  13. scroll-to-error
  14. >
  15. <el-row :gutter="12">
  16. <!-- 层级号 -->
  17. <el-col :span="12">
  18. <el-form-item label="级号" prop="lever_number">
  19. <el-input
  20. placeholder="请输入"
  21. disabled
  22. v-model="formData.lever_number"
  23. />
  24. </el-form-item>
  25. </el-col>
  26. <!-- 序号 -->
  27. <el-col :span="12">
  28. <el-form-item label="序号" prop="gridorders">
  29. <el-input
  30. disabled
  31. placeholder="请输入"
  32. v-model="formData.gridorders"
  33. />
  34. </el-form-item>
  35. </el-col>
  36. <!-- NK零件号 -->
  37. <el-col :span="12">
  38. <el-form-item label="NK零件号" name="erp_code">
  39. <div class="flex gap-8px">
  40. <el-input
  41. placeholder="推荐或生成..."
  42. v-model="formData.erp_code"
  43. :disabled="true"
  44. />
  45. <el-button
  46. type="text"
  47. :icon="CirclePlus"
  48. :disabled="!isEmpty || erpCodeDisabled"
  49. @click="openRecomendModal"
  50. >
  51. 推荐
  52. </el-button>
  53. <el-button
  54. type="text"
  55. :disabled="!isEmpty || erpCodeDisabled"
  56. @click="handleGenratorErpCode"
  57. >
  58. 生成
  59. </el-button>
  60. <el-button
  61. type="text"
  62. :disabled="isEmpty || erpCodeDisabled"
  63. @click="handleEmptyErpCode"
  64. >
  65. 置空
  66. </el-button>
  67. </div>
  68. </el-form-item>
  69. </el-col>
  70. <!-- NK零件名称 -->
  71. <el-col :span="12">
  72. <el-form-item label="NK零件名称" prop="part_name">
  73. <el-input
  74. placeholder="请输入"
  75. :disabled="!isEmpty"
  76. v-model="formData.part_name"
  77. />
  78. </el-form-item>
  79. </el-col>
  80. <!-- 产品类别 -->
  81. <el-col :span="12">
  82. <el-form-item label="产品类别" name="product_category">
  83. <!-- 非空值,或者为制造bom时 -->
  84. <el-select
  85. disabled
  86. v-model="formData.product_category"
  87. placeholder="请选择"
  88. >
  89. <el-option
  90. v-for="item in procuctTypeOptions.map((item) => ({
  91. label: item,
  92. value: item,
  93. }))"
  94. :key="item.value"
  95. :label="item.label"
  96. :value="item.value"
  97. />
  98. </el-select>
  99. </el-form-item>
  100. </el-col>
  101. <!-- 制造工艺 -->
  102. <el-col :span="12">
  103. <el-form-item label="制造工艺" name="process">
  104. <el-select v-model="formData.process" disabled placeholder="请选择">
  105. <el-option
  106. v-for="item in processOptions.map((item) => ({
  107. label: item,
  108. value: item,
  109. }))"
  110. :key="item.value"
  111. :label="item.label"
  112. :value="item.value"
  113. />
  114. </el-select>
  115. </el-form-item>
  116. </el-col>
  117. <!-- 长宽高 -->
  118. <el-row :gutter="8">
  119. <el-col :span="8"
  120. ><el-form-item label="长" name="length">
  121. <el-input-number
  122. disabled
  123. class="inline-block w-full!"
  124. placeholder="请输入"
  125. v-model="formData.length"
  126. />
  127. </el-form-item>
  128. </el-col>
  129. <el-col :span="8">
  130. <el-form-item label="宽" name="width">
  131. <el-input-number
  132. disabled
  133. class="inline-block w-full!"
  134. placeholder="请输入"
  135. v-model="formData.width"
  136. /> </el-form-item
  137. ></el-col>
  138. <el-col :span="8">
  139. <el-form-item label="高" name="height">
  140. <el-input-number
  141. disabled
  142. class="inline-block w-full!"
  143. placeholder="请输入"
  144. v-model="formData.height"
  145. /> </el-form-item
  146. ></el-col>
  147. </el-row>
  148. <!-- 颜色 -->
  149. <el-col :span="12">
  150. <el-form-item label="颜色" name="color">
  151. <el-input disabled placeholder="请输入" v-model="formData.color" />
  152. </el-form-item>
  153. </el-col>
  154. <!-- 光泽度 -->
  155. <el-col :span="12">
  156. <el-form-item label="光泽度" name="color_config">
  157. <el-input
  158. disabled
  159. placeholder="请输入"
  160. v-model="formData.color_config"
  161. />
  162. </el-form-item>
  163. </el-col>
  164. <!-- 自制/外购/支给(M/P/C) -->
  165. <el-col :span="12">
  166. <el-form-item label="自制/外购/支给(M/P/C)" prop="part_type">
  167. <el-select
  168. disabled
  169. v-model="formData.part_type"
  170. placeholder="请选择"
  171. @change="handlePartTypeChange"
  172. >
  173. <el-option
  174. v-for="item in options"
  175. :key="item.value"
  176. :label="item.label"
  177. :value="item.value"
  178. />
  179. </el-select>
  180. </el-form-item>
  181. </el-col>
  182. <!-- 零件属性 -->
  183. <el-col :span="12">
  184. <el-form-item label="零件属性" name="part_attribute">
  185. <el-select disabled placeholder="" v-model="formData.part_attribute">
  186. <el-option
  187. v-for="item in partAttributeOptions.map((item) => ({
  188. label: item,
  189. value: item,
  190. }))"
  191. :key="item.value"
  192. :label="item.label"
  193. :value="item.value"
  194. />
  195. </el-select>
  196. </el-form-item>
  197. </el-col>
  198. <!-- 材料牌号 -->
  199. <el-col :span="12">
  200. <el-form-item label="材料牌号" name="material_grade">
  201. <el-input
  202. disabled
  203. placeholder="请输入"
  204. v-model="formData.material_grade"
  205. />
  206. </el-form-item>
  207. </el-col>
  208. <!-- 材料供应商 -->
  209. <el-col :span="12">
  210. <el-form-item label="材料供应商" name="supplier">
  211. <el-input
  212. disabled
  213. placeholder="请输入"
  214. v-model="formData.supplier"
  215. />
  216. </el-form-item>
  217. </el-col>
  218. <!-- 计量单位 -->
  219. <el-col :span="12"
  220. ><el-form-item label="计量单位" name="unit">
  221. <el-input disabled placeholder="请输入" v-model="formData.unit" />
  222. </el-form-item>
  223. </el-col>
  224. <!-- 标准用量 -->
  225. <el-col :span="12"
  226. ><el-form-item label="标准用量" name="qty">
  227. <el-input-number
  228. disabled
  229. style="width: 100%"
  230. placeholder="请输入"
  231. v-model="formData.qty"
  232. />
  233. </el-form-item>
  234. </el-col>
  235. <!-- 工艺消耗 -->
  236. <el-col :span="12">
  237. <el-form-item label="工艺消耗" name="technology_consume">
  238. <el-input-number
  239. style="width: 100%"
  240. placeholder="请输入"
  241. v-model="formData.technology_consume"
  242. />
  243. </el-form-item>
  244. </el-col>
  245. <!-- 不良率% -->
  246. <el-col :span="12">
  247. <el-form-item label="不良率%" name="nonperform_rate">
  248. <el-input-number
  249. style="width: 100%"
  250. placeholder="请输入"
  251. v-model="formData.nonperform_rate"
  252. >
  253. <template #suffix>
  254. <span>%</span>
  255. </template>
  256. </el-input-number>
  257. </el-form-item>
  258. </el-col>
  259. <!-- 制造区域 -->
  260. <el-col :span="12">
  261. <el-form-item label="制造区域" prop="manufacture_area">
  262. <el-select
  263. :disabled="!isEmpty"
  264. v-model="formData.manufacture_area"
  265. placeholder="请选择"
  266. >
  267. <el-option
  268. v-for="item in manufatureAreaOptions.map((item) => ({
  269. label: item,
  270. value: item,
  271. }))"
  272. :key="item.value"
  273. :label="item.label"
  274. :value="item.value"
  275. />
  276. </el-select>
  277. </el-form-item>
  278. </el-col>
  279. <!-- 制造单元 -->
  280. <el-col :span="12">
  281. <el-form-item label="制造单元" prop="manufacture_report">
  282. <el-select
  283. :disabled="!isEmpty"
  284. v-model="formData.manufacture_report"
  285. placeholder="请选择"
  286. >
  287. <el-option
  288. v-for="item in manufatureUnitOptions.map((item) => ({
  289. label: item,
  290. value: item,
  291. }))"
  292. :key="item.value"
  293. :label="item.label"
  294. :value="item.value"
  295. />
  296. </el-select>
  297. </el-form-item>
  298. </el-col>
  299. <!-- 制造设备类(组) -->
  300. <el-col :span="12">
  301. <el-form-item label="制造设备类(组)" prop="manufature_equip">
  302. <el-input
  303. placeholder="请输入"
  304. v-model="formData.manufature_equip"
  305. />
  306. </el-form-item>
  307. </el-col>
  308. <!-- 模具/工装治具 -->
  309. <el-col :span="12">
  310. <el-form-item label="模具/工装治具" prop="moldtooling_fixture">
  311. <el-input
  312. placeholder="请输入"
  313. v-model="formData.moldtooling_fixture"
  314. />
  315. </el-form-item>
  316. </el-col>
  317. <!-- 模腔数/取数(pcs) -->
  318. <el-col :span="12">
  319. <el-form-item label="模腔数/取数(pcs)" prop="cavities">
  320. <el-input-number
  321. :step="1"
  322. :precision="0"
  323. placeholder="请输入"
  324. v-model="formData.cavities"
  325. style="width: 100%"
  326. />
  327. </el-form-item>
  328. </el-col>
  329. <!-- 制造周期(S) -->
  330. <el-col :span="12">
  331. <el-form-item label="制造周期(S)" prop="production_cycle">
  332. <el-input-number placeholder="请输入" v-model="formData.production_cycle" style="width: 100%" />
  333. </el-form-item>
  334. </el-col>
  335. <!-- 持台人数 -->
  336. <el-col :span="12">
  337. <el-form-item label="持台人数" prop="holding_number">
  338. <el-input-number
  339. :step="1"
  340. :precision="0"
  341. placeholder="请输入"
  342. v-model="formData.holding_number"
  343. style="width: 100%"
  344. />
  345. </el-form-item>
  346. </el-col>
  347. <!-- 单件节拍(S) -->
  348. <el-col :span="12">
  349. <el-form-item label="单件节拍(S)" prop="single_piece">
  350. <el-input-number
  351. placeholder="请输入"
  352. v-model="formData.single_piece"
  353. style="width: 100%"
  354. />
  355. </el-form-item>
  356. </el-col>
  357. <!-- 外包类型 -->
  358. <el-col :span="12">
  359. <el-form-item label="外包类型" prop="package_type">
  360. <el-input placeholder="请输入" v-model="formData.package_type" />
  361. </el-form-item>
  362. </el-col>
  363. <!-- 内包类型 -->
  364. <el-col :span="12">
  365. <el-form-item label="内包类型" prop="innerpackage_type">
  366. <el-input
  367. placeholder="请输入"
  368. v-model="formData.innerpackage_type"
  369. />
  370. </el-form-item>
  371. </el-col>
  372. <!-- snp -->
  373. <el-col :span="12">
  374. <el-form-item label="SNP" prop="snp">
  375. <el-input-number
  376. :step="1"
  377. :precision="0"
  378. placeholder="请输入"
  379. v-model="formData.snp"
  380. style="width: 100%"
  381. />
  382. </el-form-item>
  383. </el-col>
  384. <!-- 循环次数(次) -->
  385. <el-col :span="12">
  386. <el-form-item label="循环次数(次)" name="cycle_number">
  387. <el-input-number
  388. :step="1"
  389. :precision="0"
  390. style="width: 100%"
  391. placeholder="请输入"
  392. v-model="formData.cycle_number"
  393. />
  394. </el-form-item>
  395. </el-col>
  396. <!-- 供货地信息 -->
  397. <el-col :span="12">
  398. <el-form-item label="供货地信息" prop="supply_local">
  399. <el-input placeholder="请输入" v-model="formData.supply_local" />
  400. </el-form-item>
  401. </el-col>
  402. <!-- 供货距离(KM) -->
  403. <el-col :span="12">
  404. <el-form-item label="供货距离(KM)" prop="supplier_distance">
  405. <el-input-number
  406. placeholder="请输入"
  407. v-model="formData.supplier_distance"
  408. style="width: 100%"
  409. />
  410. </el-form-item>
  411. </el-col>
  412. <!-- 供应商编码 -->
  413. <el-col :span="12">
  414. <el-form-item label="供应商编码" prop="supply_code">
  415. <el-input placeholder="请输入" v-model="formData.supply_code" />
  416. </el-form-item>
  417. </el-col>
  418. <!-- 最小起订量 -->
  419. <el-col :span="12">
  420. <el-form-item label="最小起订量" name="min_order">
  421. <el-input-number
  422. :step="1"
  423. :precision="0"
  424. placeholder="请输入"
  425. v-model="formData.min_order"
  426. style="width: 100%"
  427. />
  428. </el-form-item>
  429. </el-col>
  430. <!-- 备注 -->
  431. <el-col :span="12">
  432. <el-form-item label="备注" name="note">
  433. <el-input
  434. placeholder="请输入"
  435. type="textarea"
  436. :rows="4"
  437. v-model="formData.note"
  438. />
  439. </el-form-item>
  440. </el-col>
  441. <!-- 备用字段1 -->
  442. <el-col :span="12">
  443. <el-form-item label="工程BOM备用字段1" name="engin_var1">
  444. <el-input
  445. disabled
  446. placeholder="请输入"
  447. v-model="formData.engin_var1"
  448. />
  449. </el-form-item>
  450. </el-col>
  451. <!-- 备用字段2 -->
  452. <el-col :span="12">
  453. <el-form-item label="工程BOM备用字段2" name="engin_var2">
  454. <el-input
  455. disabled
  456. placeholder="请输入"
  457. v-model="formData.engin_var2"
  458. />
  459. </el-form-item>
  460. </el-col>
  461. <!-- 备用字段3 -->
  462. <el-col :span="12">
  463. <el-form-item label="工程BOM备用字段3" name="engin_var3">
  464. <el-input
  465. disabled
  466. placeholder="请输入"
  467. v-model="formData.engin_var3"
  468. />
  469. </el-form-item>
  470. </el-col>
  471. <!-- 备用字段4 -->
  472. <el-col :span="12">
  473. <el-form-item label="工程BOM备用字段4" name="engin_var4">
  474. <el-input
  475. disabled
  476. placeholder="请输入"
  477. v-model="formData.engin_var4"
  478. />
  479. </el-form-item>
  480. </el-col>
  481. <!-- 备用字段5 -->
  482. <el-col :span="12">
  483. <el-form-item label="工程BOM备用字段5" name="engin_var5">
  484. <el-input
  485. disabled
  486. placeholder="请输入"
  487. v-model="formData.engin_var5"
  488. />
  489. </el-form-item>
  490. </el-col>
  491. <!-- 备用字段1 -->
  492. <el-col :span="12">
  493. <el-form-item label="制造BOM备用字段1" name="manufacture_var1">
  494. <el-input
  495. placeholder="请输入"
  496. v-model="formData.manufacture_var1"
  497. />
  498. </el-form-item>
  499. </el-col>
  500. <!-- 备用字段2 -->
  501. <el-col :span="12">
  502. <el-form-item label="制造BOM备用字段2" name="manufacture_var2">
  503. <el-input
  504. placeholder="请输入"
  505. v-model="formData.manufacture_var2"
  506. />
  507. </el-form-item>
  508. </el-col>
  509. <!-- 备用字段3 -->
  510. <el-col :span="12">
  511. <el-form-item label="制造BOM备用字段3" name="manufacture_var3">
  512. <el-input
  513. placeholder="请输入"
  514. v-model="formData.manufacture_var3"
  515. />
  516. </el-form-item>
  517. </el-col>
  518. <!-- 备用字段4 -->
  519. <el-col :span="12">
  520. <el-form-item label="制造BOM备用字段4" name="manufacture_var4">
  521. <el-input
  522. placeholder="请输入"
  523. v-model="formData.manufacture_var4"
  524. />
  525. </el-form-item>
  526. </el-col>
  527. <!-- 备用字段5 -->
  528. <el-col :span="12">
  529. <el-form-item label="制造BOM备用字段5" name="manufacture_var5">
  530. <el-input
  531. placeholder="请输入"
  532. v-model="formData.manufacture_var5"
  533. />
  534. </el-form-item>
  535. </el-col>
  536. </el-row>
  537. </el-form>
  538. <template #footer>
  539. <el-button @click="visible = false">取消</el-button>
  540. <el-button v-if="!readonly" type="primary" @click="handleSubmit"
  541. >确定</el-button
  542. >
  543. </template>
  544. </el-drawer>
  545. <TableModal ref="recomendRef" @ok="handleRecomend" />
  546. </template>
  547. <script setup lang="ts">
  548. import { ref, defineExpose, defineEmits, computed, defineProps } from "vue";
  549. import { ElMessage, type FormInstance } from "element-plus";
  550. import { cloneDeep } from "lodash-es";
  551. import { CirclePlus } from "@element-plus/icons-vue";
  552. import TableModal from "./TableModal.vue";
  553. import type { IRecomend } from "./TableModal.vue";
  554. defineProps<{
  555. readonly: boolean;
  556. }>();
  557. // erp_code是否为空
  558. const isEmpty = computed(() => !formData.value.erp_code);
  559. // 置空操作
  560. const handleEmptyErpCode = () => {
  561. formData.value.erp_code = "";
  562. };
  563. const keyMap = {
  564. gridorders: "序号",
  565. customer_part_code: "客户零件号",
  566. customer_part_name: "客户零件名称",
  567. customer_part_vesion: "客户图纸号",
  568. erp_code: "NK零件号",
  569. part_name: "NK零件名称",
  570. unit_config: "辆份配置",
  571. config_ratio: "配置比",
  572. product_category: "产品类别",
  573. process: "制造工艺",
  574. length: "长",
  575. width: "宽",
  576. height: "高",
  577. color: "颜色",
  578. color_config: "光泽度",
  579. part_type: "自制/外购/支给(M/P/C)",
  580. part_attribute: "零件属性",
  581. material_grade: "材料牌号",
  582. supplier: "材料供应商",
  583. unit: "计量单位",
  584. qty: "标准用量",
  585. technology_consume: "工艺消耗",
  586. nonperform_rate: "不良率%",
  587. manufacture_area: "制造区域",
  588. manufacture_report: "制造单元",
  589. manufature_equip: "制造设备类(组)",
  590. moldtooling_fixture: "模具/工装治具",
  591. cavities: "模腔数/取数(pcs)",
  592. production_cycle: "制造周期(S)",
  593. holding_number: "持台人数",
  594. single_piece: "单件节拍(S)",
  595. package_type: "外包类型",
  596. innerpackage_type: "内包类型",
  597. snp: "SNP",
  598. cycle_number: "循环次数(次)",
  599. supply_local: "供货地信息",
  600. supplier_distance: "供货距离(KM)",
  601. supply_code: "供应商编码",
  602. min_order: "最小起订量",
  603. note: "备注",
  604. picture: "简图",
  605. engin_var1: "备用字段1",
  606. engin_var2: "备用字段2",
  607. engin_var3: "备用字段3",
  608. engin_var4: "备用字段4",
  609. engin_var5: "备用字段5",
  610. manufacture_var1: "备用字段1",
  611. manufacture_var2: "备用字段2",
  612. manufacture_var3: "备用字段3",
  613. manufacture_var4: "备用字段4",
  614. manufacture_var5: "备用字段5",
  615. };
  616. const options = [
  617. { label: "自制", value: "M" },
  618. { label: "外购", value: "P" },
  619. { label: "支给", value: "C" },
  620. ];
  621. // 零件属性
  622. const partAttributeOptions = computed(() => {
  623. if (formData.value.part_type == "M") {
  624. return ["完成品", "半成品"];
  625. }
  626. if (formData.value.part_type == "P") {
  627. return ["树脂", "膜片", "碳纤维片", "木皮", "铝片", "涂料", "油墨", "部件"];
  628. }
  629. if (formData.value.part_type == "C") {
  630. return ["树脂", "膜片", "碳纤维片", "木皮", "铝片", "涂料", "油墨", "部件"];
  631. }
  632. return [];
  633. });
  634. // 制造单元
  635. const manufatureUnitOptions = [
  636. "丝网印刷",
  637. "连续机吸塑",
  638. "单片机吸塑",
  639. "成型",
  640. "机器人产线喷涂",
  641. "往复机产线喷涂",
  642. "手工喷涂",
  643. "热压",
  644. "CNC",
  645. "PUR",
  646. "打磨",
  647. "产线装配",
  648. "手工装配",
  649. "焊接",
  650. "镭雕",
  651. "移印",
  652. ];
  653. // 产品类别
  654. const procuctTypeOptions = [
  655. "成型产品",
  656. "涂装产品",
  657. "INS产品",
  658. "真木产品",
  659. "碳纤维产品",
  660. "真铝产品",
  661. "模具产品",
  662. ];
  663. // 制造区域
  664. const manufatureAreaOptions = ["大连工厂", "孝感工厂"];
  665. // 制造工艺
  666. const processOptions = [
  667. "普通注塑",
  668. "嵌件注塑",
  669. "加饰注塑",
  670. "机器人喷涂",
  671. "往复机喷涂",
  672. "手工喷涂",
  673. "丝网印刷",
  674. "吸塑",
  675. "PUR",
  676. "产线装配",
  677. "焊接",
  678. "镭雕",
  679. "移印",
  680. "冲切",
  681. "热压",
  682. "CNC",
  683. "手工装配",
  684. "整理",
  685. "打磨",
  686. ];
  687. const visible = ref(false);
  688. const layerIndex = ref(0);
  689. const formData = ref<Record<string, any>>({
  690. part_name: "",
  691. part_type: "",
  692. bom_code: "",
  693. qty: undefined,
  694. is_change: false,
  695. change_content: "",
  696. is_disable: false,
  697. bom_det: undefined,
  698. });
  699. const form = ref<FormInstance>();
  700. const loading = ref(false);
  701. // 表单数据
  702. const originFormData = ref<any>();
  703. const emit = defineEmits(["ok"]);
  704. // 节点数据
  705. const nodeData = ref<any>(null);
  706. // 推荐弹窗
  707. const recomendRef = ref<{
  708. open: (
  709. partName: string,
  710. partType: string,
  711. partAttribute: string,
  712. productCategory: string
  713. ) => void;
  714. }>();
  715. // 2.制造BOM只有M件,这两个按钮才可以操作
  716. const erpCodeDisabled = computed(() => {
  717. return formData.value.part_type !== "M" || !formData.value.part_type;
  718. });
  719. const editType = ref<"add" | "edit">("edit");
  720. const open = (node: any, type?: "add" | "edit", layer?: number) => {
  721. layerIndex.value = node?._node?.layerIndex || layer;
  722. visible.value = true;
  723. nodeData.value = cloneDeep(node.data);
  724. editType.value = type || !node?.id ? "add" : "edit";
  725. form.value?.resetFields();
  726. console.log("add or eidt:", node, type, editType.value);
  727. try {
  728. // 新增
  729. if (type === "add" || !node?.id) {
  730. originFormData.value = cloneDeep(node.data);
  731. formData.value = {
  732. ...node.data?.bom_det,
  733. lever_number: layerIndex.value,
  734. };
  735. } else {
  736. // 编辑 通过接口获取详情
  737. loading.value = true;
  738. window.parent?.BpmTools?.program(
  739. {
  740. interfaceCode: "Common.getBOMInfo",
  741. bom_id: node.id,
  742. },
  743. (res: any) => {
  744. originFormData.value = res;
  745. formData.value = {
  746. ...node.data,
  747. ...(res || {}),
  748. ...(node.data?.bom_det || {}),
  749. bom_det: {},
  750. lever_number: layerIndex.value,
  751. };
  752. loading.value = false;
  753. }
  754. );
  755. }
  756. } finally {
  757. loading.value = false;
  758. }
  759. };
  760. // 零件类型改变
  761. // 属性值不在选项中时,清空
  762. const handlePartTypeChange = () => {
  763. if (!partAttributeOptions.value.includes(formData.value.part_attribute)) {
  764. formData.value.part_attribute = undefined;
  765. }
  766. };
  767. // 打开推荐
  768. const openRecomendModal = () => {
  769. // M件并且属性为"完成品"传产品分类
  770. const product_category =
  771. formData.value.part_type == "M" &&
  772. formData.value?.part_attribute === "完成品"
  773. ? formData.value.product_category
  774. : "";
  775. recomendRef.value?.open(
  776. formData.value?.part_name,
  777. formData.value?.part_type,
  778. formData.value?.part_attribute,
  779. product_category
  780. );
  781. };
  782. // 添加推荐
  783. const handleRecomend = (record: IRecomend) => {
  784. formData.value.erp_code = record.erp_code;
  785. formData.value.part_type = record.part_type;
  786. formData.value.part_name = record.part_name;
  787. formData.value.part_attribute = record.part_attribute;
  788. formData.value.product_category = record.product_category;
  789. formData.value.manufacture_report = record.manufacture_report;
  790. formData.value.manufacture_area = record.manufacture_area;
  791. formData.value.material_grade = record.material_grade;
  792. formData.value.process = record.process;
  793. formData.value.unit = record.unit;
  794. };
  795. // 生成code
  796. const handleGenratorErpCode = async () => {
  797. const valid = await form.value?.validate();
  798. if (!valid) return;
  799. window.parent?.BpmTools?.program(
  800. {
  801. interfaceCode: "Partmanagement.generatePart",
  802. model: formData.value,
  803. },
  804. (res: any) => {
  805. formData.value.erp_code = res;
  806. ElMessage.success("生成成功");
  807. }
  808. );
  809. };
  810. // 关闭
  811. const close = () => {
  812. visible.value = false;
  813. originFormData.value = null;
  814. nodeData.value = null;
  815. form.value?.resetFields();
  816. };
  817. // 提交表单
  818. const handleSubmit = async () => {
  819. const valid = await form.value?.validate();
  820. if (!valid) return;
  821. // 获取变更之前的数据
  822. if (!originFormData.value) return;
  823. let str = "";
  824. Object.entries(formData.value).forEach(([key, value]) => {
  825. if (
  826. [
  827. "is_change",
  828. "change_content",
  829. "changecontent",
  830. "bom_det",
  831. "isActive",
  832. "is_disable",
  833. "expand",
  834. "uid",
  835. "name",
  836. "type",
  837. ].includes(key)
  838. ) {
  839. return;
  840. }
  841. // 值发生变化
  842. if (value !== originFormData.value[key]) {
  843. if (key in keyMap)
  844. str += `${str ? "," : ""}${keyMap[key as keyof typeof keyMap]}: ${
  845. originFormData.value[key] ?? "空"
  846. }->${value ?? ""}`;
  847. // 更新内部数据
  848. if (Object.hasOwnProperty.call(nodeData.value || {}, key)) {
  849. nodeData.value[key] = value;
  850. }
  851. if (formData.value?.bom_det) {
  852. formData.value.bom_det[key] = value;
  853. } else {
  854. formData.value.bom_det = { [key]: value };
  855. }
  856. }
  857. });
  858. if (editType.value === "edit") {
  859. formData.value.change_content = str;
  860. formData.value.is_change = !!str;
  861. } else {
  862. formData.value.change_content = "";
  863. formData.value.is_change = false;
  864. }
  865. // 最终编辑结果数据
  866. const result = {
  867. ...(nodeData.value || {}),
  868. type: formData.value.part_type,
  869. name: formData.value.part_name,
  870. qty: formData.value.qty,
  871. is_change: formData.value.is_change,
  872. change_content: formData.value.change_content,
  873. manufacture_area: formData.value.manufacture_area,
  874. manufacture_report: formData.value.manufacture_report,
  875. material_grade: formData.value.material_grade,
  876. part_attribute: formData.value.part_attribute,
  877. process: formData.value.process,
  878. product_category: formData.value.product_category,
  879. supplier: formData.value.supplier,
  880. erp_code: formData.value.erp_code,
  881. // 编辑数据
  882. bom_det: formData.value.bom_det,
  883. };
  884. // 不需要这两个字段
  885. delete result.part_name;
  886. delete result.part_type;
  887. emit("ok", result);
  888. close();
  889. };
  890. defineExpose({
  891. open,
  892. close,
  893. });
  894. </script>
  895. <style scoped></style>