user-edit.vue 15 KB

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