goodsAllocation.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. <template>
  2. <ele-modal
  3. :visible.sync="visible"
  4. :close-on-click-modal="false"
  5. title="货位管理"
  6. width="60%"
  7. @close="cancel"
  8. :maxable="true"
  9. >
  10. <el-form ref="form" :model="form" :rules="rules" label-width="140px">
  11. <el-row>
  12. <el-col :span="8">
  13. <el-form-item label="层数" prop="levelNum">
  14. <el-input
  15. v-model="form.levelNum"
  16. :disabled="form.positionList.length != 0"
  17. />
  18. </el-form-item>
  19. </el-col>
  20. <el-col :span="8">
  21. <el-form-item label="列数" prop="lineNum">
  22. <el-input
  23. v-model="form.lineNum"
  24. :disabled="form.positionList.length != 0"
  25. />
  26. </el-form-item>
  27. </el-col>
  28. <el-col :span="8">
  29. <el-form-item label="长" prop="vehicleLen">
  30. <el-input
  31. v-model="form.vehicleLen"
  32. :disabled="form.positionList.length != 0"
  33. >
  34. <template slot="append">cm</template>
  35. </el-input>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="8">
  39. <el-form-item label="宽" prop="wilde">
  40. <el-input
  41. v-model="form.wilde"
  42. :disabled="form.positionList.length != 0"
  43. >
  44. <template slot="append">cm</template>
  45. </el-input>
  46. </el-form-item>
  47. </el-col>
  48. <el-col :span="8">
  49. <el-form-item label="高" prop="hight">
  50. <el-input
  51. v-model="form.hight"
  52. :disabled="form.positionList.length != 0"
  53. >
  54. <template slot="append">cm</template>
  55. </el-input>
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="8">
  59. <el-form-item>
  60. <el-button
  61. size="small"
  62. v-if="form.positionList.length == 0"
  63. type="primary"
  64. @click="handleHjCode"
  65. >生成货位</el-button
  66. >
  67. <el-button size="small" v-else type="primary" @click="addHjCode"
  68. >添加货位</el-button
  69. >
  70. <el-button size="small" type="primary" @click="batchDelete"
  71. >批量删除</el-button
  72. >
  73. </el-form-item>
  74. </el-col>
  75. </el-row>
  76. </el-form>
  77. <el-form
  78. :model="form"
  79. ref="tableForm"
  80. class="tableForm"
  81. :rules="tableFormRules"
  82. >
  83. <el-table
  84. ref="multipleTable"
  85. :data="form.positionList"
  86. tooltip-effect="dark"
  87. style="width: 100%"
  88. stripe
  89. @selection-change="handleSelectionChange"
  90. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  91. >
  92. <el-table-column type="selection" width="55"> </el-table-column>
  93. <el-table-column label="货位编号" prop="code" min-width="120">
  94. <template slot-scope="{ row, $index }">
  95. <el-form-item
  96. :prop="'positionList.' + $index + '.code'"
  97. :rules="tableFormRules.code"
  98. >
  99. <el-input
  100. placeholder="请输入"
  101. clearable
  102. v-model="row.code"
  103. ></el-input>
  104. </el-form-item> </template
  105. ></el-table-column>
  106. <el-table-column label="货位长(cm)" min-width="120">
  107. <template slot-scope="scope">
  108. <el-form-item
  109. :prop="'positionList.' + scope.$index + 'length'"
  110. :rules="tableFormRules.length"
  111. >
  112. <el-input
  113. placeholder="请输入"
  114. type="number"
  115. v-model.number="scope.row.length"
  116. clearable
  117. ></el-input>
  118. </el-form-item>
  119. </template>
  120. </el-table-column>
  121. <el-table-column label="货位宽(cm)" min-width="120">
  122. <template slot-scope="scope">
  123. <el-form-item
  124. :prop="'positionList.' + scope.$index + '.breadth'"
  125. :rules="tableFormRules.breadth"
  126. >
  127. <el-input
  128. placeholder="请输入"
  129. type="number"
  130. v-model.number="scope.row.breadth"
  131. ></el-input>
  132. </el-form-item>
  133. </template>
  134. </el-table-column>
  135. <el-table-column label="货位高(cm)" min-width="120">
  136. <template slot-scope="scope">
  137. <el-form-item
  138. :prop="'positionList.' + scope.$index + '.altitude'"
  139. :rules="tableFormRules.altitude"
  140. >
  141. <el-input
  142. placeholder="请输入"
  143. type="number"
  144. v-model.number="scope.row.altitude"
  145. ></el-input>
  146. </el-form-item>
  147. </template>
  148. </el-table-column>
  149. <el-table-column label="限重(kg)" min-width="120">
  150. <template slot-scope="scope">
  151. <el-form-item
  152. :prop="'positionList.' + scope.$index + '.weightLimit'"
  153. :rules="tableFormRules.weightLimit"
  154. >
  155. <el-input
  156. placeholder="请输入"
  157. type="number"
  158. v-model.number="scope.row.weightLimit"
  159. ></el-input>
  160. </el-form-item>
  161. </template>
  162. </el-table-column>
  163. <el-table-column label="基本货位容积(cm³)" min-width="120">
  164. <template slot-scope="scope">
  165. <el-form-item
  166. :prop="'positionList.' + scope.$index + '.volume'"
  167. :rules="tableFormRules.volume"
  168. >
  169. <el-input
  170. placeholder="请输入"
  171. type="number"
  172. v-model.number="scope.row.volume"
  173. ></el-input>
  174. </el-form-item>
  175. </template>
  176. </el-table-column>
  177. <el-table-column label="操作" fixed="right">
  178. <template slot-scope="{ $index, row }">
  179. <el-button type="text" @click="removeGoods($index, row)"
  180. >删除货架</el-button
  181. >
  182. </template>
  183. </el-table-column>
  184. </el-table>
  185. </el-form>
  186. <div slot="footer" class="footer">
  187. <el-button type="primary" @click="save">保存</el-button>
  188. <el-button @click="cancel">取消</el-button>
  189. </div>
  190. <!-- 规则货架编号 -->
  191. <el-dialog
  192. title="规则货架编号"
  193. append-to-body
  194. :visible.sync="hjCodeFalg"
  195. width="35%"
  196. >
  197. <el-form :model="hjForm">
  198. <el-form-item label="规则类型" label-width="100px">
  199. <el-radio-group v-model="hjForm.type">
  200. <el-radio :label="1">字母</el-radio>
  201. <el-radio :label="2">字母+数字</el-radio>
  202. <el-radio :label="3">字母+数字(层级)</el-radio>
  203. </el-radio-group>
  204. </el-form-item>
  205. <el-form-item label="规则名称定义" label-width="100px">
  206. <el-input v-model="hjForm.code" @input="handleInput"></el-input>
  207. <span style="color: #dab8b8">注:只可输入大写A-Z</span>
  208. </el-form-item>
  209. </el-form>
  210. <span slot="footer" class="dialog-footer">
  211. <el-button @click="hjCodeFalg = false">取 消</el-button>
  212. <el-button @click="handleMine" type="primary">确 定</el-button>
  213. </span>
  214. </el-dialog>
  215. </ele-modal>
  216. </template>
  217. <script>
  218. import { categoryVehicle, categoryVehicleList } from '@/api/material/product';
  219. export default {
  220. data() {
  221. const defaultForm = {
  222. categoryId: null,
  223. levelNum: null,
  224. lineNum: null,
  225. hight: null,
  226. wilde: null,
  227. vehicleLen: null,
  228. positionList: [],
  229. removeIds: []
  230. };
  231. return {
  232. visible: false,
  233. form: {
  234. ...defaultForm
  235. },
  236. hjCodeFalg: false,
  237. hjForm: { code: '', type: 1 },
  238. rules: {
  239. levelNum: [
  240. { required: true, message: '请输入层数', trigger: 'blur' }
  241. ],
  242. lineNum: [{ required: true, message: '请输入列数', trigger: 'blur' }]
  243. },
  244. tableFormRules: {
  245. code: {
  246. required: true,
  247. message: '请输入货位编号',
  248. trigger: 'blur'
  249. }
  250. },
  251. };
  252. },
  253. created() {},
  254. computed: {},
  255. methods: {
  256. open(row) {
  257. this.visible = true;
  258. this.form.categoryId = row.id;
  259. this.getList();
  260. },
  261. cancel() {
  262. this.$refs.form.clearValidate();
  263. this.form = { ...this.defaultForm };
  264. this.form.positionList = [];
  265. this.visible = false;
  266. },
  267. getList() {
  268. categoryVehicleList(this.form.categoryId).then((res) => {
  269. if (res) {
  270. this.form = res;
  271. this.form['removeIds'] = [];
  272. }
  273. });
  274. },
  275. removeGoods(idx, row) {
  276. if (this.form.positionList.length == 1) {
  277. return this.$message.error('至少保留一个货架!');
  278. }
  279. this.$confirm(`是否删除这个货架?`).then(async () => {
  280. this.form.positionList.splice(idx, 1);
  281. this.form['removeIds'].push(row.id);
  282. });
  283. },
  284. batchDelete() {
  285. },
  286. handleHjCode() {
  287. this.$refs.form.validate((valid) => {
  288. if (valid) {
  289. this.hjCodeFalg = true;
  290. }
  291. });
  292. },
  293. addHjCode() {
  294. this.$prompt('请输入', '添加货位数', {
  295. confirmButtonText: '确定',
  296. cancelButtonText: '取消',
  297. inputPattern: /[1-9]\d*/,
  298. inputErrorMessage: '请输入正整数'
  299. })
  300. .then(({ value }) => {
  301. for (var i = 0; i < value; i++) {
  302. let obj1111 = {
  303. code: '',
  304. length: this.form.vehicleLen
  305. ? Number(
  306. this.form.vehicleLen / Number(this.form.lineNum)
  307. ).toFixed(0)
  308. : '',
  309. breadth: this.form.wilde,
  310. altitude: this.form.hight
  311. ? Number(
  312. this.form.hight / Number(this.form.levelNum)
  313. ).toFixed(0)
  314. : '',
  315. weightLimit: '',
  316. volume: ''
  317. };
  318. this.form.positionList.push(obj1111);
  319. }
  320. })
  321. .catch(() => {});
  322. },
  323. handleMine() {
  324. this.$refs.form.clearValidate();
  325. const ruleName = this.hjForm.code;
  326. let preCode = 0;
  327. let codeEng = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  328. let currentLetterIndex = 0;
  329. this.form.positionList = [];
  330. if (ruleName.length > 0) {
  331. // 计算初始索引
  332. let multiplier = Math.pow(codeEng.length, ruleName.length - 1);
  333. for (let i = 0; i < ruleName.length; i++) {
  334. currentLetterIndex +=
  335. (codeEng.indexOf(ruleName[i]) + 1) * multiplier;
  336. multiplier /= codeEng.length;
  337. }
  338. }
  339. if (this.hjForm.type == 3) {
  340. for (let i = 0; i < this.form.lineNum; i++) {
  341. // 获取当前字母
  342. let index = currentLetterIndex;
  343. let dividend = codeEng.length;
  344. let remainder;
  345. let quotient;
  346. let code = '';
  347. while (index > 0) {
  348. remainder = index % dividend;
  349. quotient = Math.floor(index / dividend);
  350. if (remainder === 0) {
  351. remainder = codeEng.length;
  352. quotient--;
  353. }
  354. code = codeEng[remainder - 1] + code;
  355. index = quotient;
  356. }
  357. for (let j = 0; j < this.form.levelNum; j++) {
  358. let obj1111 = {
  359. code: code + (j + 1),
  360. length: this.form.vehicleLen
  361. ? Number(
  362. this.form.vehicleLen / Number(this.form.lineNum)
  363. ).toFixed(0)
  364. : '',
  365. breadth: this.form.wilde,
  366. altitude: this.form.hight
  367. ? Number(
  368. this.form.hight / Number(this.form.levelNum)
  369. ).toFixed(0)
  370. : '',
  371. weightLimit: '',
  372. volume: ''
  373. };
  374. this.form.positionList.push(obj1111);
  375. }
  376. currentLetterIndex++; // 自增索引
  377. this.hjCodeFalg = false;
  378. }
  379. } else {
  380. let num = Number(this.form.levelNum) * Number(this.form.lineNum);
  381. for (let i = 0; i < num; i++) {
  382. // 获取当前字母
  383. let index = currentLetterIndex;
  384. let dividend = codeEng.length;
  385. let remainder;
  386. let quotient;
  387. let code = '';
  388. while (index > 0) {
  389. remainder = index % dividend;
  390. quotient = Math.floor(index / dividend);
  391. if (remainder === 0) {
  392. remainder = codeEng.length;
  393. quotient--;
  394. }
  395. code = codeEng[remainder - 1] + code;
  396. index = quotient;
  397. }
  398. let obj1111 = {
  399. code: this.hjForm.type === 1 ? code : ruleName + (i + 1),
  400. length: this.form.vehicleLen
  401. ? Number(
  402. this.form.vehicleLen / Number(this.form.lineNum)
  403. ).toFixed(0)
  404. : '',
  405. breadth: this.form.wilde,
  406. altitude: this.form.levelNum
  407. ? Number(this.form.hight / Number(this.form.levelNum)).toFixed(
  408. 0
  409. )
  410. : '',
  411. weightLimit: '',
  412. volume: ''
  413. };
  414. this.form.positionList.push(obj1111);
  415. currentLetterIndex++; // 自增索引
  416. this.hjCodeFalg = false;
  417. }
  418. }
  419. },
  420. handleInput(event) {
  421. // 只允许输入 A-Z 的大写字母
  422. let filteredValue = this.hjForm.code.replace(/[^A-Z]/g, '');
  423. this.hjForm.code = filteredValue;
  424. },
  425. handleSelectionChange(list) {
  426. console.log(list);
  427. },
  428. save() {
  429. console.log(this.form);
  430. this.$refs.tableForm.validate((valid) => {
  431. if (valid) {
  432. categoryVehicle(this.form).then((res) => {
  433. this.cancel();
  434. });
  435. }
  436. });
  437. }
  438. }
  439. };
  440. </script>
  441. <style lang="scss" scoped>
  442. .el-form-item {
  443. margin-bottom: 20px !important;
  444. }
  445. </style>