baseInfo.vue 20 KB

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