user-edit.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="960px"
  5. :visible="visible"
  6. :append-to-body="true"
  7. :close-on-click-modal="false"
  8. custom-class="ele-dialog-form"
  9. :title="isView ? '查看工步' : 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="140px">
  15. <el-row>
  16. <el-col :span="8">
  17. <el-form-item label="编码:">
  18. <el-input
  19. disabled
  20. v-model="form.code"
  21. clearable
  22. placeholder="请输入"
  23. />
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="8">
  27. <el-form-item label="名称:" prop="name">
  28. <el-input :disabled="isView" v-model="form.name" />
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="8">
  32. <el-form-item label="状态:" prop="status">
  33. <el-select
  34. v-model="form.status"
  35. placeholder="请选择"
  36. style="width: 100%"
  37. :disabled="isView"
  38. >
  39. <el-option label="生效" :value="0" />
  40. <el-option label="失效" :value="1" />
  41. </el-select>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="24" v-if="form.textType === '7'">
  45. <el-form-item label="内容:" prop="defaultValue">
  46. <el-input
  47. v-model="form.defaultValue"
  48. type="textarea"
  49. :disabled="isView"
  50. >
  51. </el-input>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="24">
  55. <el-form-item label="备注:" prop="remark">
  56. <el-input
  57. placeholder="请输入"
  58. v-model="form.remark"
  59. type="textarea"
  60. :disabled="isView"
  61. />
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="8">
  65. <el-form-item label="排序:" prop="sort">
  66. <!-- <el-input :disabled="isView" type="number" v-model="form.sort" />-->
  67. <el-input-number v-model="form.sort" :min="1" :disabled="isView" />
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="8">
  71. <el-form-item label="附件上传:" prop="sort">
  72. <!-- <fileUpload v-model="form.files" :disabled="isView"></fileUpload> -->
  73. <fileMain v-model="form.files" :type="isView?'view':'add'"></fileMain>
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. <!-- 工步参数修改 2025-06-24 -->
  78. <headerTitle title="物品清单">
  79. <el-button
  80. type="primary"
  81. size="small"
  82. @click="handleAdd"
  83. v-show="!isView"
  84. >新增</el-button
  85. >
  86. </headerTitle>
  87. <el-table
  88. ref="multipleTable"
  89. :data="form.toolList"
  90. tooltip-effect="dark"
  91. style="width: 100%"
  92. stripe
  93. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  94. >
  95. <el-table-column label="编码" prop="code" min-width="120">
  96. <template slot-scope="{ row }">
  97. {{ row.code }}
  98. </template></el-table-column
  99. >
  100. <el-table-column label="名称" prop="code" min-width="120">
  101. <template slot-scope="{ row }">
  102. {{ row.name }}
  103. </template></el-table-column
  104. >
  105. <el-table-column label="规格" prop="brandNum" min-width="120">
  106. <template slot-scope="{ row }">
  107. {{ row.specification }}
  108. </template></el-table-column
  109. >
  110. <el-table-column label="型号" prop="modelType" min-width="120">
  111. <template slot-scope="{ row }">
  112. {{ row.modelType }}
  113. </template></el-table-column
  114. >
  115. <el-table-column label="操作" fixed="right">
  116. <template slot-scope="{ $index, row }">
  117. <el-button
  118. type="text"
  119. @click="removeItem($index, row)"
  120. v-show="!isView"
  121. >删除设备</el-button
  122. >
  123. </template>
  124. </el-table-column>
  125. </el-table>
  126. <headerTitle title="注意事项" class="focus-item">
  127. <el-button
  128. type="primary"
  129. size="small"
  130. @click="addPostscript"
  131. v-show="!isView"
  132. >新增</el-button
  133. >
  134. </headerTitle>
  135. <el-table
  136. ref="multipleTable"
  137. :data="form.postscriptList"
  138. tooltip-effect="dark"
  139. style="width: 100%"
  140. stripe
  141. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  142. >
  143. <el-table-column label="排序" prop="" width="140">
  144. <template slot-scope="{ row }">
  145. <el-input
  146. placeholder="请输入"
  147. type="number"
  148. v-model.number="row.sort"
  149. clearable
  150. :disabled="isView"
  151. ></el-input> </template
  152. ></el-table-column>
  153. <el-table-column label="注意事项" prop="" min-width="120">
  154. <template slot-scope="{ row }">
  155. <el-input
  156. placeholder="请输入"
  157. type="textarea"
  158. :rows="1"
  159. v-model="row.content"
  160. clearable
  161. :disabled="isView"
  162. ></el-input> </template
  163. ></el-table-column>
  164. <el-table-column label="操作" fixed="right" width="100">
  165. <template slot-scope="{ $index, row }">
  166. <el-button
  167. type="text"
  168. @click="removePostscript($index, row)"
  169. v-show="!isView"
  170. >删除</el-button
  171. >
  172. </template>
  173. </el-table-column>
  174. </el-table>
  175. </el-form>
  176. <template v-slot:footer>
  177. <el-button @click="updateVisible(false)">取消</el-button>
  178. <el-button
  179. type="primary"
  180. :loading="loading"
  181. @click="save"
  182. v-show="!isView"
  183. >
  184. 保存
  185. </el-button>
  186. </template>
  187. <!-- 工作中心弹窗 -->
  188. <ProductModalMultiple ref="productRefs" @selection="chooseModal" />
  189. </ele-modal>
  190. </template>
  191. <script>
  192. import stepManagement from '@/api/technology/stepManagement';
  193. import fileUpload from '@/components/addDoc/fileUpload.vue';
  194. import ProductModalMultiple from '@/views/material/BOMmanage/components/ProductModalMultiple.vue';
  195. export default {
  196. components: {
  197. ProductModalMultiple,
  198. fileUpload
  199. },
  200. props: {
  201. // 弹窗是否打开
  202. visible: Boolean,
  203. // 修改回显的数据
  204. data: Object,
  205. isView: Boolean,
  206. controlList: Array,
  207. typeList: Array
  208. },
  209. data() {
  210. const defaultForm = function () {
  211. return {
  212. id: null,
  213. code: '',
  214. name: '',
  215. sort: null,
  216. files: [],
  217. status: 0,
  218. postscriptList: [],
  219. toolList: [],
  220. toolRemoveIds: [],
  221. postscriptRemoveIds: [],
  222. textType: '7',
  223. defaultValue: '',
  224. remark: ''
  225. };
  226. };
  227. return {
  228. defaultForm,
  229. // 表单数据
  230. form: defaultForm(),
  231. // 表单验证规则
  232. rules: {
  233. name: [{ required: true, message: '请输入工步名称', trigger: 'blur' }]
  234. },
  235. // 提交状态
  236. loading: false,
  237. // 是否是修改
  238. isUpdate: false,
  239. chooseItem: null
  240. };
  241. },
  242. computed: {
  243. clientEnvironmentId() {
  244. return this.$store.state.user.info.clientEnvironmentId;
  245. },
  246. // 是否开启响应式布局
  247. styleResponsive() {
  248. return this.$store.state.theme.styleResponsive;
  249. }
  250. },
  251. methods: {
  252. /* 添加质量工具 */
  253. handleAdd() {
  254. this.$refs.productRefs.open(2, '', this.form.toolList);
  255. },
  256. chooseModal(data) {
  257. this.form.toolList = [...this.form.toolList, ...data];
  258. },
  259. removeItem(idx, row) {
  260. this.$confirm(`是否删除这个设备?`).then(async () => {
  261. this.form.toolList.splice(idx, 1);
  262. if (row.id) {
  263. this.form.toolRemoveIds.push(row.id);
  264. }
  265. });
  266. },
  267. /* 添加注意事项 */
  268. addPostscript() {
  269. this.form.postscriptList.push({ sort: null, content: '' });
  270. },
  271. removePostscript(idx, row) {
  272. this.$confirm(`是否删除这个注意事项?`).then(async () => {
  273. this.form.postscriptList.splice(idx, 1);
  274. if (row.id) {
  275. this.form.postscriptRemoveIds.push(row.id);
  276. }
  277. });
  278. },
  279. /* 保存编辑 */
  280. save() {
  281. this.$refs.form.validate((valid) => {
  282. if (!valid) {
  283. return false;
  284. }
  285. if (!this.isUpdate) {
  286. delete this.form.id;
  287. }
  288. this.loading = true;
  289. stepManagement
  290. .save(this.form)
  291. .then((msg) => {
  292. this.loading = false;
  293. this.$message.success(
  294. (this.isUpdate ? '修改' : '新建') + msg.message
  295. );
  296. this.updateVisible(false);
  297. this.$emit('done');
  298. })
  299. .catch((e) => {
  300. this.loading = false;
  301. // this.$message.error(e.message);
  302. });
  303. });
  304. },
  305. /* 更新visible */
  306. updateVisible(value) {
  307. this.form = { ...this.defaultForm() };
  308. this.$emit('update:visible', value);
  309. }
  310. },
  311. watch: {
  312. async visible(visible) {
  313. if (visible) {
  314. if (this.data) {
  315. const res = await stepManagement.getById(this.data.id);
  316. this.$util.assignObject(this.form, {
  317. ...res
  318. });
  319. // reset remove id data by copy from remote data
  320. this.form.toolRemoveIds = [];
  321. this.form.postscriptRemoveIds = [];
  322. this.isUpdate = true;
  323. } else {
  324. this.form = { ...this.defaultForm() };
  325. this.isUpdate = false;
  326. }
  327. } else {
  328. this.$refs.form.clearValidate();
  329. this.form = { ...this.defaultForm() };
  330. // reset remove id data by copy from remote data
  331. this.form.toolRemoveIds = [];
  332. this.form.postscriptRemoveIds = [];
  333. }
  334. }
  335. }
  336. };
  337. </script>
  338. <style lang="scss" scoped>
  339. .focus-item {
  340. margin-top: 10px;
  341. }
  342. </style>