list-edit.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <!-- 字典项编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="500px"
  5. :visible="visible"
  6. :close-on-click-modal="false"
  7. :title="isUpdate ? '编辑分类信息' : '新增分类信息'"
  8. @update:visible="updateVisible"
  9. :maxable="true"
  10. >
  11. <el-form :model="formData" ref="formRef" :rules="rules" label-width="96px">
  12. <!-- 根节点 -->
  13. <template v-if="!rootId || (data && data.id == rootId)">
  14. <el-form-item label="类型编码:" prop="code">
  15. <el-input
  16. clearable
  17. :maxlength="20"
  18. :disabled="isUpdate"
  19. v-model="formData.code"
  20. placeholder="请输入"
  21. />
  22. </el-form-item>
  23. <el-form-item label="类型名称:" prop="name">
  24. <el-input
  25. clearable
  26. :maxlength="20"
  27. v-model="formData.name"
  28. placeholder="请输入"
  29. />
  30. </el-form-item>
  31. <el-form-item label="分类组:" prop="type">
  32. <el-select
  33. clearable
  34. multiple
  35. class="w100"
  36. :maxlength="20"
  37. v-model="type"
  38. placeholder="请选择"
  39. >
  40. <el-option
  41. v-for="item in typeList"
  42. :key="item.value"
  43. :label="item.label"
  44. :value="item.value"
  45. >
  46. </el-option>
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item label="排序:" prop="sortNum">
  50. <el-input
  51. clearable
  52. v-model.number="formData.sortNum"
  53. placeholder="请输入排序"
  54. />
  55. </el-form-item>
  56. <el-form-item label="编码规则:" prop="ruleCode">
  57. <el-input
  58. clearable
  59. v-model="formData.ruleCode"
  60. placeholder="请输入"
  61. />
  62. </el-form-item>
  63. <el-form-item label="描述:" prop="remark">
  64. <el-input
  65. clearable
  66. type="textarea"
  67. :maxlength="20"
  68. v-model="formData.remark"
  69. placeholder="请输入"
  70. />
  71. </el-form-item>
  72. <el-form-item label="状态:" prop="isEnabled">
  73. <el-switch
  74. v-model="formData.isEnabled"
  75. :active-text="formData.isEnabled==1?'启用':'停用'"
  76. :active-value="1"
  77. :inactive-value="0"
  78. >
  79. </el-switch>
  80. </el-form-item>
  81. </template>
  82. <!-- 子节点 -->
  83. <template v-else>
  84. <el-form-item label="父级节点:">
  85. {{ parentData.name }}
  86. </el-form-item>
  87. <el-form-item label="层级全览:">
  88. {{ fullName }}
  89. </el-form-item>
  90. <el-form-item label="节点编码:" prop="code">
  91. <el-input
  92. clearable
  93. :maxlength="20"
  94. :disabled="isUpdate"
  95. v-model="formData.code"
  96. placeholder="请输入"
  97. />
  98. </el-form-item>
  99. <el-form-item label="节点名称:" prop="name">
  100. <el-input
  101. clearable
  102. :maxlength="20"
  103. v-model="formData.name"
  104. placeholder="请输入"
  105. />
  106. </el-form-item>
  107. <el-form-item label="与下层分隔:" prop="separatorChar">
  108. <DictSelection
  109. dictName="分隔符"
  110. clearable
  111. v-model="formData.separatorChar"
  112. >
  113. </DictSelection>
  114. </el-form-item>
  115. <el-form-item label="本层排序:" prop="sortNum">
  116. <el-input
  117. clearable
  118. :maxlength="20"
  119. v-model.number="formData.sortNum"
  120. placeholder="请输入"
  121. />
  122. </el-form-item>
  123. <el-form-item label="状态:" prop="isEnabled">
  124. <el-switch
  125. v-model="formData.isEnabled"
  126. :active-text="formData.isEnabled==1?'启用':'停用'"
  127. :active-value="1"
  128. :inactive-value="0"
  129. >
  130. </el-switch>
  131. </el-form-item>
  132. </template>
  133. </el-form>
  134. <template v-slot:footer>
  135. <el-button @click="updateVisible(false)">返回 </el-button>
  136. <el-button type="primary" :loading="loading" @click="save">
  137. 确认
  138. </el-button>
  139. </template>
  140. </ele-modal>
  141. </template>
  142. <script>
  143. import { saveOrUpdate } from '@/api/classifyManage';
  144. import dictMixins from '@/mixins/dictMixins';
  145. export default {
  146. props: {
  147. rootId: [String, Number],
  148. curNode: {
  149. type: Object,
  150. default: () => ({})
  151. }
  152. },
  153. mixins: [dictMixins],
  154. data() {
  155. const defaultForm = {
  156. name: '',
  157. code: '',
  158. ruleCode: '',
  159. separatorChar: '',
  160. sortNum: '',
  161. remark: '',
  162. parentId: 0,
  163. rootCategoryLevelId: null,
  164. isEnabled:1
  165. };
  166. return {
  167. visible: false,
  168. defaultForm,
  169. // 表单数据
  170. formData: { ...defaultForm },
  171. type: null,
  172. typeList: [
  173. {
  174. value: '1',
  175. label: '产品组'
  176. },
  177. {
  178. value: '2',
  179. label: '仓储组'
  180. },
  181. {
  182. value: '3',
  183. label: '物料组'
  184. },
  185. {
  186. value: '4',
  187. label: '资产组'
  188. },
  189. {
  190. value: '5',
  191. label: '物品组'
  192. }
  193. ],
  194. // 表单验证规则
  195. rules: {
  196. name: [
  197. {
  198. required: true,
  199. message: '请输入类型名称',
  200. trigger: 'blur'
  201. }
  202. ],
  203. code: [
  204. {
  205. required: true,
  206. message: '请输入类型编码',
  207. trigger: 'blur'
  208. }
  209. ]
  210. },
  211. // 提交状态
  212. loading: false,
  213. // 是否是修改
  214. isUpdate: false,
  215. data: null,
  216. parentData: {}
  217. };
  218. },
  219. computed: {
  220. fullName() {
  221. let str = '';
  222. let codeStr = '';
  223. let node = this.curNode;
  224. while (node?.data?.name) {
  225. str = node.data.name + '-' + str;
  226. codeStr = node.data.code + '-' + codeStr;
  227. node = node?.parent;
  228. }
  229. return (
  230. str.substring(str, str.length - 1) +
  231. `(${codeStr.substring(str, str.length - 1)})`
  232. );
  233. }
  234. },
  235. created() {},
  236. methods: {
  237. open(data, parentData) {
  238. this.formData.rootCategoryLevelId = this.$route.query.id;
  239. this.parentData = parentData;
  240. this.data = data;
  241. this.visible = true;
  242. },
  243. /* 保存编辑 */
  244. save() {
  245. this.$refs.formRef.validate((valid) => {
  246. if (!valid) {
  247. return false;
  248. }
  249. this.loading = true;
  250. const params = { ...this.formData };
  251. if (!this.data?.id && this.parentData?.id) {
  252. params.parentId =
  253. this.rootId == this.data?.id ? 0 : this.parentData.id;
  254. }
  255. if (this.data?.id) {
  256. params.id = this.data.id;
  257. }
  258. if (!this.rootId || (this.data && this.data.id == this.rootId)) {
  259. if (this.type) {
  260. params.type = this.type.join(',');
  261. }
  262. params.parentId = 0;
  263. }
  264. saveOrUpdate(params)
  265. .then((msg) => {
  266. this.loading = false;
  267. this.$message.success(msg);
  268. this.updateVisible(false);
  269. this.$emit('done', !!this.data);
  270. })
  271. .catch((e) => {
  272. this.loading = false;
  273. // this.$message.error(e.message);
  274. });
  275. });
  276. },
  277. /* 更新visible */
  278. updateVisible(value) {
  279. this.visible = value;
  280. }
  281. },
  282. watch: {
  283. visible(visible) {
  284. if (visible) {
  285. if (this.data) {
  286. this.$util.assignObject(this.formData, this.data);
  287. console.log(this.data);
  288. this.type = this.data.type.split(',');
  289. this.isUpdate = true;
  290. } else {
  291. this.isUpdate = false;
  292. }
  293. } else {
  294. this.$refs.formRef.clearValidate();
  295. this.formData = { ...this.defaultForm };
  296. }
  297. }
  298. }
  299. };
  300. </script>