details.vue 16 KB

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