create-order.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. <template>
  2. <div>
  3. <ele-modal
  4. :visible.sync="visible"
  5. v-if="visible"
  6. title="受托转生产订单"
  7. width="80vw"
  8. append-to-body
  9. :maxable="true"
  10. >
  11. <el-form
  12. ref="form"
  13. :model="form"
  14. :rules="rules"
  15. label-width="100px"
  16. class="create-form"
  17. >
  18. <el-row :gutter="24">
  19. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  20. <el-form-item label="所属工厂:" prop="orderType">
  21. <el-input
  22. clearable
  23. :maxlength="20"
  24. v-model="form.applyFactoriesName"
  25. disabled
  26. />
  27. </el-form-item>
  28. </el-col>
  29. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  30. <el-form-item label="请托部门:" prop="orderType">
  31. <el-input
  32. clearable
  33. :maxlength="20"
  34. v-model="form.applyDeptName"
  35. disabled
  36. />
  37. </el-form-item>
  38. </el-col>
  39. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  40. <el-form-item label="请托人:" prop="orderType">
  41. <el-input
  42. clearable
  43. :maxlength="20"
  44. v-model="form.createUserName"
  45. disabled
  46. />
  47. </el-form-item>
  48. </el-col>
  49. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  50. <el-form-item label="受托工厂:" prop="orderType">
  51. <el-input
  52. clearable
  53. :maxlength="20"
  54. v-model="form.beEntrustedFactoriesName"
  55. disabled
  56. />
  57. </el-form-item>
  58. </el-col>
  59. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  60. <el-form-item label="受托部门:" prop="orderType">
  61. <el-input
  62. clearable
  63. :maxlength="20"
  64. v-model="form.beEntrustedDeptName"
  65. disabled
  66. />
  67. </el-form-item>
  68. </el-col>
  69. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  70. <el-form-item label="类型:">
  71. <DictSelection
  72. dictName="请托类型"
  73. v-model="form.type"
  74. disabled
  75. ></DictSelection>
  76. </el-form-item>
  77. </el-col>
  78. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  79. <el-form-item label="名称:">
  80. <el-input clearable v-model="form.productName" disabled />
  81. </el-form-item>
  82. </el-col>
  83. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  84. <el-form-item label="编码:">
  85. <el-input clearable v-model="form.productCode" disabled />
  86. </el-form-item>
  87. </el-col>
  88. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  89. <el-form-item label="牌号:">
  90. <el-input clearable v-model="form.brandNo" disabled />
  91. </el-form-item>
  92. </el-col>
  93. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  94. <el-form-item label="型号:">
  95. <el-input clearable v-model="form.model" disabled />
  96. </el-form-item>
  97. </el-col>
  98. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  99. <el-form-item label="规格:">
  100. <el-input clearable v-model="form.specification" disabled />
  101. </el-form-item>
  102. </el-col>
  103. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  104. <el-form-item label="批次号:">
  105. <el-input clearable v-model="form.batchNo" disabled />
  106. </el-form-item>
  107. </el-col>
  108. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  109. <el-form-item label="订单数量:">
  110. <el-input clearable v-model="form.contractNum" disabled>
  111. <template slot="append">{{ form.measuringUnit }}</template>
  112. </el-input>
  113. </el-form-item>
  114. </el-col>
  115. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  116. <el-form-item label="完成日期:" prop="planDeliveryTime">
  117. <el-date-picker
  118. :picker-options="pickerOptions"
  119. style="width: 100%"
  120. v-model="form.planDeliveryTime"
  121. type="date"
  122. placeholder="选择日期"
  123. value-format="yyyy-MM-dd"
  124. disabled
  125. >
  126. </el-date-picker>
  127. </el-form-item>
  128. </el-col>
  129. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  130. <el-form-item label="计划开始时间:">
  131. <el-input clearable v-model="form.planStartTime" disabled>
  132. </el-input>
  133. </el-form-item>
  134. </el-col>
  135. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  136. <el-form-item label="计划结束时间:">
  137. <el-input clearable v-model="form.planCompleteTime" disabled>
  138. </el-input>
  139. </el-form-item>
  140. </el-col>
  141. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  142. <el-form-item label="工艺路线:" prop="produceRoutingName">
  143. <el-input
  144. v-model="form.produceRoutingName"
  145. placeholder="请选择工艺路线"
  146. @click.native="chooseRoute"
  147. readonly
  148. />
  149. </el-form-item>
  150. </el-col>
  151. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  152. <el-form-item label="首工序班组:" prop="teamId">
  153. <el-select
  154. style="width: 100%"
  155. v-model="form.teamId"
  156. placeholder="请选择首工序班组"
  157. clearable
  158. filterable
  159. :disabled="!form.produceRoutingId"
  160. :loading="firstTaskTeamLoading"
  161. @change="teamChange"
  162. >
  163. <el-option
  164. v-for="item in firstTaskTeamList"
  165. :key="item.id"
  166. :label="item.name"
  167. :value="item.id"
  168. />
  169. </el-select>
  170. </el-form-item>
  171. </el-col>
  172. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  173. <el-form-item label="紧急程度:">
  174. <el-select
  175. style="width: 100%"
  176. v-model="form.priority"
  177. placeholder="请选择"
  178. clearable
  179. disabled
  180. >
  181. <el-option
  182. v-for="item in options"
  183. :key="item.value"
  184. :label="item.name"
  185. :value="item.value"
  186. >
  187. </el-option>
  188. </el-select>
  189. </el-form-item>
  190. </el-col>
  191. <el-col v-bind="styleResponsive ? { lg: 12, md: 18 } : { span: 12 }">
  192. <el-form-item label="需求描述:">
  193. <el-input
  194. clearable
  195. v-model="form.describes"
  196. type="textarea"
  197. :rows="4"
  198. disabled
  199. />
  200. </el-form-item>
  201. </el-col>
  202. </el-row>
  203. </el-form>
  204. <template v-slot:footer>
  205. <el-button @click="cancel">取消</el-button>
  206. <el-button type="primary" @click="save"> 确定 </el-button>
  207. </template>
  208. <!-- 选择工艺路线 -->
  209. <ProcessRoute ref="processRouteRef" @changeParent="changeParent" />
  210. </ele-modal>
  211. </div>
  212. </template>
  213. <script>
  214. import ProcessRoute from '@/components/selectionDialog/processRoute.vue';
  215. import {
  216. getFactoryList,
  217. createProductionOrder,
  218. listFirstTaskTeam
  219. } from '@/api/beEntrusted';
  220. import { getByCode } from '@/api/system/dictionary-data';
  221. import { routeList } from '@/api/aps';
  222. import dayjs from 'dayjs';
  223. export default {
  224. name: 'CreateOrder',
  225. components: {
  226. ProcessRoute
  227. },
  228. props: {
  229. isAdd: {
  230. type: Boolean,
  231. default: true
  232. }
  233. },
  234. data() {
  235. return {
  236. visible: false,
  237. loading: null,
  238. disabledList: [], //已保存数据不做删除
  239. form: {
  240. bomCategoryId: '',
  241. factoriesId: '',
  242. applyFactoriesName: '', //所属工厂
  243. applyDeptName: '', //请托部门
  244. createUserName: '', //请托人
  245. beEntrustedFactoriesName: '', //受托工厂
  246. beEntrustedDeptName: '', //受托部门
  247. planDeliveryTime: dayjs(
  248. new Date().getTime() + 3600 * 1000 * 24 * 10
  249. ).format('YYYY-MM-DD'),
  250. productName: '',
  251. productCode: '',
  252. model: '',
  253. contractNum: '',
  254. describes: '',
  255. measuringUnit: '',
  256. brandNo: '',
  257. produceRoutingId: '',
  258. produceRoutingName: '',
  259. teamId: '',
  260. teamName: '',
  261. sourceId: '',
  262. sourceCode: '',
  263. priority: '',
  264. formingWeight: '',
  265. newWeightUnit: ''
  266. },
  267. // 表单验证规则
  268. rules: {
  269. produceRoutingName: [
  270. { required: true, message: '请选择工艺路线', trigger: 'change' }
  271. ],
  272. teamId: [
  273. { required: true, message: '请选择首工序班组', trigger: 'change' }
  274. ]
  275. },
  276. options: [
  277. {
  278. name: '一般',
  279. value: 1
  280. },
  281. {
  282. name: '紧急',
  283. value: 2
  284. }
  285. ],
  286. routingList: [],
  287. factoryList: [],
  288. firstTaskTeamList: [],
  289. firstTaskTeamLoading: false,
  290. title: '受托转生产订单',
  291. pickerOptions: {
  292. disabledDate: (time) => {
  293. // 禁用日期
  294. let nowData = new Date();
  295. nowData = new Date(nowData.setDate(nowData.getDate() - 1));
  296. return time < nowData;
  297. }
  298. },
  299. // 订单类型
  300. orderTypeList: [
  301. {
  302. id: 0,
  303. label: '库存性订单'
  304. },
  305. {
  306. id: 1,
  307. label: '生产性订单'
  308. },
  309. {
  310. id: 2,
  311. label: '无客户生产性订单'
  312. },
  313. {
  314. id: 4,
  315. label: '不定向订单'
  316. }
  317. ],
  318. selectIndex: 0, // 选择工艺路线的当前数据下标
  319. processingRequired: 0, // 生产类型跟BOM 版本是否必填 1:是 0:否
  320. sourceSalesOrderId: '', // 源销售订单ID
  321. modelList: [], // 机型数据
  322. colorList: [], // 颜色数据
  323. routeAllList: []
  324. };
  325. },
  326. watch: {},
  327. computed: {
  328. // 是否开启响应式布局
  329. styleResponsive() {
  330. return this.$store.state.theme.styleResponsive;
  331. },
  332. clientEnvironmentId() {
  333. return this.$store.state.user.info.clientEnvironmentId;
  334. },
  335. // 是否必填字段
  336. isRequired() {
  337. return this.processingRequired == 1;
  338. },
  339. // 工艺路线 输入框展示跟选择框判断
  340. isRouteSelect() {
  341. return (row) => {
  342. if (this.isRequired) {
  343. return true;
  344. }
  345. if (!row.selectionRowShow) {
  346. return true;
  347. }
  348. return false;
  349. };
  350. },
  351. // 选择按钮的显示
  352. isSelectShow() {
  353. // if (this.form.planType == 5) {
  354. // return true;
  355. // }
  356. return this.processingRequired == 0;
  357. }
  358. },
  359. created() {},
  360. mounted() {
  361. this.getFactoryList();
  362. this.getCodeData();
  363. },
  364. methods: {
  365. // 获取
  366. async getCodeData() {
  367. let arr1 = await this.getLevelCode('product_model_key');
  368. let arr2 = await this.getLevelCode('product_color_key');
  369. this.modelList = arr1;
  370. this.colorList = arr2;
  371. },
  372. async getLevelCode(code) {
  373. try {
  374. const res = await getByCode(code);
  375. if (res.code == 0) {
  376. let list = Object.values(res.data).map((el) => {
  377. let k = Object.keys(el)[0];
  378. let v = Object.values(el)[0];
  379. return {
  380. label: v,
  381. value: k
  382. };
  383. });
  384. return list;
  385. }
  386. } catch (err) {
  387. this.$message.error(err.message);
  388. }
  389. },
  390. async getFactoryList() {
  391. this.factoryList = await getFactoryList();
  392. },
  393. open(row) {
  394. this.visible = true;
  395. row[0].bomCategoryId = '';
  396. row[0].bomCategoryName = '';
  397. row[0].bomCategoryVersions = '';
  398. row[0].bomType = '';
  399. row[0].produceRoutingId = '';
  400. row[0].produceRoutingName = '';
  401. row[0].teamId = '';
  402. row[0].teamName = '';
  403. this.form = this.deepCopy(row[0]);
  404. this.form.productCode = this.form.categoryCode;
  405. this.form.productName = this.form.categoryName;
  406. this.form.model = this.form.modelType;
  407. this.form.brandNo = this.form.brandNum;
  408. this.form.contractNum = this.form.totalCount;
  409. this.form.sourceCode = this.form.code;
  410. this.form.sourceId = this.form.id;
  411. this.form.formingWeight = this.form.totalWeight;
  412. this.form.newWeightUnit = this.form.weightUnit;
  413. this.getRoteList(this.form.beEntrustedFactoriesId);
  414. },
  415. async getRoteList(factoriesId) {
  416. await routeList({ factoriesId, pageNum: 1, size: -1 }).then((res) => {
  417. this.routeAllList = res.list;
  418. });
  419. },
  420. deepCopy(obj, hash = new WeakMap()) {
  421. if (obj === null) return null;
  422. if (obj instanceof Date) return new Date(obj);
  423. if (obj instanceof RegExp) return new RegExp(obj);
  424. if (typeof obj !== 'object' && typeof obj !== 'function') return obj;
  425. if (hash.has(obj)) return hash.get(obj);
  426. const result = Array.isArray(obj) ? [] : {};
  427. hash.set(obj, result);
  428. return Object.keys(obj).reduce((acc, key) => {
  429. acc[key] = this.deepCopy(obj[key], hash);
  430. return acc;
  431. }, result);
  432. },
  433. cancel() {
  434. this.form = {
  435. bomCategoryId: '',
  436. factoriesId: '',
  437. applyFactoriesName: '', //所属工厂
  438. applyDeptName: '', //请托部门
  439. createUserName: '', //请托人
  440. beEntrustedFactoriesName: '', //受托工厂
  441. beEntrustedDeptName: '', //受托部门
  442. planDeliveryTime: dayjs(
  443. new Date().getTime() + 3600 * 1000 * 24 * 10
  444. ).format('YYYY-MM-DD'),
  445. productName: '',
  446. productCode: '',
  447. model: '',
  448. contractNum: '',
  449. describes: '',
  450. measuringUnit: '',
  451. brandNo: '',
  452. produceRoutingId: '',
  453. produceRoutingName: '',
  454. teamId: '',
  455. teamName: '',
  456. sourceId: '',
  457. sourceCode: '',
  458. priority: ''
  459. };
  460. this.firstTaskTeamList = [];
  461. this.$refs.form.clearValidate();
  462. this.visible = false;
  463. },
  464. /* 保存编辑 */
  465. save() {
  466. this.$refs.form.validate((valid) => {
  467. if (!valid) {
  468. return false;
  469. }
  470. // if (!this.form.produceRoutingName) {
  471. // return this.$message.warning('请选择工艺路线');
  472. // }
  473. // this.form.produceRoutingName = this.routeAllList.find(
  474. // (item) => item.id === this.form.produceRoutingId
  475. // )?.name;
  476. this.form.planDeliveryTime = this.form.planDeliveryTime
  477. ? String(this.form.planDeliveryTime).split(' ')[0]
  478. : '';
  479. let params = {
  480. ...this.form,
  481. teamId: this.form.teamId,
  482. teamName: this.form.teamName,
  483. sourceType: 3
  484. };
  485. this.loading = this.$loading({
  486. lock: true,
  487. text: '加载中',
  488. background: 'rgba(0, 0, 0, 0.7)'
  489. });
  490. createProductionOrder(params)
  491. .then((res) => {
  492. this.loading.close();
  493. this.$message.success('成功');
  494. this.cancel();
  495. this.$emit('refresh');
  496. })
  497. .catch((e) => {
  498. this.loading.close();
  499. });
  500. });
  501. },
  502. chooseRoute() {
  503. this.$refs.processRouteRef.open(this.form);
  504. },
  505. // 打开工艺路线
  506. openDialog(index) {
  507. this.selectIndex = index;
  508. this.$refs.processRouteRef.open();
  509. },
  510. async getFirstTaskTeamList(routingId) {
  511. this.firstTaskTeamLoading = true;
  512. try {
  513. const list = await listFirstTaskTeam(routingId);
  514. if (String(this.form.produceRoutingId) !== String(routingId)) {
  515. return;
  516. }
  517. this.firstTaskTeamList = Array.isArray(list) ? list : [];
  518. if (!this.firstTaskTeamList.length) {
  519. this.$message.warning('当前工艺路线未配置首工序班组');
  520. }
  521. } catch (err) {
  522. this.firstTaskTeamList = [];
  523. // this.$message.error(err.message);
  524. } finally {
  525. this.firstTaskTeamLoading = false;
  526. }
  527. },
  528. teamChange(teamId) {
  529. const team = this.firstTaskTeamList.find(
  530. (item) => String(item.id) === String(teamId)
  531. );
  532. this.form.teamName = team ? team.name : '';
  533. },
  534. // 选择工艺路线
  535. changeParent(item) {
  536. this.form.produceRoutingName = item.name;
  537. this.form.produceRoutingId = item.id;
  538. this.form.teamId = '';
  539. this.form.teamName = '';
  540. this.firstTaskTeamList = [];
  541. this.getFirstTaskTeamList(item.id);
  542. this.$nextTick(() => {
  543. this.$refs.form.clearValidate('produceRoutingName');
  544. });
  545. }
  546. }
  547. };
  548. </script>
  549. <style lang="scss" scoped>
  550. .basic-details-title {
  551. margin: 10px 0;
  552. }
  553. .add-product {
  554. width: 100%;
  555. display: flex;
  556. align-items: center;
  557. justify-content: flex-end;
  558. font-size: 30px;
  559. color: #1890ff;
  560. margin: 10px 0;
  561. cursor: pointer;
  562. }
  563. .create-form .el-form-item {
  564. margin-bottom: 15px !important;
  565. }
  566. .header_required {
  567. .is-required:before {
  568. content: '*';
  569. color: #f56c6c;
  570. margin-right: 4px;
  571. }
  572. }
  573. </style>