WarehouseInfo.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  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. >
  94. <div class="rules_box_tabs">
  95. <el-row :gutter="24">
  96. <el-col :span="8">
  97. <el-form-item label="编码">
  98. <el-input disabled v-model="items.code"></el-input>
  99. </el-form-item>
  100. </el-col>
  101. <el-col :span="8">
  102. <el-form-item label="名称">
  103. <el-input v-model="items.name"></el-input>
  104. </el-form-item>
  105. </el-col>
  106. <el-col :span="8">
  107. <el-form-item label="是否启用">
  108. <el-radio-group
  109. v-model="items.status"
  110. @input="statusChange($event, indexs)"
  111. >
  112. <el-radio :label="1">是</el-radio>
  113. <el-radio :label="0">否</el-radio>
  114. </el-radio-group>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="24">
  118. <el-form-item label="最小包装单元">
  119. <el-input
  120. class="packingUnit"
  121. v-model="items.minPackageCell"
  122. placeholder="请输入内容"
  123. ></el-input>
  124. <div class="packingUnit">
  125. <DictSelection
  126. dictName="计量单位"
  127. clearable
  128. v-model="items.packageUnit"
  129. :isProhibit="true"
  130. >
  131. </DictSelection>
  132. </div>
  133. <span>/</span>
  134. <div class="lastPackingUnit">
  135. <DictSelection
  136. dictName="计量单位"
  137. clearable
  138. v-model="items.minConversionUnit"
  139. >
  140. </DictSelection>
  141. </div>
  142. </el-form-item>
  143. </el-col>
  144. <el-col :span="24">
  145. <el-form-item label="内包装单元">
  146. <el-input
  147. class="packingUnit"
  148. v-model="items.inPackageCell"
  149. placeholder="请输入内容"
  150. ></el-input>
  151. <div class="packingUnit">
  152. <DictSelection
  153. dictName="计量单位"
  154. clearable
  155. v-model="items.minConversionUnit"
  156. >
  157. </DictSelection>
  158. </div>
  159. <span>/</span>
  160. <div class="lastPackingUnit">
  161. <DictSelection
  162. dictName="计量单位"
  163. clearable
  164. v-model="items.inConversionUnit"
  165. >
  166. </DictSelection>
  167. </div>
  168. </el-form-item>
  169. </el-col>
  170. <el-col :span="24">
  171. <el-form-item label="外包装单元">
  172. <el-input
  173. class="packingUnit"
  174. v-model="items.outPackageCell"
  175. placeholder="请输入内容"
  176. ></el-input>
  177. <div class="packingUnit">
  178. <DictSelection
  179. dictName="计量单位"
  180. clearable
  181. v-model="items.inConversionUnit"
  182. >
  183. </DictSelection>
  184. </div>
  185. <span>/</span>
  186. <div class="lastPackingUnit">
  187. <DictSelection
  188. dictName="计量单位"
  189. clearable
  190. v-model="items.outConversionUnit"
  191. >
  192. </DictSelection>
  193. </div>
  194. </el-form-item>
  195. </el-col>
  196. </el-row>
  197. </div>
  198. </el-tab-pane>
  199. </el-tabs>
  200. </div>
  201. </el-form>
  202. <el-dialog title="添加包装组" :visible.sync="dialogVisible" width="50%">
  203. <el-form label-width="120px" ref="form" :model="ruleItem">
  204. <el-row :gutter="24">
  205. <el-col :span="12">
  206. <el-form-item label="包装名称">
  207. <el-input v-model="ruleItem.name"></el-input>
  208. </el-form-item>
  209. </el-col>
  210. <el-col :span="12">
  211. <el-form-item label="包装编码">
  212. <el-input disabled v-model="ruleItem.code"></el-input>
  213. </el-form-item>
  214. </el-col>
  215. </el-row>
  216. </el-form>
  217. <span slot="footer" class="dialog-footer">
  218. <el-button @click="dialogVisible = false">取 消</el-button>
  219. <el-button type="primary" @click="ruleConig">确 定</el-button>
  220. </span>
  221. </el-dialog>
  222. </div>
  223. </template>
  224. <script>
  225. import deptSelect from '@/components/CommomSelect/dept-select.vue';
  226. import personSelect from '@/components/CommomSelect/person-select.vue';
  227. import { deletePackageDisposition } from '@/api/material/list.js';
  228. import { getCode } from '@/api/codeManagement/index.js';
  229. export default {
  230. components: { deptSelect, personSelect },
  231. props: {
  232. form: {
  233. type: Object,
  234. default: () => {}
  235. },
  236. packageDispositionVOList: {
  237. type: Array,
  238. default: () => []
  239. },
  240. measuringUnit: {
  241. type: String,
  242. default() {
  243. return '';
  244. }
  245. }
  246. },
  247. watch: {
  248. measuringUnit(val) {
  249. this.packagingSpecification = this.packagingSpecification.map(
  250. (item) => {
  251. return { ...item, packageUnit: val };
  252. }
  253. );
  254. },
  255. packagingSpecification: {
  256. handler(val) {
  257. this.$emit('change', val);
  258. },
  259. deep: true
  260. },
  261. packageDispositionVOList: {
  262. handler(packageDispositionVOList) {
  263. if (packageDispositionVOList.length > 0) {
  264. let codeList = new Set(
  265. packageDispositionVOList.map((item) => item.code)
  266. );
  267. console.log(codeList);
  268. let arr = [];
  269. codeList.forEach((code) => {
  270. let obj = {};
  271. let filters = packageDispositionVOList.filter(
  272. (item) => item.code == code
  273. );
  274. this.idsList.push({
  275. code,
  276. ids: filters.map((item) => item.id)
  277. });
  278. filters.map((item) => {
  279. switch (item.sort) {
  280. case '0':
  281. obj.code = item.code;
  282. obj.name = item.name;
  283. obj.status = Number(item.status);
  284. break;
  285. case '1':
  286. obj.minPackageCell = item.packageCell;
  287. obj.packageUnit = item.packageUnit;
  288. obj.minConversionUnit = item.conversionUnit;
  289. case '2':
  290. obj.inPackageCell = item.packageCell;
  291. obj.inConversionUnit = item.conversionUnit;
  292. break;
  293. case '3':
  294. obj.outPackageCell = item.packageCell;
  295. obj.outConversionUnit = item.conversionUnit;
  296. break;
  297. }
  298. });
  299. arr.push(obj);
  300. });
  301. this.packagingSpecification = arr;
  302. this.packingRules = arr[0].code;
  303. } else {
  304. this.packagingSpecification = [];
  305. }
  306. },
  307. deep: true
  308. }
  309. },
  310. data() {
  311. return {
  312. idsList: [],
  313. packagingSpecification: [],
  314. packingRules: '',
  315. dialogVisible: false,
  316. ruleItem: {
  317. code: '',
  318. name: '',
  319. status: 0,
  320. minPackageCell: '',
  321. packageUnit: this.measuringUnit,
  322. minConversionUnit: '',
  323. inPackageCell: '',
  324. inConversionUnit: '',
  325. outPackageCell: '',
  326. inConversionUnit: '',
  327. outConversionUnit: ''
  328. },
  329. option: [
  330. {
  331. label: 'KG',
  332. value: 'KG'
  333. }
  334. ]
  335. };
  336. },
  337. created() {
  338. console.log(
  339. 'this.packageDispositionVOList-',
  340. this.packageDispositionVOList
  341. );
  342. },
  343. methods: {
  344. statusChange(value, indexs) {
  345. console.log(value);
  346. console.log(this.packagingSpecification);
  347. if (value == 1) {
  348. this.packagingSpecification = this.packagingSpecification.map(
  349. (item, index) => {
  350. if (indexs == index) {
  351. item.status = 1;
  352. } else {
  353. item.status = 0;
  354. }
  355. return item;
  356. }
  357. );
  358. }
  359. },
  360. ruleConig() {
  361. console.log(this.ruleItem);
  362. if (this.packagingSpecification.length == 0) {
  363. this.ruleItem.status = 1;
  364. } else {
  365. this.ruleItem.status = 0;
  366. }
  367. this.packagingSpecification.push(this.ruleItem);
  368. this.dialogVisible = false;
  369. this.packingRules = this.ruleItem.code;
  370. },
  371. async addPackingRules() {
  372. let code = await getCode('package_disposition');
  373. this.ruleItem = {
  374. code: code,
  375. name: '',
  376. status: 0,
  377. minPackageCell: '',
  378. packageUnit: this.measuringUnit,
  379. minConversionUnit: '',
  380. inPackageCell: '',
  381. inConversionUnit: '',
  382. outPackageCell: '',
  383. inConversionUnit: '',
  384. outConversionUnit: ''
  385. };
  386. this.dialogVisible = true;
  387. },
  388. handleClick(val) {
  389. console.log(val);
  390. this.packingRules = val.name;
  391. },
  392. // 删除tab
  393. handleTabsEdit(targetName, action) {
  394. if (action == 'remove') {
  395. let index = this.packagingSpecification.findIndex(
  396. (item) => item.code == targetName
  397. );
  398. let idsIndex = this.idsList.findIndex(
  399. (item) => item.code == targetName
  400. );
  401. if (this.idsList.length > 0 && idsIndex > -1) {
  402. let ids = this.idsList.filter(
  403. (item) => item.code == this.packagingSpecification[index].code
  404. )[0].ids;
  405. deletePackageDisposition(ids).then(() => {
  406. this.idsList = this.idsList.filter(
  407. (item) => item.code != this.packagingSpecification[index].code
  408. );
  409. this.packagingSpecification.splice(index, 1);
  410. });
  411. } else {
  412. this.packagingSpecification.splice(index, 1);
  413. }
  414. }
  415. },
  416. inventoryModeChange(value) {
  417. if (value == 1) {
  418. this.form.isUnpack = 1;
  419. } else {
  420. this.form.isUnpack = 0;
  421. }
  422. },
  423. // 选择所属部门
  424. searchDeptNodeClick(id, info) {
  425. // 根据部门获取人员
  426. const params = { executeGroupId: id };
  427. this.$nextTick(() => {
  428. this.$refs.directorRef.getList(params);
  429. });
  430. },
  431. //选择负责人
  432. handleDirectorChange(id, info) {}
  433. }
  434. };
  435. </script>
  436. <style lang="scss" scoped>
  437. .other {
  438. background: #fff;
  439. padding: 1px 17px;
  440. }
  441. .divider {
  442. margin: 0px 0 20px;
  443. .title {
  444. display: flex;
  445. align-items: center;
  446. margin-bottom: 10px;
  447. div {
  448. width: 8px;
  449. height: 20px;
  450. margin-right: 10px;
  451. }
  452. span {
  453. font-size: 20px;
  454. }
  455. }
  456. .ele-width {
  457. width: 100%;
  458. height: 2px;
  459. }
  460. }
  461. .form-line {
  462. display: flex;
  463. align-items: center;
  464. justify-content: space-between;
  465. .line-select {
  466. margin-left: 15px;
  467. }
  468. }
  469. .rules_box {
  470. margin: 0px 20px 20px 20px;
  471. .rules_box_tabs {
  472. margin: 20px 0;
  473. :deep(.el-form-item__content) {
  474. > div {
  475. display: inline-block;
  476. }
  477. }
  478. }
  479. }
  480. .packingUnit {
  481. width: 200px;
  482. margin-right: 10px;
  483. }
  484. .lastPackingUnit {
  485. width: 200px;
  486. margin-left: 10px;
  487. }
  488. </style>