baseInfo.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  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 label="质检部门" prop="groupId">
  113. <deptSelect
  114. :disabled="btnType == 'detail'"
  115. v-model="form.groupId"
  116. @changeGroup="searchDeptNodeClick"
  117. />
  118. </el-form-item>
  119. </el-col>
  120. <el-col :span="6">
  121. <el-form-item label="质检人" prop="qualityId">
  122. <el-select
  123. :disabled="btnType == 'detail'"
  124. v-model="form.qualityId"
  125. @change="changeExecutor"
  126. size="small"
  127. style="width: 100%"
  128. filterable
  129. >
  130. <el-option
  131. v-for="item in executorList"
  132. :key="item.id"
  133. :value="item.id"
  134. :label="item.name"
  135. ></el-option>
  136. </el-select>
  137. </el-form-item>
  138. </el-col>
  139. <el-col :span="6">
  140. <el-form-item label="质检时间:" prop="qualityTime">
  141. <el-date-picker
  142. class="w100"
  143. v-model="form.qualityTime"
  144. type="date"
  145. value-format="yyyy-MM-dd"
  146. :disabled="btnType == 'detail'"
  147. placeholder="请选择"
  148. ></el-date-picker>
  149. </el-form-item>
  150. </el-col>
  151. <el-col :span="6">
  152. <el-form-item label="工时(h):" prop="hours">
  153. <el-input
  154. v-model="form.hours"
  155. :disabled="btnType == 'detail'"
  156. ></el-input>
  157. </el-form-item>
  158. </el-col>
  159. </el-row>
  160. <el-row>
  161. <el-col :span="6">
  162. <el-form-item
  163. label="合格数:"
  164. prop="qualifiedNumber"
  165. v-if="showArrange == '1'"
  166. >
  167. <el-input
  168. type="number"
  169. :min="0"
  170. @input="limitation('qualifiedNumber')"
  171. @blur="quantityCalculation('qualifiedNumber')"
  172. v-model="form.qualifiedNumber"
  173. placeholder="请输入"
  174. ></el-input>
  175. </el-form-item>
  176. </el-col>
  177. <el-col :span="6">
  178. <el-form-item
  179. label="不合格数:"
  180. prop="noQualifiedNumber"
  181. v-if="showArrange == '1'"
  182. >
  183. <el-input
  184. type="number"
  185. :min="0"
  186. @input="limitation('noQualifiedNumber')"
  187. @blur="quantityCalculation('noQualifiedNumber')"
  188. v-model="form.noQualifiedNumber"
  189. placeholder="请输入"
  190. ></el-input>
  191. </el-form-item>
  192. </el-col>
  193. <el-col :span="6">
  194. <el-form-item label="合格率:" prop="qualificationRate">
  195. <el-input v-model="form.qualificationRate" disabled />
  196. </el-form-item>
  197. </el-col>
  198. <el-col :span="6">
  199. <el-form-item label="不合格率:" prop="noQualificationRate">
  200. <el-input v-model="form.noQualificationRate" disabled />
  201. </el-form-item>
  202. </el-col>
  203. <el-col :span="6">
  204. <el-form-item label="检验方式:" prop="qualityMode">
  205. <!-- <DictSelection dictName="取样类型" v-model="form.qualityMode" :disabled="qualityType == 1"></DictSelection> -->
  206. <el-select
  207. @change="changeQualityMode"
  208. style="width: 100%"
  209. v-model="form.qualityMode"
  210. placeholder="请选择"
  211. >
  212. <!-- :disabled="
  213. parseInt(qualityType1) == 1 || parseInt(qualityType1) == 3
  214. " -->
  215. <el-option
  216. v-for="item in qualityModeList"
  217. :label="item.label"
  218. :value="item.value"
  219. :key="item.value"
  220. ></el-option>
  221. </el-select>
  222. </el-form-item>
  223. </el-col>
  224. <el-col :span="6">
  225. <!-- <el-form-item label="质检结果:" prop="qualityResults" v-if="form.qualityMode == 2"> -->
  226. <el-form-item label="质检结果:" prop="qualityResults">
  227. <!-- :disabled="btnType == 'detail'" -->
  228. <el-select
  229. v-model="form.qualityResults"
  230. placeholder="请选择"
  231. style="width: 100%"
  232. :disabled="showArrange == '0'"
  233. >
  234. <el-option label="合格" :value="1" />
  235. <el-option label="不合格" :value="2" />
  236. </el-select>
  237. </el-form-item>
  238. </el-col>
  239. <el-col :span="6">
  240. <el-form-item label="总重量:" prop="totalWeight">
  241. <el-input
  242. type="number"
  243. :disabled="btnType == 'detail'"
  244. v-model="form.totalWeight"
  245. />
  246. </el-form-item>
  247. </el-col>
  248. <el-col :span="6">
  249. <el-form-item label="总数量:" prop="total">
  250. <el-input
  251. type="number"
  252. v-model="form.total"
  253. @input="inputTotal"
  254. disabled
  255. />
  256. </el-form-item>
  257. </el-col>
  258. <el-col :span="showArrange == '1' ? 24 : 12">
  259. <el-form-item label="备注:" prop="remark">
  260. <el-input
  261. type="textarea"
  262. v-model="form.remark"
  263. placeholder="请输入"
  264. :disabled="btnType == 'detail'"
  265. />
  266. </el-form-item>
  267. </el-col>
  268. <!-- <el-col :span="6" v-if="btnType != 'detail'">
  269. <el-form-item label="取样数量:" prop="sampleNumber" :rules="{
  270. required: form.qualityMode == 2 ? true : false,
  271. message: '请输入取样数量',
  272. trigger: 'blur'
  273. }" v-if="form.qualityMode == 2">
  274. <div style="display: flex;align-items: center;justify-content: space-between;">
  275. <el-input type="number"
  276. :disabled="form.qualityMode == null || form.qualityMode == 1 || (form.qualityMode == 2 && form.sampleNumber) ? true : false"
  277. v-model="form.sampleNumber" @change="handleChangeNumber" style="width: calc(100% - 90px)" />
  278. <DictSelection dictName="计量单位" clearable v-model="form.sampleMeasureUnit" disabled size="mini"
  279. style="width: 90px;margin-left: 12px;">
  280. </DictSelection>
  281. </div>
  282. </el-form-item>
  283. </el-col>-->
  284. <!-- <el-col :span="6" v-if="btnType != 'detail'">
  285. <el-form-item label="取样数量:" prop="sampleNumber" :rules="{
  286. required: form.qualityMode == 2 ? true : false,
  287. message: '请输入取样数量',
  288. trigger: 'blur'
  289. }" v-if="form.qualityMode == 2">
  290. <div style="display: flex;align-items: center;justify-content: space-between;">
  291. <el-input type="number"
  292. :disabled="form.qualityMode == null || form.qualityMode == 1 || (form.qualityMode == 2 && form.sampleNumber) ? true : false"
  293. v-model="form.sampleNumber" @change="handleChangeNumber" style="width: calc(100% - 90px)" />
  294. <DictSelection dictName="计量单位" clearable v-model="form.sampleMeasureUnit" disabled size="mini"
  295. style="width: 90px;margin-left: 12px;">
  296. </DictSelection>
  297. </div>
  298. </el-form-item>
  299. </el-col>-->
  300. <!-- <el-col :span="6">
  301. <el-form-item label="合格证号:" prop="certificateNumber">
  302. <el-input
  303. v-model="form.certificateNumber"
  304. :disabled="btnType == 'detail'"
  305. placeholder="请输入"
  306. ></el-input>
  307. </el-form-item>
  308. </el-col> -->
  309. <el-col :span="6" v-if="parseInt(qualityType1) == 2">
  310. <el-form-item label="工艺路线:">
  311. <el-input
  312. @click.native="openVersion"
  313. clearable
  314. v-model="form.produceRoutingName"
  315. :disabled="btnType == 'detail'"
  316. placeholder="请选择"
  317. />
  318. </el-form-item>
  319. </el-col>
  320. <el-col :span="6" v-if="parseInt(qualityType1) == 2">
  321. <el-form-item label="工序:">
  322. <el-select
  323. style="width: 100%"
  324. v-model="form.produceTaskId"
  325. placeholder="请选择"
  326. clearable
  327. @change="produceTaskChange"
  328. :disabled="btnType == 'detail'"
  329. >
  330. <el-option
  331. v-for="item in produceTaskList"
  332. :key="item.id"
  333. :label="item.name"
  334. :value="item.id"
  335. ></el-option>
  336. </el-select>
  337. </el-form-item>
  338. </el-col>
  339. <!-- <el-col :span="6">
  340. <el-form-item label="质检类型:">
  341. <el-input
  342. v-model="form.certificateNumber"
  343. disabled
  344. placeholder="请输入"
  345. ></el-input>
  346. </el-form-item>
  347. </el-col> -->
  348. <!-- 总数量 减去 样品数量 *** -->
  349. <!-- -->
  350. <!-- <el-col :span="6">
  351. <el-form-item label="质检结果数量:" prop="resultsTotal">
  352. <el-input
  353. type="number"
  354. v-model="form.resultsTotal"
  355. @input="inputTotal"
  356. disabled
  357. />
  358. </el-form-item>
  359. </el-col> -->
  360. <el-col :span="8">
  361. <el-form-item label="附件:" prop="accessory">
  362. <fileUpload
  363. v-model="form.accessory"
  364. :type="btnType == 'detail' ? 'view' : ''"
  365. />
  366. </el-form-item>
  367. </el-col>
  368. </el-row>
  369. </div>
  370. <ProductionVersion ref="versionRefs" @changeProduct="changeProduct" />
  371. <EquipmentDialog ref="equipmentRefs" @choose="choose" />
  372. </el-form>
  373. </template>
  374. <script>
  375. import deptSelect from '@/components/CommomSelect/dept-select.vue';
  376. import fileUpload from '@/components/addDoc/index.vue';
  377. import ProductionVersion from './ProductionVersion.vue';
  378. import EquipmentDialog from './EquipmentDialog.vue';
  379. //接口
  380. import { getUserPage } from '@/api/system/organization';
  381. import { getProduceTaskList } from '@/api/aps';
  382. import { getByCode } from '@/api/system/dictionary-data';
  383. import { parameterGetByCode } from '@/api/main/index';
  384. export default {
  385. components: {
  386. EquipmentDialog,
  387. ProductionVersion,
  388. deptSelect,
  389. fileUpload
  390. },
  391. props: {
  392. form: {
  393. type: Object,
  394. default: () => {}
  395. },
  396. btnType: {
  397. type: String,
  398. default: ''
  399. },
  400. qualityType1: {
  401. type: String,
  402. default: ''
  403. },
  404. sampleList: {
  405. type: Array,
  406. default: () => []
  407. }
  408. },
  409. watch: {
  410. // 'form.qualityMode': {
  411. // handler(newVal) {
  412. // if (newVal) {
  413. // this.$emit('changeModel', newVal);
  414. // } else {
  415. // console.log('清空样品清单');
  416. // // this.$emit('table2');
  417. // }
  418. // },
  419. // immediate: false
  420. // },
  421. // 'form.inspectionStandards': {
  422. // handler(newVal) {
  423. // if (newVal && this.qualityType1 == 2) {
  424. // this.$emit('changeInspectionStandardsModel', newVal);
  425. // } else {
  426. // console.log('清空样品清单');
  427. // // this.$emit('table2');
  428. // }
  429. // },
  430. // immediate: false
  431. // },
  432. // 新增 *** 监听合格率更改 质检结果
  433. // 'form.qualificationRate': {
  434. // handler(newVal) {
  435. // if (newVal == '100.00%' || newVal == '100%' || newVal == '100.0%') {
  436. // this.$set(this.form, 'qualityResults', 1);
  437. // } else {
  438. // this.$set(this.form, 'qualityResults', 2);
  439. // // this.$emit('table2');
  440. // }
  441. // },
  442. // immediate: false,
  443. // deep: true
  444. // }
  445. },
  446. data() {
  447. return {
  448. executorList: [],
  449. sourceList: [],
  450. rules: {
  451. productName: [
  452. { required: true, message: '请选择产品', trigger: 'change' }
  453. ],
  454. // qualifiedNumber: [
  455. // { required: true, message: '请输入合格数', trigger: 'blur' }
  456. // ],
  457. // noQualifiedNumber: [
  458. // { required: true, message: '请输入不合格数', trigger: 'blur' }
  459. // ],
  460. qualityTime: [
  461. { required: true, message: '请选择质检时间', trigger: 'blur' }
  462. ],
  463. groupId: [
  464. { required: true, message: '请选择质检部门', trigger: 'change' }
  465. ],
  466. qualityId: [
  467. { required: true, message: '请选择质检人', trigger: 'change' }
  468. ],
  469. qualityResults: [{ required: true, message: '', trigger: 'change' }],
  470. inspectionStandards: [
  471. { required: true, message: '请选择检验标准', trigger: 'change' }
  472. ]
  473. },
  474. produceTaskList: [],
  475. inspectionStandardsList: [],
  476. qualityModeList: [],
  477. isExpanded: false,
  478. showArrange: '1'
  479. };
  480. },
  481. created() {
  482. this.getDictListIqoCode('measurement_type');
  483. this.getQualityModeList('quality_method_code');
  484. // 是否展示合格不合格
  485. this.getCode();
  486. },
  487. methods: {
  488. getCode() {
  489. parameterGetByCode({
  490. code: 'qms_show_arrange'
  491. }).then((res) => {
  492. if (res) {
  493. this.showArrange = res.value || '1';
  494. // this.time_calc_code = res.value || '0';
  495. }
  496. });
  497. },
  498. // *** 只能输入大于0的数字
  499. limitation(val) {
  500. this.form[val] =
  501. this.form[val].replace(/[^\d]/g, '').replace(/^0+/, '') || '0';
  502. },
  503. // *** 计算合格数 不合格数
  504. quantityCalculation(e) {
  505. let qualifiedNumber = this.form.qualifiedNumber - 0;
  506. let noQualifiedNumber = this.form.noQualifiedNumber - 0;
  507. let total = qualifiedNumber + noQualifiedNumber;
  508. if (total != this.form.total) {
  509. let val =
  510. e == 'qualifiedNumber' ? 'noQualifiedNumber' : 'qualifiedNumber';
  511. this.$message.warning('合格数加上不合格数需要等于总数量');
  512. this.form[e] = this.form.total - this.form[val];
  513. return false;
  514. }
  515. let passRate = ((qualifiedNumber / total) * 100).toFixed(2);
  516. let failureRate = ((noQualifiedNumber / total) * 100).toFixed(2);
  517. this.form.qualificationRate = passRate + '%';
  518. this.form.noQualificationRate = failureRate + '%';
  519. return true;
  520. },
  521. toggleExpand() {
  522. this.isExpanded = !this.isExpanded;
  523. },
  524. toggleExpand2() {
  525. this.isExpanded = true;
  526. this.$nextTick(() => {
  527. this.$refs.form1.validateField('qualityResults');
  528. });
  529. },
  530. async getDictListIqoCode(code) {
  531. let { data: res } = await getByCode(code);
  532. this.inspectionStandardsList = res.map((item) => {
  533. let values = Object.keys(item);
  534. return {
  535. value: Number(values[0]),
  536. label: item[values[0]]
  537. };
  538. });
  539. },
  540. async getQualityModeList(code) {
  541. let { data: res } = await getByCode(code);
  542. this.qualityModeList = res.map((item) => {
  543. let values = Object.keys(item);
  544. return {
  545. value: Number(values[0]),
  546. label: item[values[0]]
  547. };
  548. });
  549. },
  550. // 打开工艺路线弹窗
  551. openVersion() {
  552. this.$refs.versionRefs.open();
  553. },
  554. //工艺路线回调
  555. changeProduct(data) {
  556. this.form.produceRoutingId = data.id;
  557. this.form.produceRoutingName = data.name;
  558. this.form.produceTaskId = '';
  559. this.form.produceTaskName = '';
  560. this.getTaskList();
  561. },
  562. // 获取工序数据
  563. async getTaskList() {
  564. if (!this.form.produceRoutingId) {
  565. return;
  566. }
  567. const res = await getProduceTaskList({
  568. isDetail: true,
  569. pageNum: 1,
  570. routingId: this.form.produceRoutingId,
  571. size: -1
  572. });
  573. this.produceTaskList = res?.list;
  574. },
  575. // 选择工序
  576. produceTaskChange() {
  577. if (!this.form.produceTaskId) {
  578. return;
  579. }
  580. this.form.produceTaskName = this.produceTaskList.find(
  581. (item) => item.id == this.form.produceTaskId
  582. ).name;
  583. },
  584. // 产品名称
  585. addProduct() {
  586. this.$refs.equipmentRefs.open();
  587. },
  588. choose(data) {
  589. this.form.productCode = data[0].code;
  590. this.form.productName = data[0].name;
  591. this.form.specification = data[0].specification;
  592. this.form.modelType = data[0].modelType;
  593. this.form.brandNo = data[0].brandNum;
  594. },
  595. //选择部门(搜索)
  596. searchDeptNodeClick(info, row) {
  597. if (info) {
  598. const params = { groupId: info };
  599. this.getUserList(params);
  600. this.form.groupName = row.name;
  601. } else {
  602. this.form.executeGroupId = null;
  603. }
  604. },
  605. // 获取人员
  606. async getUserList(params) {
  607. try {
  608. let data = { pageNum: 1, size: -1 };
  609. // 如果传了参数就是获取巡点检人员数据
  610. if (params) {
  611. data = Object.assign(data, params);
  612. }
  613. const res = await getUserPage(data);
  614. this.executorList = res.list;
  615. } catch (error) {}
  616. },
  617. // 人员选择
  618. changeExecutor(val) {
  619. if (val) {
  620. this.form.qualityId = val;
  621. this.form.qualityName = this.executorList.filter(
  622. (item) => item.id === val
  623. )[0].name;
  624. }
  625. },
  626. inputTotal(val) {
  627. if (val) {
  628. this.form.total = val;
  629. this.form.qualifiedNumber = val;
  630. }
  631. },
  632. handleChangeNumber(val) {
  633. this.form.sampleNumber = val;
  634. this.$emit('changeNumber', val);
  635. },
  636. //更新合格率
  637. updateQualificationRate(
  638. qualifiedNumber,
  639. noQualifiedNumber,
  640. qualificationRate,
  641. noQualificationRate
  642. ) {
  643. this.form.qualifiedNumber = qualifiedNumber;
  644. this.form.noQualifiedNumber = noQualifiedNumber;
  645. this.form.qualificationRate = qualificationRate + '%';
  646. this.form.noQualificationRate = noQualificationRate + '%';
  647. },
  648. //解决换检验方式的时候
  649. changeQualityMode(val) {
  650. if (val) {
  651. this.$emit('changeModel', val);
  652. } else {
  653. this.$emit('table2');
  654. }
  655. }
  656. }
  657. };
  658. </script>
  659. <style lang="scss" scoped></style>