user-edit.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="1000px"
  5. :visible="visible"
  6. :append-to-body="true"
  7. :close-on-click-modal="false"
  8. custom-class="ele-dialog-form"
  9. :title="isUpdate ? '修改质检项' : '新建质检项'"
  10. @update:visible="updateVisible"
  11. :maxable="true"
  12. >
  13. <header-title title="基本信息"></header-title>
  14. <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  15. <el-row>
  16. <el-col :span="12">
  17. <el-form-item label="标准名称:" prop="qualityStandardId">
  18. <el-select
  19. v-model="form.qualityStandardId"
  20. placeholder="请选择"
  21. filterable
  22. style="width: 100%"
  23. >
  24. <el-option
  25. :label="item.name"
  26. v-for="item in qualityStandardList"
  27. :key="item.id"
  28. :value="item.id"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. </el-col>
  33. <el-col :span="12">
  34. <el-form-item label="参数编码:" prop="inspectionCode">
  35. <el-input
  36. clearable
  37. disabled
  38. v-model="form.inspectionCode"
  39. placeholder="请输入"
  40. />
  41. </el-form-item>
  42. </el-col>
  43. </el-row>
  44. <el-row>
  45. <el-col :span="12">
  46. <el-form-item label="参数名称:" prop="inspectionName">
  47. <el-input
  48. v-model="form.inspectionName"
  49. clearable
  50. placeholder="请输入"
  51. />
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="12">
  55. <el-form-item label="参数类型:" prop="textType">
  56. <el-select
  57. v-model="form.textType"
  58. placeholder="请选择"
  59. class="ele-block"
  60. style="width: 100%"
  61. @change="textTypeChange"
  62. >
  63. <el-option label="数值" :value="'1'" />
  64. <el-option label="选择" :value="'2'" />
  65. <el-option label="上下限" :value="'3'" />
  66. <el-option label="规格" :value="'4'" />
  67. <el-option label="时间" :value="'5'" />
  68. <el-option label="范围" :value="'6'" />
  69. <el-option label="文本" :value="'7'" />
  70. </el-select>
  71. </el-form-item>
  72. </el-col>
  73. <el-col
  74. :span="12"
  75. v-if="
  76. form.textType == 1 ||
  77. form.textType == 3 ||
  78. form.textType == 4 ||
  79. form.textType == 5
  80. "
  81. >
  82. <el-form-item label="默认值:">
  83. <DictSelection
  84. style="width: 100px"
  85. clearable
  86. dictName="数学字符"
  87. v-model="form.symbol"
  88. ></DictSelection>
  89. <el-input
  90. v-model="form.defaultValue"
  91. :placeholder="form.textType == '1' ? '请输入数字' : '请输入'"
  92. style="width: calc(100% - 100px)"
  93. @input="defaultInput"
  94. ></el-input>
  95. </el-form-item>
  96. </el-col>
  97. <el-col :span="24" v-if="form.textType == 7">
  98. <el-form-item label="默认值:" prop="defaultValue">
  99. <el-input v-model="form.defaultValue" type="textarea"> </el-input>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="12" v-if="form.textType == 2">
  103. <el-form-item label="默认值:" prop="defaultValue">
  104. <DictSelection
  105. style="width: 100px"
  106. clearable
  107. dictName="数学字符"
  108. v-model="form.symbol"
  109. ></DictSelection>
  110. <el-select
  111. v-model="form.defaultValue"
  112. placeholder="请选择"
  113. class="ele-block"
  114. >
  115. <!-- style="width: calc(100% - 100px)" -->
  116. <el-option label="TRUE" :value="'TRUE'" />
  117. <el-option label="FALSE" :value="'FALSE'" />
  118. </el-select>
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="12" v-if="form.textType == 6">
  122. <el-form-item label="默认值:">
  123. <DictSelection
  124. style="width: 100px"
  125. clearable
  126. dictName="数学字符"
  127. v-model="form.symbol"
  128. ></DictSelection>
  129. <el-input
  130. v-model="form.defaultValue"
  131. placeholder="案例: 12.7≤IC<19.05 ;IC<12.7"
  132. style="width: calc(100% - 100px)"
  133. ></el-input>
  134. </el-form-item>
  135. </el-col>
  136. <el-col :span="12" v-if="form.textType == 3">
  137. <el-form-item label="参数上限:">
  138. <el-input placeholder="请输入" v-model="form.maxValue" />
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="12" v-if="form.textType == 3">
  142. <el-form-item label="参数下限:">
  143. <el-input placeholder="请输入" v-model="form.minValue" />
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="12" v-if="form.textType != 2 && form.textType != 5">
  147. <el-form-item
  148. label="参数单位:"
  149. prop="unitName"
  150. :rules="[
  151. {
  152. required: form.textType == 7 ? false : true,
  153. message: '请选择参数单位',
  154. trigger: 'change'
  155. }
  156. ]"
  157. >
  158. <DictSelection
  159. dictName="工艺参数单位"
  160. clearable
  161. filterable
  162. v-model="form.unitName"
  163. >
  164. </DictSelection>
  165. </el-form-item>
  166. </el-col>
  167. <el-col :span="12" v-if="form.textType == 5">
  168. <el-form-item label="参数单位:" prop=""> h(小时) </el-form-item>
  169. </el-col>
  170. <!-- <el-col :span="24" v-if="form.textType != 7">
  171. <el-form-item label="文本描述:" prop="inspectionStandard">
  172. <el-input v-model="form.inspectionStandard" type="textarea">
  173. </el-input>
  174. </el-form-item>
  175. </el-col> -->
  176. <!-- <el-col :span="12">
  177. <el-form-item label="单位:" prop="unit">
  178. <DictSelection
  179. clearable
  180. dictName="质检项标准单位"
  181. v-model="form.unit"
  182. ></DictSelection>
  183. </el-form-item>
  184. </el-col> -->
  185. <el-col :span="12">
  186. <el-form-item label="状态:" prop="status">
  187. <el-select
  188. v-model="form.status"
  189. placeholder="请选择"
  190. style="width: 100%"
  191. >
  192. <el-option label="停用" :value="0" />
  193. <el-option label="启用" :value="1" />
  194. </el-select>
  195. </el-form-item>
  196. </el-col>
  197. <el-col :span="12">
  198. <el-form-item label="质检阶段:" prop="qualityStage">
  199. <el-select
  200. v-model="form.qualityStage"
  201. placeholder="请选择"
  202. filterable
  203. style="width: 100%"
  204. >
  205. <el-option
  206. :label="item.label"
  207. v-for="item in qualityStageList"
  208. :key="item.value"
  209. :value="item.value"
  210. />
  211. </el-select>
  212. </el-form-item>
  213. </el-col>
  214. <el-col :span="24">
  215. <el-form-item label="备注:" prop="inspectionRemark">
  216. <el-input
  217. placeholder="请输入"
  218. v-model="form.inspectionRemark"
  219. type="textarea"
  220. />
  221. </el-form-item>
  222. </el-col>
  223. <el-col :span="12">
  224. <el-form-item label="附件:" prop="imgUrl">
  225. <fileUpload v-model="form.imgUrl" type="add" />
  226. </el-form-item>
  227. </el-col>
  228. </el-row>
  229. <headerTitle title="质检工具">
  230. <el-button type="primary" size="small" @click="handleAdd"
  231. >新增</el-button
  232. >
  233. </headerTitle>
  234. <el-table
  235. ref="multipleTable"
  236. :data="form.toolList"
  237. tooltip-effect="dark"
  238. style="width: 100%"
  239. stripe
  240. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  241. >
  242. <el-table-column label="设备名称" prop="code" min-width="120">
  243. <template slot-scope="{ row }">
  244. {{ row.name }}
  245. </template></el-table-column
  246. >
  247. <el-table-column label="设备编码" prop="code" min-width="120">
  248. <template slot-scope="{ row }">
  249. {{ row.code }}
  250. </template></el-table-column
  251. >
  252. <el-table-column label="牌号" prop="brandNum" min-width="120">
  253. <template slot-scope="{ row }">
  254. {{ row.brandNum }}
  255. </template></el-table-column
  256. >
  257. <el-table-column label="型号" prop="modelType" min-width="120">
  258. <template slot-scope="{ row }">
  259. {{ row.modelType }}
  260. </template></el-table-column
  261. >
  262. <el-table-column label="操作" fixed="right">
  263. <template slot-scope="{ $index, row }">
  264. <el-button type="text" @click="removeItem($index, row)"
  265. >删除设备</el-button
  266. >
  267. </template>
  268. </el-table-column>
  269. </el-table>
  270. <headerTitle title="注意事项">
  271. <el-button type="primary" size="small" @click="addPostscript"
  272. >新增</el-button
  273. >
  274. </headerTitle>
  275. <el-table
  276. ref="multipleTable"
  277. :data="form.postscriptList"
  278. tooltip-effect="dark"
  279. style="width: 100%"
  280. stripe
  281. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  282. >
  283. <el-table-column label="排序" prop="" width="140">
  284. <template slot-scope="{ row }">
  285. <el-input
  286. placeholder="请输入"
  287. type="number"
  288. v-model.number="row.sort"
  289. clearable
  290. ></el-input> </template
  291. ></el-table-column>
  292. <el-table-column label="注意事项" prop="" min-width="120">
  293. <template slot-scope="{ row }">
  294. <el-input
  295. placeholder="请输入"
  296. type="textarea"
  297. :rows="1"
  298. v-model="row.content"
  299. clearable
  300. ></el-input> </template
  301. ></el-table-column>
  302. <el-table-column label="操作" fixed="right" width="100">
  303. <template slot-scope="{ $index, row }">
  304. <el-button type="text" @click="removePostscript($index, row)"
  305. >删除</el-button
  306. >
  307. </template>
  308. </el-table-column>
  309. </el-table>
  310. </el-form>
  311. <template v-slot:footer>
  312. <el-button @click="updateVisible(false)">取消</el-button>
  313. <el-button type="primary" :loading="loading" @click="save">
  314. 保存
  315. </el-button>
  316. </template>
  317. <ProductModal ref="productRefs" @chooseModal="chooseModal" />
  318. </ele-modal>
  319. </template>
  320. <script>
  321. import { save, update, getById } from '@/api/inspectionProject';
  322. import { getCode } from '@/api/login';
  323. import { getList } from '@/api/inspectionStandard';
  324. import ProductModal from './ProductModal.vue';
  325. import fileUpload from '@/components/addDoc/index.vue';
  326. export default {
  327. components: {
  328. ProductModal,
  329. fileUpload
  330. },
  331. props: {
  332. // 弹窗是否打开
  333. visible: Boolean,
  334. // 修改回显的数据
  335. data: Object
  336. },
  337. data() {
  338. const defaultForm = {
  339. id: null,
  340. qualityStandardId: '',
  341. inspectionCode: '',
  342. inspectionName: '',
  343. textType: '1',
  344. qualityStage: '',
  345. defaultValue: '',
  346. maxValue: '',
  347. minValue: '',
  348. unitName: '',
  349. status: 1,
  350. inspectionStandard: '',
  351. unit: '',
  352. symbol: '',
  353. inspectionRemark: '',
  354. imgUrl: [],
  355. toolList: [],
  356. postscriptList: [],
  357. toolRemoveIds: [],
  358. postscriptRemoveIds: []
  359. };
  360. return {
  361. defaultForm,
  362. // 表单数据
  363. form: { ...defaultForm },
  364. qualityStandardList: [],
  365. // 表单验证规则
  366. rules: {
  367. qualityStandardId: [
  368. { required: true, message: '请选择质检标准', trigger: 'blur' }
  369. ],
  370. inspectionName: [
  371. { required: true, message: '请输入质检名称', trigger: 'blur' }
  372. ],
  373. inspectionCode: [
  374. { required: true, message: '请输入质检编码', trigger: 'blur' }
  375. ],
  376. // unitName:
  377. textType: [
  378. { required: true, message: '请选择参数类型', trigger: 'blur' }
  379. ],
  380. inspectionStandard: [
  381. {
  382. required: true,
  383. message: '请输入',
  384. trigger: 'blur'
  385. }
  386. ]
  387. },
  388. // 提交状态
  389. loading: false,
  390. // 是否是修改
  391. isUpdate: false
  392. };
  393. },
  394. computed: {
  395. // 是否开启响应式布局
  396. styleResponsive() {
  397. return this.$store.state.theme.styleResponsive;
  398. },
  399. qualityStageList() {
  400. return [
  401. { value: 1, label: 'FAI' },
  402. { value: 2, label: 'IQC' },
  403. { value: 3, label: 'FQC' },
  404. { value: 4, label: 'OQC' }
  405. ];
  406. }
  407. },
  408. created() {
  409. this.getListFn();
  410. },
  411. methods: {
  412. textTypeChange() {
  413. this.form.maxValue = '';
  414. this.form.minValue = '';
  415. },
  416. defaultInput(value) {
  417. console.log(this.form.symbol, '0000 symbol');
  418. if (this.form.textType !== '1') {
  419. return;
  420. }
  421. // 1. 过滤非法字符(只保留数字、负号和小数点)
  422. let filteredValue = value.replace(/[^0-9.-]/g, '');
  423. // 2. 处理负号规则
  424. const minusIndex = filteredValue.indexOf('-');
  425. if (minusIndex > 0) {
  426. // 负号不在首位则删除所有负号
  427. filteredValue = filteredValue.replace(/-/g, '');
  428. } else if (minusIndex === 0) {
  429. // 保留首位的负号并移除其他负号
  430. filteredValue = '-' + filteredValue.substring(1).replace(/-/g, '');
  431. }
  432. // 3. 处理小数点规则
  433. const dotIndex = filteredValue.indexOf('.');
  434. if (dotIndex !== -1) {
  435. // 只保留第一个小数点,移除后续小数点
  436. const parts = filteredValue.split('.');
  437. filteredValue = parts[0] + '.' + parts.slice(1).join('');
  438. }
  439. // 4. 更新绑定值
  440. this.form.defaultValue = filteredValue;
  441. },
  442. /* 保存编辑 */
  443. save() {
  444. this.$refs.form.validate((valid) => {
  445. if (!valid) {
  446. return false;
  447. }
  448. this.loading = true;
  449. if (!this.isUpdate) {
  450. delete this.form.id;
  451. }
  452. const saveOrUpdate = this.isUpdate ? update : save;
  453. const defaultValue = Number(this.form.defaultValue);
  454. const maxValue = Number(this.form.maxValue);
  455. const minValue = Number(this.form.minValue);
  456. if ((defaultValue != '') & (maxValue != '')) {
  457. if (defaultValue > maxValue || defaultValue == maxValue) {
  458. this.loading = false;
  459. return this.$message.warning('默认值应小于参数上限');
  460. }
  461. }
  462. if ((defaultValue != '') & (minValue != '')) {
  463. if (defaultValue < minValue || defaultValue == minValue) {
  464. this.loading = false;
  465. return this.$message.warning('默认值应大于参数下限');
  466. }
  467. }
  468. if ((maxValue != '') & (minValue != '')) {
  469. if (maxValue < minValue || maxValue == minValue) {
  470. this.loading = false;
  471. return this.$message.warning('参数上限应大于参数下限');
  472. }
  473. }
  474. if (this.form.textType == 5) {
  475. this.form.unitName = 'h';
  476. }
  477. saveOrUpdate(this.form)
  478. .then((msg) => {
  479. this.loading = false;
  480. this.form = {};
  481. const info = this.isUpdate ? '修改成功' : '新增成功';
  482. this.$message.success(info);
  483. this.updateVisible(false);
  484. this.$emit('done');
  485. })
  486. .catch((e) => {
  487. this.loading = false;
  488. });
  489. });
  490. },
  491. /* 更新visible */
  492. updateVisible(value) {
  493. this.$emit('update:visible', value);
  494. },
  495. getListFn() {
  496. let param = {
  497. pageNum: 1,
  498. size: -1
  499. };
  500. getList(param).then((res) => {
  501. this.qualityStandardList = res.list;
  502. });
  503. },
  504. handleAdd() {
  505. this.$refs.productRefs.open(this.form.toolList);
  506. },
  507. chooseModal(data) {
  508. this.form.toolList = [...this.form.toolList, ...data];
  509. },
  510. removeItem(idx, row) {
  511. this.$confirm(`是否删除这个设备?`).then(async () => {
  512. this.form.toolList.splice(idx, 1);
  513. if (row.id) {
  514. this.form.toolRemoveIds.push(row.id);
  515. }
  516. });
  517. },
  518. addPostscript() {
  519. this.form.postscriptList.push({ sort: null, content: '' });
  520. },
  521. removePostscript(idx, row) {
  522. this.$confirm(`是否删除这个注意事项?`).then(async () => {
  523. this.form.postscriptList.splice(idx, 1);
  524. if (row.id) {
  525. this.form.postscriptRemoveIds.push(row.id);
  526. }
  527. });
  528. }
  529. },
  530. watch: {
  531. async visible(visible) {
  532. if (visible) {
  533. if (this.data) {
  534. const res = await getById(this.data.id);
  535. this.$util.assignObject(this.form, {
  536. ...res.data
  537. });
  538. this.isUpdate = true;
  539. } else {
  540. const code = await getCode('inspection_code');
  541. this.form.inspectionCode = code;
  542. this.isUpdate = false;
  543. }
  544. } else {
  545. this.$refs.form.clearValidate();
  546. this.form = { ...this.defaultForm };
  547. }
  548. }
  549. }
  550. };
  551. </script>
  552. <style lang="scss" scoped>
  553. .btn_case {
  554. display: flex;
  555. align-items: center;
  556. justify-content: space-between;
  557. margin: 6px 0;
  558. span {
  559. display: inline-block;
  560. margin: 0 10px;
  561. font-size: 18px;
  562. cursor: pointer;
  563. }
  564. }
  565. ::v-deep .el-form-item__content {
  566. display: flex !important;
  567. }
  568. </style>