baseInfo.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  1. <template>
  2. <el-form ref="form1" :model="form" :rules="rules" label-width="120px">
  3. <el-row>
  4. <el-col :span="6">
  5. <el-form-item label="编码:">
  6. <el-input
  7. :maxlength="20"
  8. v-model="form.code"
  9. disabled
  10. placeholder="请输入"
  11. />
  12. </el-form-item>
  13. </el-col>
  14. <!-- <el-col :span="6">
  15. <el-form-item label="检测类型:" prop="qualityType">
  16. <DictSelection
  17. dictName="检测计划类型"
  18. v-model="form.qualityType"
  19. :disabled="btnType == 'detail'"
  20. ></DictSelection>
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="6">
  24. <el-form-item label="检测方式:" prop="qualityMode">
  25. <DictSelection
  26. dictName="取样类型"
  27. v-model="form.qualityMode"
  28. clearable
  29. :disabled="btnType == 'detail'"
  30. ></DictSelection>
  31. </el-form-item>
  32. </el-col>-->
  33. <el-col :span="6">
  34. <el-form-item label="产品名称:" prop="productName">
  35. <el-input
  36. disabled
  37. v-model="form.productName"
  38. @click.native="addProduct"
  39. readonly
  40. placeholder="请选择"
  41. />
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="6">
  45. <el-form-item label="产品编码:" prop="productCode">
  46. <el-input v-model="form.productCode" disabled />
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="6">
  50. <el-form-item label="批次号:" prop="batchNo">
  51. <el-input v-model="form.batchNo" disabled />
  52. </el-form-item>
  53. </el-col>
  54. </el-row>
  55. <el-row>
  56. <el-col :span="6">
  57. <el-form-item label="规格:" prop="specification">
  58. <el-input v-model="form.specification" disabled />
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="6">
  62. <el-form-item label="型号:" prop="modelType">
  63. <el-input v-model="form.modelType" disabled />
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="6">
  67. <el-form-item label="牌号:" prop="brandNo">
  68. <el-input v-model="form.brandNo" disabled />
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="6">
  72. <el-form-item label="计量类型" prop="inspectionStandards">
  73. <!-- 计量 计重 -->
  74. <el-select
  75. style="width: 100%"
  76. v-model="form.inspectionStandards"
  77. placeholder="请选择"
  78. :disabled="true"
  79. >
  80. <el-option
  81. v-for="item in inspectionStandardsList"
  82. :label="item.label"
  83. :value="item.value"
  84. :key="item.value"
  85. ></el-option>
  86. </el-select>
  87. </el-form-item>
  88. </el-col>
  89. <!-- <el-col :span="6">
  90. <el-form-item label="总数量:" prop="total">
  91. <el-input
  92. type="number"
  93. v-model="form.total"
  94. @input="inputTotal"
  95. disabled
  96. />
  97. </el-form-item>
  98. </el-col> -->
  99. </el-row>
  100. <!-- <div style="text-align: right; margin-bottom: 22px">
  101. <div @click="toggleExpand">
  102. <div v-if="isExpanded"> <i class="el-icon-arrow-up"></i>收起 </div>
  103. <div v-if="!isExpanded">
  104. <i class="el-icon-arrow-down"></i>展开更多
  105. </div>
  106. </div>
  107. </div> -->
  108. <!-- v-if="isExpanded" -->
  109. <div>
  110. <el-row>
  111. <el-col :span="6">
  112. <el-form-item
  113. label="执行部门"
  114. prop="executeDeptId"
  115. v-if="form.qualityType != 2 && form.assignType != 1"
  116. >
  117. <deptSelect
  118. :disabled="btnType == 'detail'"
  119. v-model="form.executeDeptId"
  120. filterable
  121. company-scope
  122. @changeGroup="searchDeptNodeClick"
  123. />
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="6" v-if="form.qualityType == 2 || form.assignType == 1">
  127. <el-form-item label="执行班组" prop="executeJobId">
  128. <el-select
  129. :disabled="btnType == 'detail'"
  130. v-model="form.executeJobId"
  131. size="small"
  132. style="width: 100%"
  133. v-if="form.assignType != 1"
  134. >
  135. <el-option
  136. v-for="item in form.jobList"
  137. :key="item.id"
  138. :value="item.id"
  139. :label="item.name"
  140. @click.native="changeExecuteJob(item)"
  141. ></el-option>
  142. </el-select>
  143. <el-input v-else v-model="form.executeJobName" disabled></el-input>
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="6" style="height: 38px">
  147. <el-form-item label="执行人" prop="executeUserId">
  148. <el-select
  149. :disabled="btnType == 'detail'"
  150. v-model="form.executeUserIdList"
  151. size="small"
  152. v-if="form.assignType != 1"
  153. style="width: 100%"
  154. filterable
  155. multiple
  156. @change="executeUserIdChange"
  157. >
  158. <el-option
  159. v-for="item in form.qualityType == 2
  160. ? form.jobList.find((job) => job.id == form.executeJobId)
  161. ?.userVOList
  162. : executorOptions"
  163. :key="item.id"
  164. :value="item.id"
  165. :label="item.name"
  166. ></el-option>
  167. </el-select>
  168. <el-input v-else v-model="form.executeUserName" disabled></el-input>
  169. </el-form-item>
  170. </el-col>
  171. <el-col :span="6" v-if="form.assignType == 1">
  172. <el-form-item label="场站" prop="productLineId">
  173. <el-input v-model="form.productLineName" disabled></el-input>
  174. </el-form-item>
  175. </el-col>
  176. <el-col :span="6">
  177. <el-form-item label="检测时间:" prop="qualityTime">
  178. <el-date-picker
  179. v-model="form.qualityTime"
  180. class="w100"
  181. type="datetime"
  182. value-format="yyyy-MM-dd HH:mm:ss"
  183. :disabled="btnType == 'detail'"
  184. placeholder="选择日期"
  185. >
  186. </el-date-picker>
  187. </el-form-item>
  188. </el-col>
  189. <el-col :span="6">
  190. <el-form-item label="工时(h):" prop="hours">
  191. <el-input
  192. v-model="form.hours"
  193. :disabled="btnType == 'detail'"
  194. ></el-input>
  195. </el-form-item>
  196. </el-col>
  197. <el-col :span="6" v-if="$store.state.user.info.clientEnvironmentId=='10'">
  198. <el-form-item label="客户" prop="contactName">
  199. <el-input v-model="form.contactName" disabled></el-input>
  200. </el-form-item>
  201. </el-col>
  202. <el-col :span="6">
  203. <el-form-item label="接收人部门" prop="groupId">
  204. <el-input v-model="form.groupName" disabled></el-input>
  205. </el-form-item>
  206. </el-col>
  207. <el-col :span="6">
  208. <el-form-item label="接收人" prop="qualityIdList">
  209. <el-input v-model="form.qualityName" disabled></el-input>
  210. </el-form-item>
  211. </el-col>
  212. <el-col :span="6">
  213. <el-form-item
  214. label="合格数:"
  215. prop="qualifiedNumber"
  216. v-if="
  217. showArrange == '1' ||
  218. (showArrange == '2' && this.form.qualityMode != '2')
  219. "
  220. >
  221. <el-input
  222. :min="0"
  223. disabled
  224. @input="limitation('qualifiedNumber', form.qualifiedNumber)"
  225. @blur="quantityCalculation('qualifiedNumber')"
  226. v-model="form.qualifiedNumber"
  227. placeholder="请输入"
  228. ></el-input>
  229. </el-form-item>
  230. </el-col>
  231. <el-col :span="6">
  232. <el-form-item
  233. label="不合格数:"
  234. prop="noQualifiedNumber"
  235. v-if="
  236. showArrange == '1' ||
  237. (showArrange == '2' && this.form.qualityMode != '2')
  238. "
  239. >
  240. <el-input
  241. :min="0"
  242. disabled
  243. @input="limitation('noQualifiedNumber', form.noQualifiedNumber)"
  244. @blur="quantityCalculation('noQualifiedNumber')"
  245. v-model="form.noQualifiedNumber"
  246. placeholder="请输入"
  247. ></el-input>
  248. </el-form-item>
  249. </el-col>
  250. <el-col :span="6">
  251. <el-form-item label="合格率:" prop="qualificationRate">
  252. <el-input v-model="form.qualificationRate" disabled />
  253. </el-form-item>
  254. </el-col>
  255. <el-col :span="6">
  256. <el-form-item label="不合格率:" prop="noQualificationRate">
  257. <el-input v-model="form.noQualificationRate" disabled />
  258. </el-form-item>
  259. </el-col>
  260. <el-col :span="6">
  261. <el-form-item label="检验方式:" prop="qualityMode">
  262. <!-- <DictSelection dictName="取样类型" v-model="form.qualityMode" :disabled="qualityType == 1"></DictSelection> -->
  263. <el-select
  264. @change="changeQualityMode"
  265. style="width: 100%"
  266. v-model="form.qualityMode"
  267. placeholder="请选择"
  268. disabled
  269. >
  270. <!-- :disabled="
  271. parseInt(qualityType1) == 1 || parseInt(qualityType1) == 3
  272. " -->
  273. <el-option
  274. v-for="item in qualityModeList"
  275. :label="item.label"
  276. :value="item.value"
  277. :key="item.value"
  278. ></el-option>
  279. </el-select>
  280. </el-form-item>
  281. </el-col>
  282. <el-col :span="6">
  283. <!-- <el-form-item label="检测结果:" prop="qualityResults" v-if="form.qualityMode == 2"> -->
  284. <el-form-item label="检测结果:" prop="qualityResults">
  285. <!-- :disabled="btnType == 'detail'" -->
  286. <el-select
  287. v-model="form.qualityResults"
  288. placeholder="请选择"
  289. style="width: 100%"
  290. :disabled="
  291. showArrange == '0' ||
  292. (showArrange == '2' && this.form.qualityMode == '2')
  293. "
  294. @change="selectResult"
  295. >
  296. <el-option label="合格" :value="1" />
  297. <el-option label="不合格" :value="2" />
  298. </el-select>
  299. </el-form-item>
  300. </el-col>
  301. <el-col :span="6" v-if="$store.state.user.info.clientEnvironmentId!='9'">
  302. <el-form-item label="总重量:" prop="totalWeight">
  303. <el-input
  304. type="number"
  305. :disabled="btnType == 'detail'"
  306. v-model="form.totalWeight"
  307. />
  308. </el-form-item>
  309. </el-col>
  310. <el-col :span="6">
  311. <el-form-item label="总数量:" prop="total">
  312. <el-input
  313. type="number"
  314. v-model="form.total"
  315. @input="inputTotal"
  316. disabled
  317. />
  318. </el-form-item>
  319. </el-col>
  320. <el-col
  321. :span="
  322. showArrange == '1' ||
  323. (showArrange == '2' && this.form.qualityMode != '2')
  324. ? 24
  325. : 12
  326. "
  327. >
  328. <el-form-item label="备注:" prop="remark">
  329. <el-input
  330. type="textarea"
  331. v-model="form.remark"
  332. placeholder="请输入"
  333. :disabled="btnType == 'detail'"
  334. />
  335. </el-form-item>
  336. </el-col>
  337. <!-- <el-col :span="6" v-if="btnType != 'detail'">
  338. <el-form-item label="取样数量:" prop="sampleNumber" :rules="{
  339. required: form.qualityMode == 2 ? true : false,
  340. message: '请输入取样数量',
  341. trigger: 'blur'
  342. }" v-if="form.qualityMode == 2">
  343. <div style="display: flex;align-items: center;justify-content: space-between;">
  344. <el-input type="number"
  345. :disabled="form.qualityMode == null || form.qualityMode == 1 || (form.qualityMode == 2 && form.sampleNumber) ? true : false"
  346. v-model="form.sampleNumber" @change="handleChangeNumber" style="width: calc(100% - 90px)" />
  347. <DictSelection dictName="计量单位" clearable v-model="form.sampleMeasureUnit" disabled size="mini"
  348. style="width: 90px;margin-left: 12px;">
  349. </DictSelection>
  350. </div>
  351. </el-form-item>
  352. </el-col>-->
  353. <!-- <el-col :span="6" v-if="btnType != 'detail'">
  354. <el-form-item label="取样数量:" prop="sampleNumber" :rules="{
  355. required: form.qualityMode == 2 ? true : false,
  356. message: '请输入取样数量',
  357. trigger: 'blur'
  358. }" v-if="form.qualityMode == 2">
  359. <div style="display: flex;align-items: center;justify-content: space-between;">
  360. <el-input type="number"
  361. :disabled="form.qualityMode == null || form.qualityMode == 1 || (form.qualityMode == 2 && form.sampleNumber) ? true : false"
  362. v-model="form.sampleNumber" @change="handleChangeNumber" style="width: calc(100% - 90px)" />
  363. <DictSelection dictName="计量单位" clearable v-model="form.sampleMeasureUnit" disabled size="mini"
  364. style="width: 90px;margin-left: 12px;">
  365. </DictSelection>
  366. </div>
  367. </el-form-item>
  368. </el-col>-->
  369. <!-- <el-col :span="6">
  370. <el-form-item label="合格证号:" prop="certificateNumber">
  371. <el-input
  372. v-model="form.certificateNumber"
  373. :disabled="btnType == 'detail'"
  374. placeholder="请输入"
  375. ></el-input>
  376. </el-form-item>
  377. </el-col> -->
  378. <el-col :span="6" v-if="parseInt(qualityType1) == 2">
  379. <el-form-item label="工艺路线:">
  380. <el-input
  381. @click.native="openVersion"
  382. clearable
  383. v-model="form.produceRoutingName"
  384. :disabled="btnType == 'detail'"
  385. placeholder="请选择"
  386. />
  387. </el-form-item>
  388. </el-col>
  389. <el-col :span="6" v-if="parseInt(qualityType1) == 2">
  390. <el-form-item label="工序:">
  391. <el-select
  392. style="width: 100%"
  393. v-model="form.produceTaskId"
  394. placeholder="请选择"
  395. clearable
  396. @change="produceTaskChange"
  397. :disabled="btnType == 'detail'"
  398. >
  399. <el-option
  400. v-for="item in produceTaskList"
  401. :key="item.id"
  402. :label="item.name"
  403. :value="item.id"
  404. ></el-option>
  405. </el-select>
  406. </el-form-item>
  407. </el-col>
  408. <!-- <el-col :span="6">
  409. <el-form-item label="检测类型:">
  410. <el-input
  411. v-model="form.certificateNumber"
  412. disabled
  413. placeholder="请输入"
  414. ></el-input>
  415. </el-form-item>
  416. </el-col> -->
  417. <!-- 总数量 减去 样品数量 *** -->
  418. <!-- -->
  419. <!-- <el-col :span="6">
  420. <el-form-item label="检测结果数量:" prop="resultsTotal">
  421. <el-input
  422. type="number"
  423. v-model="form.resultsTotal"
  424. @input="inputTotal"
  425. disabled
  426. />
  427. </el-form-item>
  428. </el-col> -->
  429. <el-col :span="8">
  430. <el-form-item label="附件:" prop="accessory">
  431. <fileUpload
  432. v-model="form.accessory"
  433. :type="btnType == 'detail' ? 'view' : ''"
  434. />
  435. </el-form-item>
  436. </el-col>
  437. </el-row>
  438. </div>
  439. <ProductionVersion ref="versionRefs" @changeProduct="changeProduct" />
  440. <EquipmentDialog ref="equipmentRefs" @choose="choose" />
  441. </el-form>
  442. </template>
  443. <script>
  444. import deptSelect from '@/components/CommomSelect/dept-select.vue';
  445. import fileUpload from '@/components/addDoc/index.vue';
  446. import ProductionVersion from './ProductionVersion.vue';
  447. import EquipmentDialog from './EquipmentDialog.vue';
  448. //接口
  449. import { getUserPage } from '@/api/system/organization';
  450. import { getProduceTaskList } from '@/api/aps';
  451. import { getByCode } from '@/api/system/dictionary-data';
  452. import { parameterGetByCode } from '@/api/main/index';
  453. import { getCurrentUserCompany } from '@/utils/org-util';
  454. export default {
  455. components: {
  456. EquipmentDialog,
  457. ProductionVersion,
  458. deptSelect,
  459. fileUpload
  460. },
  461. props: {
  462. form: {
  463. type: Object,
  464. default: () => {}
  465. },
  466. btnType: {
  467. type: String,
  468. default: ''
  469. },
  470. qualityType1: {
  471. type: String,
  472. default: ''
  473. },
  474. sampleList: {
  475. type: Array,
  476. default: () => []
  477. }
  478. },
  479. watch: {
  480. // 'form.qualityMode': {
  481. // handler(newVal) {
  482. // if (newVal) {
  483. // this.$emit('changeModel', newVal);
  484. // } else {
  485. // console.log('清空样品清单');
  486. // // this.$emit('table2');
  487. // }
  488. // },
  489. // immediate: false
  490. // },
  491. // 'form.inspectionStandards': {
  492. // handler(newVal) {
  493. // if (newVal && this.qualityType1 == 2) {
  494. // this.$emit('changeInspectionStandardsModel', newVal);
  495. // } else {
  496. // console.log('清空样品清单');
  497. // // this.$emit('table2');
  498. // }
  499. // },
  500. // immediate: false
  501. // },
  502. // 新增 *** 监听合格率更改 检测结果
  503. // 'form.qualificationRate': {
  504. // handler(newVal) {
  505. // if (newVal == '100.00%' || newVal == '100%' || newVal == '100.0%') {
  506. // this.$set(this.form, 'qualityResults', 1);
  507. // } else {
  508. // this.$set(this.form, 'qualityResults', 2);
  509. // // this.$emit('table2');
  510. // }
  511. // },
  512. // immediate: false,
  513. // deep: true
  514. // }
  515. },
  516. computed: {
  517. /* 执行人候选项: 保证当前登录用户始终在列表中, 否则多选框回显不出姓名 */
  518. executorOptions() {
  519. const list = Array.isArray(this.executorList) ? this.executorList : [];
  520. const userInfo = this.$store?.state?.user?.info;
  521. if (!userInfo || !userInfo.userId) {
  522. return list;
  523. }
  524. if (list.find((item) => item.id == userInfo.userId)) {
  525. return list;
  526. }
  527. return [...list, { id: userInfo.userId, name: userInfo.name }];
  528. }
  529. },
  530. data() {
  531. return {
  532. executorList: [],
  533. sourceList: [],
  534. rules: {
  535. productName: [
  536. { required: true, message: '请选择产品', trigger: 'change' }
  537. ],
  538. // qualifiedNumber: [
  539. // { required: true, message: '请输入合格数', trigger: 'blur' }
  540. // ],
  541. // noQualifiedNumber: [
  542. // { required: true, message: '请输入不合格数', trigger: 'blur' }
  543. // ],
  544. qualityTime: [
  545. { required: true, message: '请选择检测时间', trigger: 'blur' }
  546. ],
  547. groupId: [
  548. { required: true, message: '请选择检测部门', trigger: 'change' }
  549. ],
  550. executeJobId: [
  551. { required: true, message: '请选择执行班组', trigger: 'change' }
  552. ],
  553. executeDeptId: [
  554. { required: true, message: '请选择执行部门', trigger: 'change' }
  555. ],
  556. // qualityId: [
  557. // { required: true, message: '请选择检测人', trigger: 'change' }
  558. // ],
  559. // qualityIdList: [
  560. // { required: true, message: '请选择检测人', trigger: 'blur' }
  561. // ],
  562. qualityResults: [
  563. { required: true, message: '请选择检测结果', trigger: 'change' }
  564. ],
  565. // inspectionStandards: [
  566. // { required: true, message: '请选择检验标准', trigger: 'change' }
  567. // ]
  568. },
  569. produceTaskList: [],
  570. inspectionStandardsList: [],
  571. qualityModeList: [],
  572. executeUserList: [],
  573. isExpanded: false,
  574. showArrange: '1'
  575. };
  576. },
  577. created() {
  578. this.getDictListIqoCode('measurement_type');
  579. this.getQualityModeList('quality_method_code');
  580. // 是否展示合格不合格
  581. this.getCode();
  582. },
  583. methods: {
  584. changeExecuteJob(item) {
  585. this.$set(this.form, 'executeJobName', item.name);
  586. this.$set(this.form, 'executeUserId', '');
  587. },
  588. getCode() {
  589. parameterGetByCode({
  590. code: 'qms_show_arrange'
  591. }).then((res) => {
  592. if (res) {
  593. this.showArrange = res.value || '1';
  594. // this.time_calc_code = res.value || '0';
  595. }
  596. });
  597. },
  598. // *** 只能输入大于0的数字
  599. limitation(val, num) {
  600. let newVal = num.replace(/[^\d.]/g, '');
  601. if (newVal.startsWith('.')) {
  602. newVal = '';
  603. }
  604. const firstDotIndex = newVal.indexOf('.');
  605. if (firstDotIndex !== -1) {
  606. newVal =
  607. newVal.slice(0, firstDotIndex + 1) +
  608. newVal.slice(firstDotIndex + 1).replace(/\./g, '');
  609. }
  610. const match = newVal.match(/^(\d+)(\.\d{0,9})?/);
  611. if (val == 'qualifiedNumber') {
  612. this.form.qualifiedNumber = match ? match[0] : '';
  613. }
  614. if (val == 'noQualifiedNumber') {
  615. this.form.noQualifiedNumber = match ? match[0] : '';
  616. }
  617. // this.form[val] =
  618. // this.form[val].replace(/[^\d]/g, '').replace(/^0+/, '') || '0';
  619. },
  620. // *** 计算合格数 不合格数
  621. quantityCalculation(e, noSetSampleList) {
  622. console.log(this.form, '执行没有');
  623. // return
  624. let qualifiedNumber = this.form.qualifiedNumber - 0;
  625. let noQualifiedNumber = this.form.noQualifiedNumber - 0;
  626. let total = this.form.total - 0;
  627. let val =
  628. e == 'qualifiedNumber' ? 'noQualifiedNumber' : 'qualifiedNumber';
  629. if (this.form[e] > this.form.total) {
  630. this.form[e] = this.form.total - this.form[val];
  631. this.$message.warning('合格数与不合格数不能大于总数量');
  632. return;
  633. }
  634. this.form[val] = this.form.total - this.form[e];
  635. if (e == 'qualifiedNumber') {
  636. noQualifiedNumber = total - this.form.qualifiedNumber;
  637. }
  638. if (e == 'noQualifiedNumber') {
  639. qualifiedNumber = total - this.form.noQualifiedNumber;
  640. }
  641. let passRate = ((qualifiedNumber / total) * 100).toFixed(2);
  642. let failureRate = ((noQualifiedNumber / total) * 100).toFixed(2);
  643. this.form.qualificationRate = passRate + '%';
  644. this.form.noQualificationRate = failureRate + '%';
  645. if (
  646. this.form.qualityMode == 1 &&
  647. this.form.isUnpack == 2 &&
  648. !noSetSampleList
  649. ) {
  650. this.$emit('quantityCalculation', qualifiedNumber);
  651. }
  652. return true;
  653. },
  654. deepCopy(obj, hash = new WeakMap()) {
  655. if (obj === null) return null;
  656. if (obj instanceof Date) return new Date(obj);
  657. if (obj instanceof RegExp) return new RegExp(obj);
  658. if (typeof obj !== 'object' && typeof obj !== 'function') return obj;
  659. if (hash.has(obj)) return hash.get(obj); // 处理循环引用
  660. const result = Array.isArray(obj) ? [] : {};
  661. hash.set(obj, result); // 存储原始对象和其副本的映射关系
  662. return Object.keys(obj).reduce((acc, key) => {
  663. acc[key] = this.deepCopy(obj[key], hash);
  664. return acc;
  665. }, result);
  666. },
  667. toggleExpand() {
  668. this.isExpanded = !this.isExpanded;
  669. },
  670. toggleExpand2() {
  671. this.isExpanded = true;
  672. this.$nextTick(() => {
  673. this.$refs.form1.validateField('qualityResults');
  674. });
  675. },
  676. async getDictListIqoCode(code) {
  677. let { data: res } = await getByCode(code);
  678. this.inspectionStandardsList = res.map((item) => {
  679. let values = Object.keys(item);
  680. return {
  681. value: Number(values[0]),
  682. label: item[values[0]]
  683. };
  684. });
  685. },
  686. async getQualityModeList(code) {
  687. let { data: res } = await getByCode(code);
  688. this.qualityModeList = res.map((item) => {
  689. let values = Object.keys(item);
  690. return {
  691. value: Number(values[0]),
  692. label: item[values[0]]
  693. };
  694. });
  695. },
  696. // 打开工艺路线弹窗
  697. openVersion() {
  698. this.$refs.versionRefs.open();
  699. },
  700. //工艺路线回调
  701. changeProduct(data) {
  702. this.form.produceRoutingId = data.id;
  703. this.form.produceRoutingName = data.name;
  704. this.form.produceTaskId = '';
  705. this.form.produceTaskName = '';
  706. this.getTaskList();
  707. },
  708. // 获取工序数据
  709. async getTaskList() {
  710. if (!this.form.produceRoutingId) {
  711. return;
  712. }
  713. const res = await getProduceTaskList({
  714. isDetail: true,
  715. pageNum: 1,
  716. routingId: this.form.produceRoutingId,
  717. size: -1
  718. });
  719. this.produceTaskList = res?.list;
  720. },
  721. // 选择工序
  722. produceTaskChange() {
  723. if (!this.form.produceTaskId) {
  724. return;
  725. }
  726. this.form.produceTaskName = this.produceTaskList.find(
  727. (item) => item.id == this.form.produceTaskId
  728. ).name;
  729. },
  730. // 产品名称
  731. addProduct() {
  732. this.$refs.equipmentRefs.open();
  733. },
  734. choose(data) {
  735. this.form.productCode = data[0].code;
  736. this.form.productName = data[0].name;
  737. this.form.specification = data[0].specification;
  738. this.form.modelType = data[0].modelType;
  739. this.form.brandNo = data[0].brandNum;
  740. },
  741. //选择部门(搜索)
  742. searchDeptNodeClick(info, row) {
  743. this.form.executeUserId = '';
  744. this.$set(this.form, 'executeUserName', ' item.name');
  745. this.$set(this.form, 'executeUserIdList', '');
  746. if (info) {
  747. const params = { groupId: info };
  748. this.getUserList(params);
  749. this.form.executeDeptName = row.name;
  750. } else {
  751. this.form.executeDeptId = null;
  752. this.form.executeDeptName = null;
  753. }
  754. },
  755. // 获取人员
  756. async getUserList(params) {
  757. try {
  758. let data = { pageNum: 1, size: -1 };
  759. // 如果传了参数就是获取巡点检人员数据
  760. if (params) {
  761. data = Object.assign(data, params);
  762. }
  763. const res = await getUserPage(data);
  764. this.executorList = (res && res.list) || [];
  765. } catch (error) {}
  766. },
  767. /* 默认执行部门=当前登录用户所属公司, 默认执行人=当前登录用户 */
  768. async setDefaultExecuteInfo() {
  769. const userInfo = this.$store?.state?.user?.info;
  770. if (!userInfo || !userInfo.userId) {
  771. return;
  772. }
  773. // 班组模式下执行人由班组决定, 检验方案模式下没有执行部门, 均不处理
  774. if (this.form.assignType == 1 || this.form.qualityType == 2) {
  775. return;
  776. }
  777. // 执行人: 未指定时默认当前登录用户
  778. // 注意: 不能依赖执行部门是否取到公司, 否则公司查不到时执行人也不会默认值
  779. if (
  780. !this.form.executeUserIdList ||
  781. !this.form.executeUserIdList.length
  782. ) {
  783. this.$set(this.form, 'executeUserIdList', [userInfo.userId]);
  784. this.$set(this.form, 'executeUserName', userInfo.name);
  785. this.$set(this.form, 'executeUserId', String(userInfo.userId));
  786. }
  787. // 执行部门: 未指定时默认当前登录用户所属公司
  788. if (!this.form.executeDeptId) {
  789. let company = null;
  790. try {
  791. company = await getCurrentUserCompany(userInfo);
  792. } catch (e) {
  793. company = null;
  794. }
  795. if (company) {
  796. this.$set(this.form, 'executeDeptId', company.id);
  797. this.$set(this.form, 'executeDeptName', company.name);
  798. // 执行部门变了, 人员范围跟着变
  799. await this.getUserList({ groupId: company.id });
  800. }
  801. }
  802. },
  803. // 人员选择
  804. changeExecutor(val) {
  805. this.$set(this.form, 'qualityIdList', val);
  806. if (val.length) {
  807. this.form.qualityName = val
  808. .map(
  809. (item) =>
  810. this.executorOptions.find((item2) => item2.id == item)?.name
  811. )
  812. .join(',');
  813. } else {
  814. this.form.qualityName = '';
  815. }
  816. this.$forceUpdate();
  817. },
  818. // 人员选择
  819. executeUserIdChange(val) {
  820. if (val.length) {
  821. let arr =
  822. this.form.qualityType == 2
  823. ? this.form.jobList.find(
  824. (job) => job.id == this.form.executeJobId
  825. )?.userVOList
  826. : this.executorOptions;
  827. this.form.executeUserName = val
  828. .map((item) => arr?.find((item2) => item2.id == item)?.name)
  829. .join(',');
  830. } else {
  831. this.form.executeUserName = '';
  832. }
  833. this.$forceUpdate();
  834. },
  835. inputTotal(val) {
  836. if (val) {
  837. this.form.total = val;
  838. this.form.qualifiedNumber = val;
  839. }
  840. },
  841. handleChangeNumber(val) {
  842. this.form.sampleNumber = val;
  843. this.$emit('changeNumber', val);
  844. },
  845. //更新合格率
  846. updateQualificationRate(
  847. qualifiedNumber,
  848. noQualifiedNumber,
  849. qualificationRate,
  850. noQualificationRate
  851. ) {
  852. this.form.qualifiedNumber = qualifiedNumber;
  853. this.form.noQualifiedNumber = noQualifiedNumber;
  854. this.form.qualificationRate = qualificationRate + '%';
  855. this.form.noQualificationRate = noQualificationRate + '%';
  856. },
  857. //解决换检验方式的时候
  858. changeQualityMode(val) {
  859. if (val) {
  860. this.$emit('changeModel', val);
  861. } else {
  862. this.$emit('table2');
  863. }
  864. },
  865. //抽检需要重新计算
  866. selectResult() {
  867. console.log(this.form.qualityMode, 'this.form.qualityMode');
  868. if (this.form.qualityMode == 2) {
  869. this.$emit('quantityAssignment');
  870. }
  871. },
  872. setQualityResults(val) {
  873. this.form.qualityResults = val;
  874. this.selectResult();
  875. }
  876. }
  877. };
  878. </script>
  879. <style lang="scss" scoped></style>