index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <template>
  2. <ele-modal
  3. width="80vw"
  4. :visible.sync="visible"
  5. :close-on-click-modal="false"
  6. custom-class="ele-dialog-form"
  7. :title="title"
  8. >
  9. <div class="form-wrapper">
  10. <el-form
  11. ref="form"
  12. :model="form"
  13. :rules="rules"
  14. label-width="90px"
  15. class="formbox"
  16. >
  17. <el-row :gutter="24">
  18. <el-col :span="8">
  19. <el-form-item label="名称:" prop="productName">
  20. <el-input
  21. @click.native="handleAdd"
  22. placeholder="请选择物料"
  23. v-model="form.productName"
  24. size="mini"
  25. ></el-input>
  26. </el-form-item>
  27. </el-col>
  28. <el-col :span="8">
  29. <el-form-item label="编码:" prop="productCode">
  30. <el-input
  31. placeholder=""
  32. size="mini"
  33. disabled
  34. v-model="form.productCode"
  35. ></el-input>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="8">
  39. <el-form-item label="牌号:" prop="brandNum">
  40. <el-input
  41. placeholder=""
  42. size="mini"
  43. disabled
  44. v-model="form.brandNum"
  45. ></el-input>
  46. </el-form-item>
  47. </el-col>
  48. </el-row>
  49. <el-row :gutter="24">
  50. <el-col :span="8">
  51. <el-form-item label="型号:" prop="modelType">
  52. <el-input
  53. placeholder=""
  54. size="mini"
  55. disabled
  56. v-model="form.modelType"
  57. ></el-input>
  58. </el-form-item>
  59. </el-col>
  60. <el-col :span="8">
  61. <el-form-item label="规格:" prop="specification">
  62. <el-input
  63. placeholder=""
  64. size="mini"
  65. disabled
  66. v-model="form.specification"
  67. ></el-input>
  68. </el-form-item>
  69. </el-col>
  70. </el-row>
  71. <headerTitle title="计划信息"> </headerTitle>
  72. <el-row :gutter="24">
  73. <el-col :span="8">
  74. <el-form-item label="加工方式:" prop="produceType">
  75. <el-select
  76. v-model="form.produceType"
  77. style="width: 100%"
  78. @change="changeProduceType"
  79. size="mini"
  80. >
  81. <el-option
  82. v-for="item of producedList"
  83. :key="item.code"
  84. :label="item.name"
  85. :value="item.code"
  86. ></el-option>
  87. </el-select>
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="8">
  91. <el-form-item label="BOM版本:" prop="bomCategoryId">
  92. <el-select
  93. v-model="form.bomCategoryId"
  94. style="width: 100%"
  95. @change="changeBomId"
  96. size="mini"
  97. >
  98. <el-option
  99. v-for="item of bomVersionList"
  100. :key="item.id"
  101. :label="item.name + '(V' + item.versions + '.0)'"
  102. :value="item.id"
  103. ></el-option>
  104. </el-select>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="8">
  108. <el-form-item label="工艺路线:" prop="produceRoutingId">
  109. <el-select
  110. v-model="form.produceRoutingId"
  111. style="width: 100%"
  112. @change="changeRoute"
  113. size="mini"
  114. >
  115. <el-option
  116. v-for="item of routingList"
  117. :key="item.id"
  118. :label="item.name"
  119. :value="item.id"
  120. ></el-option>
  121. </el-select>
  122. </el-form-item>
  123. </el-col>
  124. </el-row>
  125. <el-row :gutter="24">
  126. <el-col :span="8">
  127. <el-form-item label="生产数量:" prop="requiredFormingNum">
  128. <el-input
  129. v-model.number="form.requiredFormingNum"
  130. size="mini"
  131. oninput="value=value.replace(/[^\d]/g,'')"
  132. style="width: 100%"
  133. placeholder="输入数量"
  134. >
  135. <template slot="append">{{ form.measuringUnit }} </template>
  136. </el-input>
  137. </el-form-item>
  138. </el-col>
  139. <el-col :span="8">
  140. <el-form-item label="批次号:" prop="batchNo">
  141. <el-input
  142. v-model="form.batchNo"
  143. size="mini"
  144. style="width: 100%"
  145. placeholder="输入批次号"
  146. ></el-input>
  147. </el-form-item>
  148. </el-col>
  149. <el-col :span="8">
  150. <el-form-item
  151. label="要求完成日期:"
  152. label-width="110px"
  153. prop="reqMoldTime"
  154. >
  155. <el-date-picker
  156. style="width: 100%"
  157. size="mini"
  158. v-model="form.reqMoldTime"
  159. :pickerOptions="{
  160. disabledDate: (time) =>
  161. time.getTime() <
  162. new Date(new Date().setHours(0, 0, 0, 0)).getTime()
  163. }"
  164. type="date"
  165. placeholder="选择日期"
  166. value-format="yyyy-MM-dd"
  167. >
  168. </el-date-picker>
  169. </el-form-item>
  170. </el-col>
  171. </el-row>
  172. <el-row :gutter="24">
  173. <el-col :span="8">
  174. <el-form-item
  175. label="计划开始日期:"
  176. label-width="110px"
  177. prop="startTime"
  178. >
  179. <el-date-picker
  180. style="width: 100%"
  181. size="mini"
  182. v-model="form.startTime"
  183. :pickerOptions="{
  184. disabledDate: (time) =>
  185. time.getTime() <
  186. new Date(new Date().setHours(0, 0, 0, 0)).getTime()
  187. }"
  188. type="date"
  189. placeholder="选择日期"
  190. value-format="yyyy-MM-dd"
  191. >
  192. </el-date-picker>
  193. </el-form-item>
  194. </el-col>
  195. <el-col :span="8">
  196. <el-form-item
  197. label="计划结束日期:"
  198. label-width="110px"
  199. prop="endTime"
  200. >
  201. <el-date-picker
  202. style="width: 100%"
  203. size="mini"
  204. v-model="form.endTime"
  205. :pickerOptions="{
  206. disabledDate: (time) =>
  207. time.getTime() <
  208. new Date(new Date().setHours(0, 0, 0, 0)).getTime()
  209. }"
  210. type="date"
  211. placeholder="选择日期"
  212. value-format="yyyy-MM-dd"
  213. >
  214. </el-date-picker>
  215. </el-form-item>
  216. </el-col>
  217. </el-row>
  218. </el-form>
  219. <!-- 选择产品 -->
  220. <EquipmentDialog
  221. ref="equipmentRefs"
  222. @choose="confirmChoose"
  223. :selectList="[]"
  224. >
  225. </EquipmentDialog>
  226. </div>
  227. <template v-slot:footer>
  228. <el-button @click="cancel">取消</el-button>
  229. <el-button type="primary" @click="save" :loading="loading">
  230. 确定
  231. </el-button>
  232. </template>
  233. </ele-modal>
  234. </template>
  235. <script>
  236. import EquipmentDialog from '@/views/saleOrder/components/EquipmentDialog';
  237. import { getCode } from '@/api/codeManagement';
  238. import {
  239. bomRoutingList,
  240. bomListByPlan,
  241. saveSaleToPlan,
  242. temporarilyUpdate
  243. } from '@/api/saleOrder';
  244. export default {
  245. components: {
  246. EquipmentDialog
  247. },
  248. props: {
  249. factoryType: {
  250. type: Number,
  251. default: 1
  252. },
  253. factoryObj: {
  254. type: Object,
  255. default: () => {}
  256. }
  257. },
  258. watch: {
  259. factoryType: {
  260. immediate: true,
  261. deep: true,
  262. handler(val) {
  263. this.type = val;
  264. this.title = val == 1 ? '新增临时计划' : '编辑临时计划';
  265. this.form = this.factoryObj;
  266. }
  267. }
  268. },
  269. data() {
  270. return {
  271. visible: true,
  272. title: '',
  273. type: 1,
  274. loading: false,
  275. form: {
  276. timeDimensionPlanType: 3,
  277. categoryId: '',
  278. productName: '',
  279. planType: 1,
  280. produceType: 2,
  281. bomCategoryId: '',
  282. produceRoutingId: '',
  283. requiredFormingNum: ''
  284. },
  285. bomVersionList: [],
  286. routingList: [],
  287. rules: {
  288. productName: [
  289. { required: true, message: '请选择名称', trigger: 'change' }
  290. ],
  291. bomCategoryId: [
  292. { required: true, message: '请选择BOM版本', trigger: 'blur' }
  293. ],
  294. produceRoutingId: [
  295. { required: true, message: '请选择工艺路线', trigger: 'blur' }
  296. ],
  297. reqMoldTime: [
  298. { required: true, message: '请选择要求完成日期', trigger: 'blur' }
  299. ],
  300. requiredFormingNum: [
  301. { required: true, message: '请输入生产数量', trigger: 'blur' }
  302. ]
  303. },
  304. producedList: [
  305. { code: 2, name: '加工' },
  306. { code: 3, name: '装配' }
  307. ]
  308. };
  309. },
  310. computed: {
  311. clientEnvironmentId() {
  312. return this.$store.state.user.info.clientEnvironmentId;
  313. }
  314. },
  315. methods: {
  316. handleAdd() {
  317. this.$refs.equipmentRefs.open();
  318. },
  319. confirmChoose(list) {
  320. this.$set(this.form, 'categoryId', list[0].id);
  321. this.$set(this.form, 'productName', list[0].name);
  322. this.$set(this.form, 'productCode', list[0].code);
  323. this.$set(this.form, 'specification', list[0].specification);
  324. this.$set(this.form, 'brandNum', list[0].brandNum);
  325. this.$set(this.form, 'modelType', list[0].modelType);
  326. this.$set(this.form, 'measuringUnit', list[0].measuringUnit);
  327. this.bomListVersion();
  328. },
  329. handleDeleteItem(index) {
  330. this.form.salesOrders.splice(index, 1);
  331. },
  332. async getPlanCode() {
  333. this.loading = true;
  334. try {
  335. const code = await getCode('product_code');
  336. this.$set(this.form, 'code', code);
  337. } catch (err) {}
  338. },
  339. save() {
  340. this.$refs.form.validate(async (valid) => {
  341. if (!valid) {
  342. return false;
  343. }
  344. if (this.type == 1) {
  345. await this.getPlanCode();
  346. this.loading = true;
  347. saveSaleToPlan(this.form)
  348. .then((res) => {
  349. this.$message.success('新增成功!');
  350. this.$emit('close', true);
  351. })
  352. .finally(() => {
  353. this.loading = false;
  354. });
  355. } else {
  356. this.loading = true;
  357. temporarilyUpdate(this.form)
  358. .then((res) => {
  359. this.$message.success('修改成功!');
  360. this.$emit('close', true);
  361. })
  362. .finally(() => {
  363. this.loading = false;
  364. });
  365. }
  366. });
  367. },
  368. bomListVersion() {
  369. let param = {
  370. bomType: this.form.produceType,
  371. categoryId: this.form.categoryId
  372. };
  373. bomListByPlan(param).then((res) => {
  374. this.bomVersionList = res || [];
  375. });
  376. },
  377. getPlanRouting() {
  378. bomRoutingList(this.form.bomCategoryId).then((res) => {
  379. this.routingList = res || [];
  380. });
  381. },
  382. changeProduceType() {
  383. this.form.bomCategoryId = '';
  384. this.form['bomCategoryName'] = '';
  385. this.form['bomCategoryVersions'] = '';
  386. this.bomVersionList = [];
  387. this.routingList = [];
  388. this.form.produceRoutingId = '';
  389. this.form.produceRoutingName = '';
  390. this.form.produceVersionName = '';
  391. this.bomListVersion();
  392. },
  393. changeBomId() {
  394. this.routingList = [];
  395. this.form.produceRoutingId = '';
  396. this.form.produceRoutingName = '';
  397. this.form.produceVersionName = '';
  398. this.bomVersionList.forEach((f) => {
  399. if (f.id == this.form.bomCategoryId) {
  400. this.$set(this.form, 'bomCategoryName', f.name);
  401. this.$set(this.form, 'bomCategoryVersions', f.versions);
  402. }
  403. });
  404. this.getPlanRouting();
  405. },
  406. changeRoute() {
  407. this.routingList.forEach((f) => {
  408. if (f.id == this.form.produceRoutingId) {
  409. this.$set(this.form, 'produceRoutingName', f.name);
  410. this.$set(this.form, 'produceVersionName', f.version);
  411. }
  412. });
  413. },
  414. cancel() {
  415. this.$emit('close');
  416. }
  417. }
  418. };
  419. </script>
  420. <style lang="scss" scoped>
  421. .el-form-item {
  422. margin-bottom: 14px !important;
  423. }
  424. </style>