user-edit.vue 18 KB

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