Commit d855c9e70df942198f508a65a3260bd7d7edc6a0

Authored by 谭毅彬
1 parent fccce1fb

出库单合并功能完成,入库单,出库单页面单据状态高亮显示

Signed-off-by: TanYibin <5491541@qq.com>
ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue
... ... @@ -346,8 +346,8 @@ export default {
346 346 this.$refs.modalForm4.title = "选择容器状态";
347 347 },
348 348 createBatchTask() {
349   - if (this.selectedRowKeys.length <= 1) {
350   - this.$message.warning('请选择两条记录!')
  349 + if (this.selectedRowKeys.length <= 0) {
  350 + this.$message.warning('至少选择一条记录!')
351 351 return
352 352 }
353 353 var receiptContainerHeaderList = []
... ... @@ -362,7 +362,7 @@ export default {
362 362 }
363 363 }
364 364 }
365   - if (receiptContainerHeaderList.length > 1) {
  365 + if (receiptContainerHeaderList.length > 0) {
366 366 if (receiptContainerHeader.taskType == 100) {
367 367 createReceiptBatchTask(receiptContainerHeaderList).then(res => {
368 368 this.loading = false
... ... @@ -378,7 +378,7 @@ export default {
378 378 this.$refs.modalForm2.title = '选择出库口'
379 379 }
380 380 } else {
381   - this.$message.error("请选择两条符合条件的记录!")
  381 + this.$message.error("没有符合生成条件的记录!")
382 382 }
383 383 },
384 384 cancelBatchTask() {
... ... @@ -387,7 +387,7 @@ export default {
387 387 return
388 388 }
389 389 if (this.selectedRowKeys.length <= 0) {
390   - this.$message.warning('选择一条记录!');
  390 + this.$message.warning('至少选择一条记录!');
391 391 return;
392 392 }
393 393 var ids = "";
... ...
ant-design-vue-jeecg/src/views/system/receipt/ReceiptDetailList.vue
... ... @@ -49,8 +49,14 @@
49 49 :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
50 50 @change="handleTableChange">
51 51  
  52 + <span slot="status_dictText" slot-scope="status_dictText">
  53 + <a-tag :key="status_dictText" :color="getStatusColor(status_dictText)">
  54 + {{ status_dictText }}
  55 + </a-tag>
  56 + </span>
  57 +
52 58 <span slot="inventoryStatus_dictText" slot-scope="inventoryStatus_dictText">
53   - <a-tag :key="inventoryStatus_dictText" :color="getStatusColor(inventoryStatus_dictText)">
  59 + <a-tag :key="inventoryStatus_dictText" :color="getInventoryStatusColor(inventoryStatus_dictText)">
54 60 {{ inventoryStatus_dictText }}
55 61 </a-tag>
56 62 </span>
... ... @@ -178,6 +184,7 @@ export default {
178 184 title: '单据状态',
179 185 align: "center",
180 186 dataIndex: 'status_dictText',
  187 + scopedSlots: {customRender: 'status_dictText'}
181 188 },
182 189 {
183 190 title: '创建人',
... ... @@ -231,6 +238,19 @@ export default {
231 238 methods: {
232 239 getStatusColor(status) {
233 240 const colors = {
  241 + '新建': 'green',
  242 + '收货': 'Skyblue',
  243 + '等待上架': 'blue',
  244 + '上架': 'darkorange',
  245 + '过账': 'purple',
  246 + '回传': 'grey',
  247 + '回传失败': 'red',
  248 + default: 'blue'
  249 + };
  250 + return colors[status] || colors.default;
  251 + },
  252 + getInventoryStatusColor(status) {
  253 + const colors = {
234 254 '良品': 'green',
235 255 '报废品': 'purple',
236 256 '待确认 ': 'grey',
... ...
ant-design-vue-jeecg/src/views/system/receipt/ReceiptHeaderList.vue
... ... @@ -187,10 +187,10 @@
187 187 <a-menu-item v-if="record.firstStatus > 0 && record.firstStatus <= 20 && flowOff=='1'">
188 188 <a @click="openProcess(record)" type="primary">审核进度</a>
189 189 </a-menu-item>
190   - <a-menu-item v-has="'receiptHeader:edit'">
  190 + <a-menu-item v-has="'receiptHeader:edit'" v-if="record.firstStatus == 0 && record.lastStatus == 0 && record.referCode == null">
191 191 <a @click="handleEdit(record)">编辑</a>
192 192 </a-menu-item>
193   - <a-menu-item v-has="'receiptHeader:delete'">
  193 + <a-menu-item v-has="'receiptHeader:delete'" v-if="record.firstStatus == 0 && record.lastStatus == 0 && record.referCode == null">
194 194 <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
195 195 <a>删除</a>
196 196 </a-popconfirm>
... ...
ant-design-vue-jeecg/src/views/system/shipment/ShipmentContainerHeaderList.vue
... ... @@ -297,8 +297,8 @@ export default {
297 297 this.$refs.modalForm2.title = "选择出库口";
298 298 },
299 299 createBatchTask() {
300   - if (this.selectedRowKeys.length <= 1) {
301   - this.$message.warning('请选择两条记录!')
  300 + if (this.selectedRowKeys.length <= 0) {
  301 + this.$message.warning('至少选择一条记录!')
302 302 return
303 303 }
304 304 var shipmentContainerHeaderList = []
... ... @@ -317,7 +317,7 @@ export default {
317 317 this.$refs.modalForm2.batchEdit(shipmentContainerHeaderList)
318 318 this.$refs.modalForm2.title = '选择出库口'
319 319 } else {
320   - this.$message.error("请选择两条符合条件的记录!")
  320 + this.$message.error("没有符合生成条件的记录!")
321 321 }
322 322 },
323 323 cancelBatchTask() {
... ... @@ -326,7 +326,7 @@ export default {
326 326 return
327 327 }
328 328 if (this.selectedRowKeys.length <= 0) {
329   - this.$message.warning('选择一条记录!')
  329 + this.$message.warning('至少选择一条记录!')
330 330 return
331 331 }
332 332 var ids = ''
... ...
ant-design-vue-jeecg/src/views/system/shipment/ShipmentDetailList.vue
... ... @@ -48,8 +48,14 @@
48 48 :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
49 49 @change="handleTableChange">
50 50  
  51 + <span slot="status_dictText" slot-scope="status_dictText">
  52 + <a-tag :key="status_dictText" :color="getStatusColor(status_dictText)">
  53 + {{ status_dictText }}
  54 + </a-tag>
  55 + </span>
  56 +
51 57 <span slot="inventoryStatus_dictText" slot-scope="inventoryStatus_dictText">
52   - <a-tag :key="inventoryStatus_dictText" :color="getStatusColor(inventoryStatus_dictText)">
  58 + <a-tag :key="inventoryStatus_dictText" :color="getInventoryStatusColor(inventoryStatus_dictText)">
53 59 {{ inventoryStatus_dictText }}
54 60 </a-tag>
55 61 </span>
... ... @@ -218,6 +224,7 @@ export default {
218 224 title: '单据状态',
219 225 align: "center",
220 226 dataIndex: 'status_dictText',
  227 + scopedSlots: {customRender: 'status_dictText'}
221 228 },
222 229 {
223 230 title: '创建人',
... ... @@ -272,6 +279,19 @@ export default {
272 279 methods: {
273 280 getStatusColor(status) {
274 281 const colors = {
  282 + '新建': 'green',
  283 + '出库组盘': 'Skyblue',
  284 + '等待下架': 'blue',
  285 + '下架': 'darkorange',
  286 + '过账': 'purple',
  287 + '回传': 'grey',
  288 + '回传失败': 'red',
  289 + default: 'blue'
  290 + };
  291 + return colors[status] || colors.default;
  292 + },
  293 + getInventoryStatusColor(status) {
  294 + const colors = {
275 295 '良品': 'green',
276 296 '报废品': 'purple',
277 297 '待确认 ': 'grey',
... ...
ant-design-vue-jeecg/src/views/system/shipment/ShipmentHeaderList.vue
... ... @@ -202,10 +202,10 @@
202 202 <a-menu-item v-if="record.firstStatus > 0 && record.firstStatus <= 20 && flowOff=='1'">
203 203 <a @click="openProcess(record)" type="primary">审核进度</a>
204 204 </a-menu-item>
205   - <a-menu-item v-has="'shipmentHeader:edit'">
  205 + <a-menu-item v-has="'shipmentHeader:edit'" v-if="record.firstStatus == 0 && record.lastStatus == 0 && record.referCode == null">
206 206 <a @click="handleEdit(record)">编辑</a>
207 207 </a-menu-item>
208   - <a-menu-item v-has="'shipmentHeader:delete'">
  208 + <a-menu-item v-has="'shipmentHeader:delete'" v-if="record.firstStatus == 0 && record.lastStatus == 0 && record.referCode == null">
209 209 <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
210 210 <a>删除</a>
211 211 </a-popconfirm>
... ... @@ -402,7 +402,7 @@ export default {
402 402 methods: {
403 403 mergeShipment() {
404 404 if (this.selectedRowKeys.length <= 1) {
405   - this.$message.warning('选择两条记录!')
  405 + this.$message.warning('至少选择两条记录!')
406 406 return
407 407 }
408 408 var shipmentHeaderList = []
... ... @@ -422,7 +422,7 @@ export default {
422 422 }
423 423 })
424 424 } else {
425   - this.$message.error("选择两条符合条件的记录!")
  425 + this.$message.error("至少选择两条符合条件的记录!")
426 426 }
427 427 },
428 428 getDocumentAduitFlowStaus(){
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/entity/ShipmentDetail.java
... ... @@ -40,6 +40,10 @@ public class ShipmentDetail implements Serializable {
40 40 @Excel(name = "出库单编码", width = 15)
41 41 @ApiModelProperty(value = "出库单编码")
42 42 private String shipmentCode;
  43 + /** 合并出库单编码 */
  44 + @Excel(name = "合并出库单编码", width = 15)
  45 + @ApiModelProperty(value = "合并出库单编码")
  46 + private String mergeShipmentCode;
43 47 /** 仓库编码 */
44 48 @Excel(name = "仓库编码", width = 15)
45 49 @ApiModelProperty(value = "仓库编码")
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/entity/ShipmentHeader.java
... ... @@ -34,6 +34,10 @@ public class ShipmentHeader implements Serializable {
34 34 @Excel(name = "出库单编码", width = 15)
35 35 @ApiModelProperty(value = "出库单编码")
36 36 private String code;
  37 + /** 合并出库单编码 */
  38 + @Excel(name = "合并出库单编码", width = 15)
  39 + @ApiModelProperty(value = "合并出库单编码")
  40 + private String mergeShipmentCode;
37 41 /** 仓库编码 */
38 42 @Excel(name = "仓库编码", width = 15)
39 43 @ApiModelProperty(value = "仓库编码")
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java
... ... @@ -32,8 +32,10 @@ import org.jeecg.utils.constant.QuantityConstant;
32 32 import org.springframework.beans.factory.annotation.Autowired;
33 33 import org.springframework.stereotype.Service;
34 34 import org.springframework.transaction.annotation.Transactional;
  35 +import org.springframework.util.CollectionUtils;
35 36  
36 37 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  38 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
37 39 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
38 40 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
39 41  
... ... @@ -126,12 +128,12 @@ public class ShipmentHeaderServiceImpl extends ServiceImpl&lt;ShipmentHeaderMapper,
126 128 if (StringUtils.isNotEmpty(referCode)) {
127 129 ShipmentHeader referShipmentHeader = getShipmentHeaderByReferCode(referCode, warehouseCode);
128 130 if (referShipmentHeader != null) {
129   - return Result.error("上游单号" + referCode + ",已经存在");
  131 + return Result.error("上游单号:" + referCode + ",已经存在");
130 132 }
131 133 }
132 134 String code = createCode(shipmentHeader.getType());
133 135 if (StringUtils.isEmpty(code)) {
134   - throw new JeecgBootException("根据出库单类型" + shipmentHeader.getType() + "生成单号失败");
  136 + throw new JeecgBootException("根据出库单类型:" + shipmentHeader.getType() + ",生成单号失败");
135 137 }
136 138 shipmentHeader.setCode(code);
137 139 shipmentHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
... ... @@ -150,8 +152,8 @@ public class ShipmentHeaderServiceImpl extends ServiceImpl&lt;ShipmentHeaderMapper,
150 152 Date now = new Date();
151 153 SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
152 154 LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
153   - shipmentHeaderLambdaQueryWrapper.eq(ShipmentHeader::getType, shipmentType).select(ShipmentHeader::getCode).orderByDesc(ShipmentHeader::getId)
154   - .last("Limit 1");
  155 + shipmentHeaderLambdaQueryWrapper.eq(ShipmentHeader::getType, shipmentType).likeRight(ShipmentHeader::getCode, shipmentType).select(ShipmentHeader::getCode)
  156 + .orderByDesc(ShipmentHeader::getId).last("Limit 1");
155 157 String maxCode = null;
156 158 ShipmentHeader shipmentHeader = this.getOne(shipmentHeaderLambdaQueryWrapper);
157 159 if (shipmentHeader != null) {
... ... @@ -258,23 +260,77 @@ public class ShipmentHeaderServiceImpl extends ServiceImpl&lt;ShipmentHeaderMapper,
258 260 }
259 261  
260 262 @Override
  263 + @Transactional
261 264 public Result<Object> mergeShipment(List<ShipmentHeader> shipmentHeaderList) {
  265 + if (CollectionUtils.isEmpty(shipmentHeaderList)) {
  266 + return Result.error("至少选择两条记录!");
  267 + }
  268 + // 查询出库单头信息
262 269 LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
263 270 shipmentHeaderLambdaQueryWrapper.in(ShipmentHeader::getCode, shipmentHeaderList.stream().map(ShipmentHeader::getCode).collect(Collectors.toList()));
264   - List<ShipmentHeader> mergeShipmentList = shipmentHeaderService.list(shipmentHeaderLambdaQueryWrapper);
265   - if (shipmentHeaderList.size() != mergeShipmentList.size()) {
266   - return Result.error("未知错误");
  271 + List<ShipmentHeader> mergeShipmentHeaderList = shipmentHeaderService.list(shipmentHeaderLambdaQueryWrapper);
  272 + if (shipmentHeaderList.size() != mergeShipmentHeaderList.size()) {
  273 + return Result.error("未知错误!");
  274 + }
  275 + if (mergeShipmentHeaderList.size() < 2) {
  276 + return Result.error("至少选择两条有效记录!");
267 277 }
268   - if (mergeShipmentList.stream().map(ShipmentHeader::getCompanyCode).distinct().count() > 1) {
269   - return Result.error("货主信息不一致");
  278 + if (mergeShipmentHeaderList.stream().map(ShipmentHeader::getWarehouseCode).distinct().count() > 1) {
  279 + return Result.error("仓库信息不一致!");
270 280 }
271   - if (mergeShipmentList.stream().map(ShipmentHeader::getType).distinct().count() > 1) {
272   - return Result.error("出库单类型信息不一致");
  281 + if (mergeShipmentHeaderList.stream().map(ShipmentHeader::getCompanyCode).distinct().count() > 1) {
  282 + return Result.error("货主信息不一致!");
273 283 }
274   - if (mergeShipmentList.stream().map(ShipmentHeader::getCustomerCode).distinct().count() > 1) {
275   - return Result.error("客户信息不一致");
  284 + if (mergeShipmentHeaderList.stream().map(ShipmentHeader::getType).distinct().count() > 1) {
  285 + return Result.error("出库单类型信息不一致!");
276 286 }
  287 + if (mergeShipmentHeaderList.stream().map(ShipmentHeader::getCustomerCode).distinct().count() > 1) {
  288 + return Result.error("客户信息不一致!");
  289 + }
  290 + // 查询出库单详情
  291 + LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
  292 + shipmentDetailLambdaQueryWrapper.in(ShipmentDetail::getShipmentCode, shipmentHeaderList.stream().map(ShipmentHeader::getCode).collect(Collectors.toList()));
  293 + List<ShipmentDetail> mergeshipmentDetailList = shipmentDetailService.list(shipmentDetailLambdaQueryWrapper);
277 294  
  295 + ShipmentHeader mergeShipmentHeader = new ShipmentHeader();
  296 + mergeShipmentHeader.setCode(this.createCode(mergeShipmentHeaderList.get(0).getType()));
  297 + mergeShipmentHeader.setWarehouseCode(mergeShipmentHeaderList.get(0).getWarehouseCode());
  298 + mergeShipmentHeader.setType(mergeShipmentHeaderList.get(0).getType());
  299 + mergeShipmentHeader.setCompanyCode(mergeShipmentHeaderList.get(0).getCompanyCode());
  300 + mergeShipmentHeader.setCustomerCode(mergeShipmentHeaderList.get(0).getCustomerCode());
  301 + mergeShipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_HEADER_BUILD);
  302 + mergeShipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_HEADER_BUILD);
  303 + mergeShipmentHeader.setTotalQty(mergeshipmentDetailList.stream().map(ShipmentDetail::getQty).reduce(BigDecimal.ZERO, BigDecimal::add));
  304 + mergeShipmentHeader.setTotalLines(mergeshipmentDetailList.size());
  305 + mergeShipmentHeader.setRemark("合并单据");
  306 + if (!save(mergeShipmentHeader)) {
  307 + throw new JeecgBootException("新增合并出库单主表失败");
  308 + }
  309 + mergeshipmentDetailList.stream().forEach(t -> {
  310 + t.setId(null);
  311 + t.setShipmentId(mergeShipmentHeader.getId());
  312 + t.setShipmentCode(mergeShipmentHeader.getCode());
  313 + });
  314 + if (!shipmentDetailService.saveBatch(mergeshipmentDetailList)) {
  315 + throw new JeecgBootException("新增合并出库单详情失败");
  316 + }
  317 + // 更新原单据头信息为已合并,关联合并出库单号
  318 + LambdaUpdateWrapper<ShipmentHeader> shipmentHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
  319 + shipmentHeaderLambdaUpdateWrapper.in(ShipmentHeader::getCode, shipmentHeaderList.stream().map(ShipmentHeader::getCode).collect(Collectors.toList()));
  320 + shipmentHeaderLambdaUpdateWrapper.set(ShipmentHeader::getFirstStatus, QuantityConstant.SHIPMENT_HEADER_MERGED)
  321 + .set(ShipmentHeader::getLastStatus, QuantityConstant.SHIPMENT_HEADER_MERGED).set(ShipmentHeader::getMergeShipmentCode, mergeShipmentHeader.getCode());
  322 + if (!shipmentHeaderService.update(shipmentHeaderLambdaUpdateWrapper)) {
  323 + throw new JeecgBootException("更新出库单主表失败");
  324 + }
  325 +
  326 + // 更新原单据详情信息为已合并,关联合并出库单号
  327 + LambdaUpdateWrapper<ShipmentDetail> shipmentDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
  328 + shipmentDetailLambdaUpdateWrapper.in(ShipmentDetail::getShipmentCode, shipmentHeaderList.stream().map(ShipmentHeader::getCode).collect(Collectors.toList()));
  329 + shipmentDetailLambdaUpdateWrapper.set(ShipmentDetail::getStatus, QuantityConstant.SHIPMENT_HEADER_MERGED).set(ShipmentDetail::getMergeShipmentCode,
  330 + mergeShipmentHeader.getCode());
  331 + if (!shipmentDetailService.update(shipmentDetailLambdaUpdateWrapper)) {
  332 + throw new JeecgBootException("更新出库单主表失败");
  333 + }
278 334 return Result.OK("合并成功");
279 335 }
280 336 }
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
... ... @@ -108,6 +108,9 @@ public class QuantityConstant {
108 108  
109 109 // 过账
110 110 public static final Integer SHIPMENT_HEADER_COMPLETED = 800;
  111 +
  112 + // 已合并
  113 + public static final Integer SHIPMENT_HEADER_MERGED = 810;
111 114  
112 115 // 回传失败
113 116 public static final Integer SHIPMENT_HEADER_RETURN_ERROR = 850;
... ...