user-edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="1060px"
  5. :visible="visible"
  6. v-if="visible"
  7. :append-to-body="true"
  8. :close-on-click-modal="false"
  9. custom-class="ele-dialog-form"
  10. :title="innerIsUpdate ? '修改工艺路线' : '添加工艺路线'"
  11. @update:visible="updateVisible"
  12. :maxable="true"
  13. >
  14. <header-title title="基本信息"> </header-title>
  15. <el-form ref="form" :model="form" :rules="rules" label-width="140px">
  16. <el-row>
  17. <el-col :span="8">
  18. <el-form-item label="工艺路线编码:">
  19. <el-input
  20. clearable
  21. disabled
  22. v-model="form.code"
  23. placeholder="请输入"
  24. />
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="8">
  28. <el-form-item label="工艺路线名称:" prop="name">
  29. <el-input v-model="form.name" clearable placeholder="请输入" />
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="8">
  33. <el-form-item label="所属工厂:" prop="factoryId">
  34. <el-select
  35. v-model="form.factoryId"
  36. placeholder="请选择"
  37. filterable
  38. :disabled="innerIsUpdate"
  39. >
  40. <el-option
  41. v-for="item in fList"
  42. :key="item.id"
  43. :label="item.name"
  44. :value="item.id"
  45. >
  46. </el-option>
  47. </el-select>
  48. </el-form-item>
  49. </el-col>
  50. <!-- <el-col :span="8">
  51. <el-form-item label="工艺类型:" prop="produceVersionId">
  52. <el-select v-model="form.produceVersionId" filterable placeholder="请选择" :style="{ width: '100%' }"
  53. :disabled="isUpdate">
  54. <el-option v-for="item in versionList" :key="item.code" :label="item.code + '-' + item.name"
  55. :value="item.id">
  56. </el-option>
  57. </el-select>
  58. </el-form-item>
  59. </el-col> -->
  60. <el-col :span="8">
  61. <el-form-item label="工艺路线版本:" prop="version">
  62. <el-input disabled v-model="form.version" />
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="8">
  66. <el-form-item label="状态:" prop="status">
  67. <el-select v-model="form.status" placeholder="" filterable>
  68. <el-option
  69. v-for="item in statusList"
  70. :key="item.value"
  71. :label="item.label"
  72. :value="item.value"
  73. >
  74. </el-option>
  75. </el-select>
  76. </el-form-item>
  77. </el-col>
  78. <el-col :span="8" v-if="innerIsUpdate">
  79. <el-form-item label="版本是否升级:" prop="versionUpgradeType">
  80. <el-select v-model="form.versionUpgradeType" placeholder="请选择">
  81. <el-option label="不升级" :value="0" />
  82. <el-option label="小版本" :value="1" />
  83. <el-option label="大版本" :value="2" />
  84. </el-select>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="8">
  88. <el-form-item label="排序:" prop="sort">
  89. <el-input v-model="form.sort" type="number" />
  90. </el-form-item>
  91. </el-col>
  92. <!--
  93. <el-col :span="8" v-if="isCategory">
  94. <el-form-item label="产品/物品分类:" prop="workCenterName">
  95. <el-input
  96. @click.native="chooseWorkCenter"
  97. v-model="form.workCenterName"
  98. readonly
  99. />
  100. </el-form-item>
  101. </el-col> -->
  102. <!-- <el-col :span="8">
  103. <el-form-item label="类型:" prop="routeType">
  104. <el-select v-model="form.routeType" placeholder="请选择">
  105. <el-option label="生产" :value="1" />
  106. <el-option label="委外" :value="2" />
  107. <el-option label="质检" :value="3" />
  108. </el-select>
  109. </el-form-item>
  110. </el-col> -->
  111. </el-row>
  112. </el-form>
  113. <user-taskinstance
  114. :isEdit="innerIsUpdate"
  115. ref="taskRef"
  116. :taskInfo="form"
  117. @taskList="taskList"
  118. @remove="remove"
  119. />
  120. <template v-slot:footer>
  121. <el-button type="primary" v-click-once @click="save"> 确定 </el-button>
  122. </template>
  123. </ele-modal>
  124. </template>
  125. <script>
  126. import route from '@/api/technology/route';
  127. import { pageList } from '@/api/technology/version/version.js';
  128. import UserTaskinstance from './user-taskinstance.vue';
  129. import { parameterGetByCode } from '@/api/system/dictionary-data';
  130. export default {
  131. components: {
  132. UserTaskinstance
  133. },
  134. props: {
  135. // 弹窗是否打开
  136. visible: Boolean,
  137. isUpdate: Boolean,
  138. // 修改回显的数据
  139. data: Object,
  140. isBomRoute: {
  141. type: Boolean,
  142. default: false
  143. }
  144. },
  145. data() {
  146. const defaultForm = {
  147. code: '',
  148. name: '',
  149. factoryId: this.$store.state.user.info.factoryId || '',
  150. status: 1,
  151. categoryId: '',
  152. produceVersionId: '',
  153. version: '1.0',
  154. id: '',
  155. // routeType: '',
  156. versionUpgradeType: 0
  157. };
  158. return {
  159. defaultForm,
  160. innerIsUpdate: this.isUpdate,
  161. fList: [], //仓库列表
  162. // 表单数据
  163. form: { ...defaultForm },
  164. statusList: [
  165. { label: '草稿', value: -1 },
  166. { label: '失效', value: 0 },
  167. { label: '生效', value: 1 }
  168. ],
  169. // 表单验证规则
  170. rules: {
  171. name: [
  172. { required: true, message: '请输入工艺路线名称', trigger: 'blur' }
  173. ],
  174. code: [
  175. { required: true, message: '请输入工艺路线编码', trigger: 'blur' }
  176. ],
  177. status: [
  178. { required: true, message: '请输入工艺路线版本', trigger: 'blur' }
  179. ],
  180. version: [
  181. { required: true, message: '请输入工艺路线版本', trigger: 'blur' }
  182. ],
  183. produceVersionId: [
  184. { required: true, message: '请输入工艺类型', trigger: 'blur' }
  185. ],
  186. factoryId: [
  187. { required: true, message: '请选择所属工厂', trigger: 'blur' }
  188. ]
  189. // routeType: [
  190. // { required: true, message: '请选择类型', trigger: 'blur' }
  191. // ]
  192. },
  193. versionList: [],
  194. // 提交状态
  195. taskInstanceList: [],
  196. removeList: [],
  197. isCategory: false
  198. };
  199. },
  200. mounted() {
  201. if (this.isBomRoute) {
  202. this.form.status = 1;
  203. }
  204. this.getCategoryType();
  205. },
  206. computed: {
  207. statusTitle() {
  208. return this.innerIsUpdate ? '修改' : '保存';
  209. },
  210. // 是否开启响应式布局
  211. styleResponsive() {
  212. return this.$store.state.theme.styleResponsive;
  213. },
  214. clientEnvironmentId() {
  215. return this.$store.state.user.info.clientEnvironmentId;
  216. }
  217. },
  218. methods: {
  219. /* 保存编辑 */
  220. save() {
  221. this.$refs.form.validate((valid) => {
  222. if (!valid) {
  223. return false;
  224. }
  225. this.$refs.taskRef.getTaskList();
  226. if (!this.data) {
  227. delete this.form.id;
  228. }
  229. if (this.taskInstanceList.length == 0) {
  230. this.$message.warning('至少配置一条工序才能保存');
  231. return;
  232. }
  233. const isValid = this.validateFieldUniqueness(
  234. this.taskInstanceList,
  235. 'orderNum'
  236. );
  237. if (!isValid) {
  238. return;
  239. }
  240. let isFalse = this.hasPropertyEqualToSeven(
  241. this.taskInstanceList,
  242. 'type'
  243. );
  244. if (isFalse) {
  245. let _arr = JSON.parse(JSON.stringify(this.taskInstanceList));
  246. _arr.sort((a, b) => a.orderNum - b.orderNum);
  247. if (_arr[0].type != 7) {
  248. this.$message.warning('有生产准备工序,请将生产准备放在首位');
  249. return;
  250. }
  251. }
  252. let param = {
  253. taskInstanceList: this.taskInstanceList,
  254. routingInfo: this.form,
  255. removeList: this.removeList
  256. };
  257. route
  258. .taskinstanceSave(param)
  259. .then((res) => {
  260. console.log(res, 'msg77777');
  261. // if (msg) {
  262. this.$message.success(res.message);
  263. this.updateVisible(false, true);
  264. this.$emit('done', res.data);
  265. // }
  266. })
  267. .finally(() => {});
  268. });
  269. },
  270. async getCategoryType() {
  271. await parameterGetByCode({
  272. code: 'add_routing_binding'
  273. }).then((res) => {
  274. this.isCategory = res.value == '1' ? true : false;
  275. });
  276. },
  277. hasPropertyEqualToSeven(arr, property) {
  278. for (let i = 0; i < arr.length; i++) {
  279. if (
  280. Object.prototype.hasOwnProperty.call(arr[i], property) &&
  281. arr[i][property] === 7
  282. ) {
  283. return true; // 找到属性等于7的对象
  284. }
  285. }
  286. return false; // 没有找到属性等于7的对象
  287. },
  288. validateFieldUniqueness(array, fieldName) {
  289. const seenValues = new Set();
  290. for (const item of array) {
  291. if (!item[fieldName]) {
  292. this.$message.warning(` 排序不能为空,`);
  293. return false;
  294. }
  295. if (seenValues.has(item[fieldName])) {
  296. this.$message.warning(`排序不能重复,`);
  297. return false;
  298. }
  299. seenValues.add(item[fieldName]);
  300. }
  301. return true;
  302. },
  303. async getVersionList() {
  304. const res = await pageList({
  305. pageNum: 1,
  306. size: 100
  307. });
  308. this.versionList = res.list;
  309. },
  310. /* 更新visible */
  311. updateVisible(value, force = false) {
  312. if (!value && !force && this.shouldTipUnsavedTask()) {
  313. this.$message.warning(
  314. '新添加的工序尚未保存,请点击下发[确定]按钮进行保存'
  315. );
  316. return;
  317. }
  318. this.$emit('update:visible', value);
  319. },
  320. taskList(list) {
  321. this.taskInstanceList = list;
  322. },
  323. remove(list) {
  324. this.removeList = list;
  325. },
  326. shouldTipUnsavedTask() {
  327. if (this.clientEnvironmentId != 9 || this.innerIsUpdate) {
  328. return false;
  329. }
  330. const tableData =
  331. this.$refs.taskRef &&
  332. this.$refs.taskRef.$refs.table &&
  333. this.$refs.taskRef.$refs.table.getData
  334. ? this.$refs.taskRef.$refs.table.getData()
  335. : this.taskInstanceList;
  336. return Array.isArray(tableData) && tableData.length > 0;
  337. }
  338. },
  339. watch: {
  340. isUpdate(val) {
  341. this.innerIsUpdate = val;
  342. },
  343. async visible(visible) {
  344. if (visible) {
  345. this.getVersionList();
  346. const res = await route.Flist({
  347. pageNum: 1,
  348. size: -1,
  349. type: 1
  350. });
  351. this.fList = res.list;
  352. if (this.data) {
  353. const res = await route.getById(this.data.id);
  354. this.$util.assignObject(this.form, {
  355. ...res,
  356. versionUpgradeType: 0
  357. });
  358. } else {
  359. // const res = await route.getCode();
  360. // this.form.code = res;
  361. // this.isUpdate = false;
  362. }
  363. this.$nextTick(() => {
  364. this.$refs.taskRef.getList();
  365. });
  366. } else {
  367. this.$refs.form.clearValidate();
  368. this.form = { ...this.defaultForm };
  369. }
  370. }
  371. }
  372. };
  373. </script>