detail.vue 13 KB

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