detail.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. <template>
  2. <div class="ele-body">
  3. <el-card shadow="never">
  4. <el-form label-width="120px" ref="manageForm" :model="form" :rules="rules">
  5. <headerTitle title="基本信息">
  6. <el-button @click="cancel">返回</el-button>
  7. <el-button type="primary" @click="submit" :loading="loading">保存</el-button>
  8. </headerTitle>
  9. <el-row :gutter="24">
  10. <el-col :span="8">
  11. <el-form-item label="分类" prop="categoryLevelName">
  12. <el-input v-model="form.categoryLevelName" @click.native="openCategory" />
  13. </el-form-item>
  14. </el-col>
  15. <el-col :span="8" v-if="ruleCode == '自定义'" key="1">
  16. <el-form-item label="编码" prop="code">
  17. <el-input v-model="form.code" readonly @click.native="openCode" />
  18. </el-form-item>
  19. </el-col>
  20. <el-col :span="8" v-else key="2">
  21. <el-form-item label="编码" prop="code">
  22. <el-input v-model="form.code" />
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="8">
  26. <el-form-item label="名称" prop="name">
  27. <el-input v-model="form.name" />
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="8">
  31. <el-form-item label="牌号" prop="brandNum">
  32. <el-input v-model="form.brandNum" />
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="8">
  36. <el-form-item label="型号" prop="modelType">
  37. <el-input v-model="form.modelType" />
  38. </el-form-item>
  39. </el-col>
  40. <el-col :span="8">
  41. <el-form-item label="规格" prop="specification">
  42. <el-input v-model="form.specification" />
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="8">
  46. <el-form-item label="计量单位" prop="measuringUnit">
  47. <DictSelection dictName="计量单位" clearable v-model="form.measuringUnit">
  48. </DictSelection>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="8">
  52. <el-form-item label="重量单位" prop="weightUnit">
  53. <DictSelection dictName="重量单位" clearable v-model="form.weightUnit">
  54. </DictSelection>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="8">
  58. <el-form-item label="包装单位" prop="packingUnit">
  59. <DictSelection dictName="包装单位" clearable v-model="form.packingUnit">
  60. </DictSelection>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="8">
  64. <el-form-item label="体积">
  65. <div class="form-line">
  66. <el-input v-model="form.volume" />
  67. <DictSelection class="line-select" dictName="体积单位" clearable v-model="form.volumeUnit">
  68. </DictSelection>
  69. </div>
  70. </el-form-item>
  71. </el-col>
  72. <el-col :span="8">
  73. <el-form-item label="毛重">
  74. <div class="form-line">
  75. <el-input v-model="form.roughWeight" />
  76. </div>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="8" v-if="[1,23,9,28].includes(Number(categoryLevelPathId))">
  80. <el-form-item label="加工类型" prop="isConsumable">
  81. <el-select v-model="form.isConsumable" size="small" style="width: 100%">
  82. <el-option :value="1" label="批量"></el-option>
  83. <el-option :value="0" label="单件"></el-option>
  84. </el-select>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="8">
  88. <el-form-item label="净重">
  89. <div class="form-line">
  90. <el-input v-model="form.netWeight" />
  91. </div>
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="8">
  95. <el-form-item label="所属部门">
  96. <deptSelect v-model="form.deptLeaderId" @changeGroup="searchDeptNodeClick" />
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="8">
  100. <el-form-item label="负责人">
  101. <personSelect ref="directorRef" v-model="form.deptId" @selfChange="handleDirectorChange" :init="false" />
  102. </el-form-item>
  103. </el-col>
  104. </el-row>
  105. </el-form>
  106. </el-card>
  107. <!-- 自定义编码 -->
  108. <CodeDialog ref="codeRefs" v-if="codeShow" @close="codeShow = false" @chooseCode="chooseCode"></CodeDialog>
  109. <!-- 分类选择弹窗 -->
  110. <CategoryDialog ref="categoryRefs" @chooseCategory="confirmCategory" />
  111. <!-- 仓储配置 -->
  112. <WarehouseInfo ref="warehouseRefs" :form="categoryWms" />
  113. <!-- 生产信息 -->
  114. <ProductionInfo ref="productionRefs" :form="categoryMes" />
  115. <!-- 计划 -->
  116. <PlanInfo ref="planRefs" :form="categoryAps" />
  117. <!-- 质量配置 -->
  118. <QualityInfo ref="qualityRefs" :form="categoryQms" />
  119. <!-- 舟皿信息 -->
  120. <BoatInfo ref="qualityRefs" :form="categoryPallet" />
  121. <!-- 周转车信息 -->
  122. <TurnoverInfo ref="turnoverRefs" :form="categoryVehicle" />
  123. <!-- 模具信息 -->
  124. <MoldInfo ref="moldRefs" :form="categoryMold" />
  125. <!-- 备注信息 -->
  126. <RemarkInfo ref="remarkRefs" :form="remarkform" />
  127. <!-- 关联信息 -->
  128. <linkMsg ref="linkMsgRef" :id="$route.query.id" :categoryLevelId="form.categoryLevelId"
  129. :categoryLevelGroupId="form.categoryLevelGroupId" />
  130. </div>
  131. </template>
  132. <script>
  133. import GroupDialog from './components/GroupDialog.vue';
  134. import CodeDialog from './components/codeDialog.vue'
  135. import CategoryDialog from './components/CategoryDialog.vue';
  136. import WarehouseInfo from './components/WarehouseInfo.vue';
  137. import ProcureInfo from './components/ProcureInfo.vue';
  138. import ProductionInfo from './components/ProductionInfo.vue';
  139. import PlanInfo from './components/PlanInfo.vue';
  140. import SalesInfo from './components/SalesInfo.vue';
  141. import QualityInfo from './components/QualityInfo.vue';
  142. import BoatInfo from './components/BoatInfo.vue';
  143. import TurnoverInfo from './components/TurnoverInfo.vue';
  144. import MoldInfo from './components/MoldInfo.vue';
  145. import RemarkInfo from './components/RemarkInfo.vue';
  146. import deptSelect from '@/components/CommomSelect/dept-select.vue';
  147. import personSelect from '@/components/CommomSelect/person-select.vue';
  148. import linkMsg from './components/link-msg.vue';
  149. import { getDetails } from '@/api/classifyManage/itemInformation';
  150. import { getCode } from '@/api/codeManagement';
  151. import { addMaterial } from '@/api/material/list.js';
  152. import { deepClone } from '@/utils/index';
  153. import { finishPageTab, reloadPageTab } from '@/utils/page-tab-util';
  154. export default {
  155. name: 'ManageMaterial',
  156. components: {
  157. linkMsg,
  158. GroupDialog,
  159. deptSelect,
  160. personSelect,
  161. WarehouseInfo,
  162. ProcureInfo,
  163. ProductionInfo,
  164. PlanInfo,
  165. SalesInfo,
  166. QualityInfo,
  167. BoatInfo,
  168. TurnoverInfo,
  169. MoldInfo,
  170. RemarkInfo,
  171. CategoryDialog,
  172. CodeDialog
  173. },
  174. data() {
  175. return {
  176. loading: false,
  177. form: {
  178. categoryLevelGroupName: '',
  179. categoryLevelName: '',
  180. isConsumable: 1
  181. },
  182. remarkform: {
  183. remarkAttach: []
  184. },
  185. categoryAps: {},
  186. categoryMes: {},
  187. categoryMold: {},
  188. categoryPallet: {},
  189. categoryQms: {},
  190. categoryVehicle: {},
  191. categoryWms: {
  192. isUnpack: 1
  193. },
  194. categoryLevelPathId: null,
  195. // 表单验证规则
  196. rules: {
  197. categoryLevelGroupName: [
  198. { required: true, message: '请选择所属物料组', trigger: 'change' }
  199. ],
  200. code: [{ required: true, message: '请输入编码', trigger: 'blur' }],
  201. name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  202. categoryLevelName: [
  203. { required: true, message: '请选择所属分类', trigger: 'change' }
  204. ],
  205. measuringUnit: [
  206. { required: true, message: '请选择计量单位', trigger: 'change' }
  207. ],
  208. weightUnit: [
  209. { required: true, message: '请选择重量单位', trigger: 'change' }
  210. ],
  211. packingUnit: [
  212. { required: true, message: '请选择包装单位', trigger: 'change' }
  213. ],
  214. netWeight: [
  215. { required: true, message: '请输入净重', trigger: 'blur' }
  216. ]
  217. },
  218. PathInfo: {},
  219. id: null,
  220. ruleCode: null,
  221. codeShow: false
  222. };
  223. },
  224. async created() {
  225. if (this.$route.query.id) {
  226. this._getDetails();
  227. }
  228. },
  229. methods: {
  230. async _getDetails() {
  231. const data = await getDetails(this.$route.query.id);
  232. const info = deepClone(data);
  233. this.form = {
  234. ...info.category
  235. };
  236. this.categoryLevelPathId = info.category.categoryLevelPathIdParent
  237. this.judgeSet(info);
  238. this.searchDeptNodeClick(this.form.deptLeaderId);
  239. },
  240. // 判断字段类型并赋值
  241. judgeSet(info) {
  242. if (typeof info.categoryAps == 'string') {
  243. this.categoryAps = {};
  244. } else {
  245. this.categoryAps = info.categoryAps;
  246. }
  247. if (typeof info.categoryMes == 'string') {
  248. this.categoryMes = {};
  249. } else {
  250. this.categoryMes = info.categoryMes;
  251. }
  252. if (typeof info.categoryMold == 'string') {
  253. this.categoryMold = {};
  254. } else {
  255. this.categoryMold = info.categoryMold;
  256. }
  257. if (typeof info.categoryPallet == 'string') {
  258. this.categoryPallet = {};
  259. } else {
  260. this.categoryPallet = info.categoryPallet;
  261. }
  262. if (typeof info.categoryQms == 'string') {
  263. this.categoryQms = {};
  264. } else {
  265. this.categoryQms = info.categoryQms;
  266. }
  267. if (typeof info.categoryVehicle == 'string') {
  268. this.categoryVehicle = {};
  269. } else {
  270. this.categoryVehicle = info.categoryVehicle;
  271. }
  272. if (typeof info.categoryWms == 'string') {
  273. this.categoryWms = {};
  274. } else {
  275. this.categoryWms = info.categoryWms;
  276. }
  277. },
  278. // 选择所属部门
  279. searchDeptNodeClick(id, info) {
  280. // 根据部门获取人员
  281. const params = { executeGroupId: id };
  282. this.$nextTick(() => {
  283. this.$refs.directorRef.getList(params);
  284. });
  285. },
  286. //选择负责人
  287. handleDirectorChange(id, info) { },
  288. // 确定分类
  289. async confirmCategory(node, title, PathInfo, ruleCode) {
  290. this.$set(this.form, 'code', null);
  291. this.categoryLevelPathId = PathInfo.categoryLevelPathId.split(',')[0]
  292. if (title == '选择产品分类') {
  293. this.$set(this.form, 'productCategoryLevelName', node.name);
  294. this.$set(this.form, 'productCategoryLevelId', node.id);
  295. } else {
  296. this.$set(this.form, 'categoryLevelName', node.name);
  297. this.$set(this.form, 'categoryLevelId', node.id);
  298. this.$set(this.form, 'categoryLevelPath', node.name);
  299. this.$set(this.form, 'categoryLevelPathId', node.id);
  300. this.PathInfo = PathInfo;
  301. this.ruleCode = ruleCode
  302. if (ruleCode && ruleCode != '自定义') {
  303. const code = await getCode(ruleCode);
  304. this.$set(this.form, 'code', code);
  305. }
  306. }
  307. this.$forceUpdate()
  308. },
  309. openCategory() {
  310. this.$refs.categoryRefs.open();
  311. },
  312. openCode() {
  313. this.codeShow = true
  314. },
  315. chooseCode(code) {
  316. this.$set(this.form, 'code', code);
  317. this.codeShow = false
  318. this.$forceUpdate()
  319. },
  320. cancel() {
  321. finishPageTab();
  322. this.$router.go(-1);
  323. },
  324. // 保存
  325. submit() {
  326. this.$refs.manageForm.validate((valid) => {
  327. if (!valid) {
  328. return false;
  329. }
  330. this.loading = true;
  331. // const imgList = this.remarkform.imgList;
  332. // const arr = [];
  333. // if (imgList.length) {
  334. // imgList.map((item) => {
  335. // arr.push(item.storePath);
  336. // });
  337. // this.form.remarkAttach = arr.join(',');
  338. // }
  339. // this.form.remark = this.remarkform.remark
  340. // ? this.remarkform.remark
  341. // : '';
  342. const data = {
  343. categoryWms: this.categoryWms,
  344. categoryAps: this.categoryAps,
  345. categoryMes: this.categoryMes,
  346. categoryMold: this.categoryMold,
  347. categoryPallet: this.categoryPallet,
  348. categoryQms: this.categoryQms,
  349. categoryVehicle: this.categoryVehicle,
  350. category: {
  351. ...this.form,
  352. ...this.remarkform,
  353. ...this.PathInfo
  354. }
  355. };
  356. if (this.$route.query.status == 1) {
  357. data.category.id = null
  358. data.categoryWms.id = null
  359. data.categoryAps.id = null
  360. data.categoryMes.id = null
  361. data.categoryMold.id = null
  362. data.categoryPallet.id = null
  363. data.categoryQms.id = null
  364. data.categoryVehicle.id = null
  365. }
  366. addMaterial(data)
  367. .then((msg) => {
  368. this.loading = false;
  369. this.$message.success(msg);
  370. reloadPageTab({ fullPath: '/material/product' });
  371. this.$router.go(-1);
  372. })
  373. .catch((e) => {
  374. this.loading = false;
  375. });
  376. });
  377. }
  378. }
  379. };
  380. </script>
  381. <style lang="scss" scoped>
  382. .ele-page-header {
  383. border: none;
  384. }
  385. .body-top {
  386. display: flex;
  387. align-items: center;
  388. justify-content: space-between;
  389. background: #fff;
  390. .top-left {
  391. display: flex;
  392. align-items: center;
  393. justify-content: flex-start;
  394. margin-left: -25px;
  395. .el-form-item {
  396. margin-bottom: 0;
  397. }
  398. }
  399. }
  400. .divider {
  401. margin: 20px 0;
  402. .title {
  403. display: flex;
  404. align-items: center;
  405. margin-bottom: 10px;
  406. div {
  407. width: 8px;
  408. height: 20px;
  409. margin-right: 10px;
  410. }
  411. span {
  412. font-size: 20px;
  413. }
  414. }
  415. .ele-width {
  416. width: 100%;
  417. height: 2px;
  418. }
  419. }
  420. .form-line {
  421. display: flex;
  422. align-items: center;
  423. justify-content: space-between;
  424. .line-select {
  425. margin-left: 15px;
  426. }
  427. }
  428. </style>