detail.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  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="categoryLevelPathId == 1">
  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. categoryLevelPathId: null,
  200. // 表单验证规则
  201. rules: {
  202. categoryLevelGroupName: [
  203. { required: true, message: '请选择所属物料组', trigger: 'change' }
  204. ],
  205. code: [{ required: true, message: '请输入编码', trigger: 'blur' }],
  206. name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  207. categoryLevelName: [
  208. { required: true, message: '请选择所属分类', trigger: 'change' }
  209. ],
  210. measuringUnit: [
  211. { required: true, message: '请选择计量单位', trigger: 'change' }
  212. ],
  213. weightUnit: [
  214. { required: true, message: '请选择重量单位', trigger: 'change' }
  215. ],
  216. packingUnit: [
  217. { required: true, message: '请选择包装单位', trigger: 'change' }
  218. ],
  219. netWeight: [
  220. { required: true, message: '请输入净重', trigger: 'blur' }
  221. ]
  222. },
  223. PathInfo: {},
  224. id: null,
  225. ruleCode: null,
  226. codeShow: false
  227. };
  228. },
  229. async created() {
  230. if (this.$route.query.id) {
  231. this._getDetails();
  232. }
  233. },
  234. methods: {
  235. async _getDetails() {
  236. const data = await getDetails(this.$route.query.id);
  237. const info = deepClone(data);
  238. this.form = {
  239. ...info.category
  240. };
  241. this.judgeSet(info);
  242. this.searchDeptNodeClick(this.form.deptLeaderId);
  243. },
  244. // 判断字段类型并赋值
  245. judgeSet(info) {
  246. if (typeof info.categoryAps == 'string') {
  247. this.categoryAps = {};
  248. } else {
  249. this.categoryAps = info.categoryAps;
  250. }
  251. if (typeof info.categoryMes == 'string') {
  252. this.categoryMes = {};
  253. } else {
  254. this.categoryMes = info.categoryMes;
  255. }
  256. if (typeof info.categoryMold == 'string') {
  257. this.categoryMold = {};
  258. } else {
  259. this.categoryMold = info.categoryMold;
  260. }
  261. if (typeof info.categoryPallet == 'string') {
  262. this.categoryPallet = {};
  263. } else {
  264. this.categoryPallet = info.categoryPallet;
  265. }
  266. if (typeof info.categoryQms == 'string') {
  267. this.categoryQms = {};
  268. } else {
  269. this.categoryQms = info.categoryQms;
  270. }
  271. if (typeof info.categoryVehicle == 'string') {
  272. this.categoryVehicle = {};
  273. } else {
  274. this.categoryVehicle = info.categoryVehicle;
  275. }
  276. if (typeof info.categoryWms == 'string') {
  277. this.categoryWms = {};
  278. } else {
  279. this.categoryWms = info.categoryWms;
  280. }
  281. },
  282. // 选择所属部门
  283. searchDeptNodeClick(id, info) {
  284. // 根据部门获取人员
  285. const params = { executeGroupId: id };
  286. this.$nextTick(() => {
  287. this.$refs.directorRef.getList(params);
  288. });
  289. },
  290. //选择负责人
  291. handleDirectorChange(id, info) { },
  292. // 确定分类
  293. async confirmCategory(node, title, PathInfo, ruleCode) {
  294. this.$set(this.form, 'code', null);
  295. this.categoryLevelPathId = PathInfo.categoryLevelPathId
  296. if (title == '选择产品分类') {
  297. this.$set(this.form, 'productCategoryLevelName', node.name);
  298. this.$set(this.form, 'productCategoryLevelId', node.id);
  299. } else {
  300. this.$set(this.form, 'categoryLevelName', node.name);
  301. this.$set(this.form, 'categoryLevelId', node.id);
  302. this.$set(this.form, 'categoryLevelPath', node.name);
  303. this.$set(this.form, 'categoryLevelPathId', node.id);
  304. this.PathInfo = PathInfo;
  305. this.ruleCode = ruleCode
  306. if (ruleCode && ruleCode != '自定义') {
  307. const code = await getCode(ruleCode);
  308. this.$set(this.form, 'code', code);
  309. }
  310. }
  311. this.$forceUpdate()
  312. },
  313. openCategory() {
  314. this.$refs.categoryRefs.open();
  315. },
  316. openCode() {
  317. this.codeShow = true
  318. },
  319. chooseCode(code) {
  320. this.$set(this.form, 'code', code);
  321. this.codeShow = false
  322. this.$forceUpdate()
  323. },
  324. cancel() {
  325. finishPageTab();
  326. this.$router.go(-1);
  327. },
  328. // 保存
  329. submit() {
  330. this.$refs.manageForm.validate((valid) => {
  331. if (!valid) {
  332. return false;
  333. }
  334. this.loading = true;
  335. // const imgList = this.remarkform.imgList;
  336. // const arr = [];
  337. // if (imgList.length) {
  338. // imgList.map((item) => {
  339. // arr.push(item.storePath);
  340. // });
  341. // this.form.remarkAttach = arr.join(',');
  342. // }
  343. // this.form.remark = this.remarkform.remark
  344. // ? this.remarkform.remark
  345. // : '';
  346. const data = {
  347. categoryWms: this.categoryWms,
  348. categoryAps: this.categoryAps,
  349. categoryMes: this.categoryMes,
  350. categoryMold: this.categoryMold,
  351. categoryPallet: this.categoryPallet,
  352. categoryQms: this.categoryQms,
  353. categoryVehicle: this.categoryVehicle,
  354. category: {
  355. ...this.form,
  356. ...this.remarkform,
  357. ...this.PathInfo
  358. }
  359. };
  360. addMaterial(data)
  361. .then((msg) => {
  362. this.loading = false;
  363. this.$message.success(msg);
  364. reloadPageTab({ fullPath: '/material/product' });
  365. this.$router.go(-1);
  366. })
  367. .catch((e) => {
  368. this.loading = false;
  369. });
  370. });
  371. }
  372. }
  373. };
  374. </script>
  375. <style lang="scss" scoped>
  376. .ele-page-header {
  377. border: none;
  378. }
  379. .body-top {
  380. display: flex;
  381. align-items: center;
  382. justify-content: space-between;
  383. background: #fff;
  384. .top-left {
  385. display: flex;
  386. align-items: center;
  387. justify-content: flex-start;
  388. margin-left: -25px;
  389. .el-form-item {
  390. margin-bottom: 0;
  391. }
  392. }
  393. }
  394. .divider {
  395. margin: 20px 0;
  396. .title {
  397. display: flex;
  398. align-items: center;
  399. margin-bottom: 10px;
  400. div {
  401. width: 8px;
  402. height: 20px;
  403. margin-right: 10px;
  404. }
  405. span {
  406. font-size: 20px;
  407. }
  408. }
  409. .ele-width {
  410. width: 100%;
  411. height: 2px;
  412. }
  413. }
  414. .form-line {
  415. display: flex;
  416. align-items: center;
  417. justify-content: space-between;
  418. .line-select {
  419. margin-left: 15px;
  420. }
  421. }
  422. </style>