ConfigDrawerProduction.vue 29 KB

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