WarehouseInfo.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. <template>
  2. <div class="other">
  3. <el-form label-width="120px" ref="form" :model="form">
  4. <div class="divider">
  5. <div class="title">
  6. <div class="ele-bg-primary"></div>
  7. <span>仓储配置</span>
  8. </div>
  9. <div class="ele-bg-primary ele-width"></div>
  10. </div>
  11. <el-row :gutter="24">
  12. <el-col :span="8">
  13. <el-form-item label="启用库存预警">
  14. <el-radio v-model="form.isWarn" :label="1">是</el-radio>
  15. <el-radio v-model="form.isWarn" :label="0">否</el-radio>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="8">
  19. <el-form-item label="盘点模式" prop="inventoryMode">
  20. <el-radio-group
  21. v-model="form.inventoryMode"
  22. @input="inventoryModeChange"
  23. >
  24. <el-radio :label="1">逐个盘点</el-radio>
  25. <el-radio :label="2">批量盘点</el-radio>
  26. </el-radio-group>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="8">
  30. <el-form-item label="允许拆包" prop="isUnpack">
  31. <el-switch
  32. v-model="form.isUnpack"
  33. :active-value="1"
  34. :inactive-value="0"
  35. >
  36. </el-switch>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="8">
  40. <el-form-item label="安全库存" prop="secureInventory">
  41. <el-input v-model="form.secureInventory" />
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="8">
  45. <el-form-item label="最小库存" prop="minInventory">
  46. <el-input v-model="form.minInventory" />
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="8">
  50. <el-form-item label="最大库存" prop="maxInventory">
  51. <el-input v-model="form.maxInventory" />
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="8">
  55. <el-form-item label="质保预警参考" prop="warrantyWarnRefer">
  56. <DictSelection
  57. dictName="质保预警参考"
  58. clearable
  59. v-model="form.warrantyWarnRefer"
  60. >
  61. </DictSelection>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="8">
  65. <el-form-item label="保质期">
  66. <div class="form-line">
  67. <el-input v-model="form.warrantyPeriod" />
  68. <DictSelection
  69. class="line-select"
  70. dictName="保质期单位"
  71. clearable
  72. v-model="form.warrantyPeriodUnit"
  73. >
  74. </DictSelection>
  75. </div>
  76. </el-form-item>
  77. </el-col>
  78. </el-row>
  79. <div class="rules_box">
  80. <el-button type="primary" @click="addPackingRules"
  81. >添加包装组</el-button
  82. >
  83. <el-tabs
  84. v-model="packingRules"
  85. editable
  86. @tab-click="handleClick"
  87. @edit="handleTabsEdit"
  88. >
  89. <el-tab-pane
  90. v-for="(items, indexs) in packagingSpecification"
  91. :label="items.name"
  92. :name="items.code"
  93. :key="indexs"
  94. >
  95. <div class="rules_box_tabs">
  96. <el-row :gutter="24">
  97. <el-col :span="8">
  98. <el-form-item label="编码">
  99. <el-input disabled v-model="items.code"></el-input>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="8">
  103. <el-form-item label="名称">
  104. <el-input v-model="items.name"></el-input>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="8">
  108. <el-form-item label="是否启用">
  109. <el-radio-group
  110. v-model="items.status"
  111. @input="statusChange($event, indexs)"
  112. >
  113. <el-radio :label="1">是</el-radio>
  114. <el-radio :label="0">否</el-radio>
  115. </el-radio-group>
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="24">
  119. <el-form-item label="最小包装单元">
  120. <el-input
  121. class="packingUnit"
  122. v-model="items.minPackageCell"
  123. placeholder="请输入内容"
  124. ></el-input>
  125. <div class="packingUnit">
  126. <DictSelection
  127. dictName="计量单位"
  128. clearable
  129. v-model="items.packageUnit"
  130. :isProhibit="true"
  131. >
  132. </DictSelection>
  133. </div>
  134. <span>/</span>
  135. <div class="lastPackingUnit">
  136. <DictSelection
  137. dictName="计量单位"
  138. clearable
  139. v-model="items.minConversionUnit"
  140. >
  141. </DictSelection>
  142. </div>
  143. </el-form-item>
  144. </el-col>
  145. <el-col :span="24">
  146. <el-form-item label="内包装单元">
  147. <el-input
  148. class="packingUnit"
  149. v-model="items.inPackageCell"
  150. placeholder="请输入内容"
  151. ></el-input>
  152. <div class="packingUnit">
  153. <DictSelection
  154. dictName="计量单位"
  155. clearable
  156. v-model="items.minConversionUnit"
  157. >
  158. </DictSelection>
  159. </div>
  160. <span>/</span>
  161. <div class="lastPackingUnit">
  162. <DictSelection
  163. dictName="计量单位"
  164. clearable
  165. v-model="items.inConversionUnit"
  166. >
  167. </DictSelection>
  168. </div>
  169. </el-form-item>
  170. </el-col>
  171. <el-col :span="24">
  172. <el-form-item label="外包装单元">
  173. <el-input
  174. class="packingUnit"
  175. v-model="items.outPackageCell"
  176. placeholder="请输入内容"
  177. ></el-input>
  178. <div class="packingUnit">
  179. <DictSelection
  180. dictName="计量单位"
  181. clearable
  182. v-model="items.inConversionUnit"
  183. >
  184. </DictSelection>
  185. </div>
  186. <span>/</span>
  187. <div class="lastPackingUnit">
  188. <DictSelection
  189. dictName="计量单位"
  190. clearable
  191. v-model="items.outConversionUnit"
  192. >
  193. </DictSelection>
  194. </div>
  195. </el-form-item>
  196. </el-col>
  197. </el-row>
  198. </div>
  199. </el-tab-pane>
  200. </el-tabs>
  201. </div>
  202. </el-form>
  203. <el-dialog title="添加包装组" :visible.sync="dialogVisible" width="50%">
  204. <el-form label-width="120px" ref="form" :model="ruleItem">
  205. <el-row :gutter="24">
  206. <el-col :span="12">
  207. <el-form-item label="包装名称">
  208. <el-input v-model="ruleItem.name"></el-input>
  209. </el-form-item>
  210. </el-col>
  211. <el-col :span="12">
  212. <el-form-item label="包装编码">
  213. <el-input disabled v-model="ruleItem.code"></el-input>
  214. </el-form-item>
  215. </el-col>
  216. </el-row>
  217. </el-form>
  218. <span slot="footer" class="dialog-footer">
  219. <el-button @click="dialogVisible = false">取 消</el-button>
  220. <el-button type="primary" @click="ruleConig">确 定</el-button>
  221. </span>
  222. </el-dialog>
  223. </div>
  224. </template>
  225. <script>
  226. import deptSelect from '@/components/CommomSelect/dept-select.vue';
  227. import personSelect from '@/components/CommomSelect/person-select.vue';
  228. import { deletePackageDisposition } from '@/api/material/list.js';
  229. import { getCode } from '@/api/codeManagement/index.js';
  230. export default {
  231. components: { deptSelect, personSelect },
  232. props: {
  233. form: {
  234. type: Object,
  235. default: () => {}
  236. },
  237. packageDispositionVOList: {
  238. type: Array,
  239. default: () => []
  240. },
  241. measuringUnit: {
  242. type: String,
  243. default() {
  244. return '';
  245. }
  246. },
  247. packingUnit: {
  248. type: String,
  249. default() {
  250. return '';
  251. }
  252. }
  253. },
  254. watch: {
  255. measuringUnit(val) {
  256. this.packagingSpecification = this.packagingSpecification.map(
  257. (item) => {
  258. return { ...item, packageUnit: val };
  259. }
  260. );
  261. },
  262. packagingSpecification: {
  263. handler(val) {
  264. this.$emit('change', val);
  265. },
  266. deep: true
  267. },
  268. packageDispositionVOList: {
  269. handler(packageDispositionVOList) {
  270. if (packageDispositionVOList.length > 0) {
  271. let codeList = new Set(
  272. packageDispositionVOList.map((item) => item.code)
  273. );
  274. console.log(codeList);
  275. let arr = [];
  276. codeList.forEach((code) => {
  277. let obj = {};
  278. let filters = packageDispositionVOList.filter(
  279. (item) => item.code == code
  280. );
  281. this.idsList.push({
  282. code,
  283. ids: filters.map((item) => item.id)
  284. });
  285. filters.map((item) => {
  286. obj['id' + item.sort] = item.id;
  287. switch (item.sort) {
  288. case '0':
  289. obj.code = item.code;
  290. obj.name = item.name;
  291. obj.status = Number(item.status);
  292. break;
  293. case '1':
  294. obj.minPackageCell = item.packageCell;
  295. obj.packageUnit = item.packageUnit;
  296. obj.minConversionUnit = item.conversionUnit;
  297. case '2':
  298. obj.inPackageCell = item.packageCell;
  299. obj.inConversionUnit = item.conversionUnit;
  300. break;
  301. case '3':
  302. obj.outPackageCell = item.packageCell;
  303. obj.outConversionUnit = item.conversionUnit;
  304. break;
  305. }
  306. });
  307. arr.push(obj);
  308. });
  309. this.packagingSpecification = arr;
  310. this.packingRules = arr[0].code;
  311. } else {
  312. this.packagingSpecification = [];
  313. }
  314. },
  315. deep: true
  316. }
  317. },
  318. data() {
  319. return {
  320. idsList: [],
  321. packagingSpecification: [],
  322. packingRules: '',
  323. dialogVisible: false,
  324. ruleItem: {
  325. code: '',
  326. name: '',
  327. status: 0,
  328. minPackageCell: '',
  329. packageUnit: this.measuringUnit,
  330. minConversionUnit: '',
  331. inPackageCell: '',
  332. inConversionUnit: '',
  333. outPackageCell: '',
  334. inConversionUnit: '',
  335. outConversionUnit: ''
  336. },
  337. option: [
  338. {
  339. label: 'KG',
  340. value: 'KG'
  341. }
  342. ],
  343. hasPushed: false
  344. };
  345. },
  346. created() {
  347. console.log(
  348. 'this.packageDispositionVOList-',
  349. this.packageDispositionVOList
  350. );
  351. if (this.packageDispositionVOList.length == 0) {
  352. this.hasPushed = false;
  353. }
  354. console.log(this.hasPushed, 'has');
  355. },
  356. mounted() {
  357. console.log(this.packingRules, 'packingRules');
  358. },
  359. methods: {
  360. async defaultBuild(val) {
  361. if (!this.hasPushed) {
  362. let code = await getCode('package_disposition');
  363. this.ruleItem = {
  364. code: code,
  365. name: '默认包装组',
  366. status: 1,
  367. minPackageCell: '1',
  368. packageUnit: this.measuringUnit,
  369. minConversionUnit: this.packingUnit,
  370. inPackageCell: '',
  371. inConversionUnit: '',
  372. outPackageCell: '',
  373. inConversionUnit: '',
  374. outConversionUnit: ''
  375. };
  376. this.packagingSpecification.push(this.ruleItem);
  377. console.log('111111第一次添加');
  378. this.packingRules = this.ruleItem.code;
  379. this.hasPushed = true;
  380. } else {
  381. console.log('数组已经进行过push操作,无法再次添加元素。');
  382. this.packagingSpecification = this.packagingSpecification.map(
  383. (item) => {
  384. return { ...item, minConversionUnit: val };
  385. }
  386. );
  387. }
  388. },
  389. statusChange(value, indexs) {
  390. console.log(value);
  391. if (value == 1) {
  392. this.packagingSpecification = this.packagingSpecification.map(
  393. (item, index) => {
  394. if (indexs == index) {
  395. item.status = 1;
  396. } else {
  397. item.status = 0;
  398. }
  399. return item;
  400. }
  401. );
  402. }
  403. },
  404. ruleConig() {
  405. console.log(this.ruleItem);
  406. if (this.packagingSpecification.length == 0) {
  407. this.ruleItem.status = 1;
  408. } else {
  409. this.ruleItem.status = 0;
  410. }
  411. this.packagingSpecification.push(this.ruleItem);
  412. this.dialogVisible = false;
  413. this.packingRules = this.ruleItem.code;
  414. },
  415. async addPackingRules() {
  416. let code = await getCode('package_disposition');
  417. this.ruleItem = {
  418. code: code,
  419. name: '',
  420. status: 0,
  421. minPackageCell: '1',
  422. packageUnit: this.measuringUnit,
  423. minConversionUnit: this.packingUnit,
  424. inPackageCell: '',
  425. inConversionUnit: '',
  426. outPackageCell: '',
  427. inConversionUnit: '',
  428. outConversionUnit: ''
  429. };
  430. this.dialogVisible = true;
  431. },
  432. handleClick(val) {
  433. console.log(val);
  434. this.packingRules = val.name;
  435. },
  436. // 删除tab
  437. handleTabsEdit(targetName, action) {
  438. if (action == 'remove') {
  439. let index = this.packagingSpecification.findIndex(
  440. (item) => item.code == targetName
  441. );
  442. let idsIndex = this.idsList.findIndex(
  443. (item) => item.code == targetName
  444. );
  445. if (this.idsList.length > 0 && idsIndex > -1) {
  446. let ids = this.idsList.filter(
  447. (item) => item.code == this.packagingSpecification[index].code
  448. )[0].ids;
  449. deletePackageDisposition(ids).then(() => {
  450. this.idsList = this.idsList.filter(
  451. (item) => item.code != this.packagingSpecification[index].code
  452. );
  453. this.packagingSpecification.splice(index, 1);
  454. });
  455. } else {
  456. this.packagingSpecification.splice(index, 1);
  457. }
  458. }
  459. },
  460. inventoryModeChange(value) {
  461. if (value == 1) {
  462. this.form.isUnpack = 1;
  463. } else {
  464. this.form.isUnpack = 0;
  465. }
  466. },
  467. // 选择所属部门
  468. searchDeptNodeClick(id, info) {
  469. // 根据部门获取人员
  470. const params = { executeGroupId: id };
  471. this.$nextTick(() => {
  472. this.$refs.directorRef.getList(params);
  473. });
  474. },
  475. //选择负责人
  476. handleDirectorChange(id, info) {}
  477. }
  478. };
  479. </script>
  480. <style lang="scss" scoped>
  481. .other {
  482. background: #fff;
  483. padding: 1px 17px;
  484. }
  485. .divider {
  486. margin: 0px 0 20px;
  487. .title {
  488. display: flex;
  489. align-items: center;
  490. margin-bottom: 10px;
  491. div {
  492. width: 8px;
  493. height: 20px;
  494. margin-right: 10px;
  495. }
  496. span {
  497. font-size: 20px;
  498. }
  499. }
  500. .ele-width {
  501. width: 100%;
  502. height: 2px;
  503. }
  504. }
  505. .form-line {
  506. display: flex;
  507. align-items: center;
  508. justify-content: space-between;
  509. .line-select {
  510. margin-left: 15px;
  511. }
  512. }
  513. .rules_box {
  514. margin: 0px 20px 20px 20px;
  515. .rules_box_tabs {
  516. margin: 20px 0;
  517. :deep(.el-form-item__content) {
  518. > div {
  519. display: inline-block;
  520. }
  521. }
  522. }
  523. }
  524. .packingUnit {
  525. width: 200px;
  526. margin-right: 10px;
  527. }
  528. .lastPackingUnit {
  529. width: 200px;
  530. margin-left: 10px;
  531. }
  532. </style>