Commit 03532262a2c336b819c487d1d6d67928324a3978

Authored by yeqianyong
1 parent 0ed6cf11

楚江erp:1、发货计划提交、核对增加数据完整性校验;2、客户开发增加订单吨位、发货吨位数据

Showing 17 changed files with 200 additions and 21 deletions
@@ -937,7 +937,7 @@ alter table sys_data_dic_item modify column name varchar(50) comment '名称'; @@ -937,7 +937,7 @@ alter table sys_data_dic_item modify column name varchar(50) comment '名称';
937 937
938 create table if not exists customer_visit_record( 938 create table if not exists customer_visit_record(
939 id varchar(32) primary key comment 'ID', 939 id varchar(32) primary key comment 'ID',
940 - customer_id varchar(32) not null comment '客户ID', 940 + customer_id varchar(32) not null comment '客户开发ID',
941 user_id varchar(32) not null comment '拜访人员ID', 941 user_id varchar(32) not null comment '拜访人员ID',
942 visit_time date not null comment '拜访时间', 942 visit_time date not null comment '拜访时间',
943 visit_content varchar(500) comment '拜访内容', 943 visit_content varchar(500) comment '拜访内容',
@@ -16,11 +16,11 @@ public class CreateCustomerVisitRecordVo implements BaseVo, Serializable { @@ -16,11 +16,11 @@ public class CreateCustomerVisitRecordVo implements BaseVo, Serializable {
16 private static final long serialVersionUID = 1L; 16 private static final long serialVersionUID = 1L;
17 17
18 /** 18 /**
19 - * 客户ID 19 + * 客户开发ID
20 */ 20 */
21 - @ApiModelProperty(value = "客户ID", required = true)  
22 - @NotBlank(message = "请输入客户ID!")  
23 - @Length(message = "客户ID最多允许32个字符!") 21 + @ApiModelProperty(value = "客户开发ID", required = true)
  22 + @NotBlank(message = "请输入客户开发ID!")
  23 + @Length(message = "客户开发ID最多允许32个字符!")
24 private String customerId; 24 private String customerId;
25 25
26 /** 26 /**
@@ -156,6 +156,18 @@ public class GetCustomerDevelopPlanBo extends BaseBo<CustomerDevelopPlan> implem @@ -156,6 +156,18 @@ public class GetCustomerDevelopPlanBo extends BaseBo<CustomerDevelopPlan> implem
156 private List<CustomerVisitRecord> visitRecords; 156 private List<CustomerVisitRecord> visitRecords;
157 157
158 /** 158 /**
  159 + * 订单吨位
  160 + */
  161 + @ApiModelProperty("订单吨位")
  162 + private Double orderQuantity;
  163 +
  164 + /**
  165 + * 发货吨位
  166 + */
  167 + @ApiModelProperty("发货吨位")
  168 + private Double shipmentQuantity;
  169 +
  170 + /**
159 * 创建人 171 * 创建人
160 */ 172 */
161 @ApiModelProperty("创建人") 173 @ApiModelProperty("创建人")
@@ -17,8 +17,11 @@ import com.lframework.xingyun.basedata.service.product.ProductVarietyService; @@ -17,8 +17,11 @@ import com.lframework.xingyun.basedata.service.product.ProductVarietyService;
17 import com.lframework.xingyun.basedata.service.workshop.WorkshopService; 17 import com.lframework.xingyun.basedata.service.workshop.WorkshopService;
18 import com.lframework.xingyun.sc.bo.customer.develop.CustomerDevelopPlanStatisticsBo; 18 import com.lframework.xingyun.sc.bo.customer.develop.CustomerDevelopPlanStatisticsBo;
19 import com.lframework.xingyun.sc.bo.customer.develop.GetCustomerDevelopPlanBo; 19 import com.lframework.xingyun.sc.bo.customer.develop.GetCustomerDevelopPlanBo;
  20 +import com.lframework.xingyun.sc.entity.PurchaseOrderInfo;
20 import com.lframework.xingyun.sc.enums.ExportType; 21 import com.lframework.xingyun.sc.enums.ExportType;
21 import com.lframework.xingyun.sc.excel.customer.CustomerDevelopExportTaskWorker; 22 import com.lframework.xingyun.sc.excel.customer.CustomerDevelopExportTaskWorker;
  23 +import com.lframework.xingyun.sc.service.order.PurchaseOrderInfoService;
  24 +import com.lframework.xingyun.sc.service.shipments.ShipmentsOrderInfoService;
22 import com.lframework.xingyun.sc.vo.customer.develop.QueryCustomerDevelopPlanVo; 25 import com.lframework.xingyun.sc.vo.customer.develop.QueryCustomerDevelopPlanVo;
23 import com.lframework.xingyun.sc.service.customer.CustomerDevelopPlanService; 26 import com.lframework.xingyun.sc.service.customer.CustomerDevelopPlanService;
24 import com.lframework.xingyun.sc.vo.customer.develop.CreateCustomerDevelopPlanVo; 27 import com.lframework.xingyun.sc.vo.customer.develop.CreateCustomerDevelopPlanVo;
@@ -44,10 +47,8 @@ import org.springframework.validation.annotation.Validated; @@ -44,10 +47,8 @@ import org.springframework.validation.annotation.Validated;
44 import org.springframework.web.bind.annotation.*; 47 import org.springframework.web.bind.annotation.*;
45 48
46 import javax.validation.Valid; 49 import javax.validation.Valid;
47 -import java.util.ArrayList;  
48 -import java.util.HashMap;  
49 -import java.util.List;  
50 -import java.util.Map; 50 +import java.math.BigDecimal;
  51 +import java.util.*;
51 import java.util.function.Function; 52 import java.util.function.Function;
52 import java.util.stream.Collectors; 53 import java.util.stream.Collectors;
53 54
@@ -77,6 +78,10 @@ public class CustomerDevelopPlanController extends DefaultBaseController { @@ -77,6 +78,10 @@ public class CustomerDevelopPlanController extends DefaultBaseController {
77 private ProductVarietyService productVarietyService; 78 private ProductVarietyService productVarietyService;
78 @Resource 79 @Resource
79 private SysUserService sysUserService; 80 private SysUserService sysUserService;
  81 + @Resource
  82 + private PurchaseOrderInfoService purchaseOrderInfoService;
  83 + @Resource
  84 + private ShipmentsOrderInfoService shipmentsOrderInfoService;
80 85
81 86
82 /** 87 /**
@@ -271,11 +276,25 @@ public class CustomerDevelopPlanController extends DefaultBaseController { @@ -271,11 +276,25 @@ public class CustomerDevelopPlanController extends DefaultBaseController {
271 if (CollectionUtils.isNotEmpty(userList)) { 276 if (CollectionUtils.isNotEmpty(userList)) {
272 userMap = userList.stream().collect(Collectors.toMap(SysUser::getId, Function.identity())); 277 userMap = userList.stream().collect(Collectors.toMap(SysUser::getId, Function.identity()));
273 } 278 }
  279 + // 获取订货单数据
  280 + List<PurchaseOrderInfo> orderInfoList = purchaseOrderInfoService.listByCustomerIds(customerIds);
  281 + Map<String, List<PurchaseOrderInfo>> orderInfoMap = new HashMap<>();
  282 + if (CollectionUtils.isNotEmpty(orderInfoList)) {
  283 + for (PurchaseOrderInfo orderInfo : orderInfoList) {
  284 + String orderingUnit = orderInfo.getOrderingUnit();
  285 + List<PurchaseOrderInfo> list = orderInfoMap.computeIfAbsent(orderingUnit, k -> new ArrayList<>());
  286 + list.add(orderInfo);
  287 + }
  288 + }
  289 + // 获取发货单实际发货量
  290 + Map<String, Double> actualNumMap = shipmentsOrderInfoService.statisticsActualNum(customerIds);
  291 +
274 List<GetCustomerDevelopPlanBo> result = new ArrayList<>(); 292 List<GetCustomerDevelopPlanBo> result = new ArrayList<>();
275 for (CustomerDevelopPlan plan : dataList) { 293 for (CustomerDevelopPlan plan : dataList) {
276 GetCustomerDevelopPlanBo data = new GetCustomerDevelopPlanBo(plan); 294 GetCustomerDevelopPlanBo data = new GetCustomerDevelopPlanBo(plan);
277 // 客户信息 295 // 客户信息
278 - Customer customer = customerMap.get(plan.getCustomerId()); 296 + String customerId = plan.getCustomerId();
  297 + Customer customer = customerMap.get(customerId);
279 data.setCustomer(customer); 298 data.setCustomer(customer);
280 // 厂房信息 299 // 厂房信息
281 Workshop workshop = workshopMap.get(plan.getWorkshopId()); 300 Workshop workshop = workshopMap.get(plan.getWorkshopId());
@@ -292,6 +311,12 @@ public class CustomerDevelopPlanController extends DefaultBaseController { @@ -292,6 +311,12 @@ public class CustomerDevelopPlanController extends DefaultBaseController {
292 // 责任人 311 // 责任人
293 SysUser user = userMap.get(plan.getChargeUserId()); 312 SysUser user = userMap.get(plan.getChargeUserId());
294 data.setChargeUserName(user == null ? null : user.getName()); 313 data.setChargeUserName(user == null ? null : user.getName());
  314 + // 订货吨位
  315 + Double orderQuantity = calculateTotal(orderInfoMap.get(customerId));
  316 + data.setOrderQuantity(orderQuantity);
  317 + // 实发数
  318 + Double shipmentQuantity = actualNumMap.get(customerId);
  319 + data.setShipmentQuantity(shipmentQuantity);
295 320
296 result.add(data); 321 result.add(data);
297 } 322 }
@@ -329,7 +354,35 @@ public class CustomerDevelopPlanController extends DefaultBaseController { @@ -329,7 +354,35 @@ public class CustomerDevelopPlanController extends DefaultBaseController {
329 // 获取责任人数据 354 // 获取责任人数据
330 SysUser user = sysUserService.findById(chargeUserId); 355 SysUser user = sysUserService.findById(chargeUserId);
331 data.setChargeUserName(user.getName()); 356 data.setChargeUserName(user.getName());
  357 + // 订货吨位
  358 + List<PurchaseOrderInfo> orderInfoList = purchaseOrderInfoService.listByCustomerIds(Collections.singletonList(customerId));
  359 + Double orderQuantity = calculateTotal(orderInfoList);
  360 + data.setOrderQuantity(orderQuantity);
  361 + // 发货吨位
  362 + Map<String, Double> actualNum = shipmentsOrderInfoService.statisticsActualNum(Collections.singletonList(customerId));
  363 + data.setShipmentQuantity(actualNum.get(customerId));
332 364
333 return data; 365 return data;
334 } 366 }
  367 +
  368 +
  369 + /**
  370 + * 计算订货吨位
  371 + *
  372 + * @param orderInfoList 订货单集合
  373 + * @return Double
  374 + */
  375 + private Double calculateTotal(List<PurchaseOrderInfo> orderInfoList) {
  376 + if (CollectionUtils.isEmpty(orderInfoList)) {
  377 + return 0d;
  378 + }
  379 + BigDecimal total = BigDecimal.ZERO;
  380 + for (PurchaseOrderInfo orderInfo : orderInfoList) {
  381 + BigDecimal totalQuantity = orderInfo.getTotalQuantity();
  382 + if (totalQuantity != null) {
  383 + total = total.add(totalQuantity);
  384 + }
  385 + }
  386 + return total.doubleValue();
  387 + }
335 } 388 }
@@ -85,6 +85,8 @@ public class ShipmentsPlanController extends DefaultBaseController { @@ -85,6 +85,8 @@ public class ShipmentsPlanController extends DefaultBaseController {
85 @HasPermission({"shipping-plan-manage:shipping-plan:modify", "shipping-plan-manage:shipping-plan:check"}) 85 @HasPermission({"shipping-plan-manage:shipping-plan:modify", "shipping-plan-manage:shipping-plan:check"})
86 @PutMapping 86 @PutMapping
87 public InvokeResult<Void> update(@Valid UpdateShipmentsPlanVo vo) { 87 public InvokeResult<Void> update(@Valid UpdateShipmentsPlanVo vo) {
  88 + // 校验数据完整性
  89 + shipmentsPlanDetailService.checkDataIntegrity(vo.getId(), vo.getStatus());
88 shipmentsPlanService.update(vo); 90 shipmentsPlanService.update(vo);
89 return InvokeResultBuilder.success(); 91 return InvokeResultBuilder.success();
90 } 92 }
@@ -146,7 +146,9 @@ public class CustomerDevelopPlanServiceImpl extends BaseMpServiceImpl<CustomerDe @@ -146,7 +146,9 @@ public class CustomerDevelopPlanServiceImpl extends BaseMpServiceImpl<CustomerDe
146 @Override 146 @Override
147 public CustomerDevelopPlan findById(String id) { 147 public CustomerDevelopPlan findById(String id) {
148 CustomerDevelopPlan plan = getBaseMapper().selectById(id); 148 CustomerDevelopPlan plan = getBaseMapper().selectById(id);
149 - 149 + if (plan == null) {
  150 + throw new DefaultClientException("客户开发计划不存在!");
  151 + }
150 QueryCustomerVisitRecordVo recordVo = new QueryCustomerVisitRecordVo(); 152 QueryCustomerVisitRecordVo recordVo = new QueryCustomerVisitRecordVo();
151 recordVo.setCustomerId(id); 153 recordVo.setCustomerId(id);
152 List<CustomerVisitRecord> visitRecordList = customerVisitRecordService.query(recordVo); 154 List<CustomerVisitRecord> visitRecordList = customerVisitRecordService.query(recordVo);
1 package com.lframework.xingyun.sc.impl.order; 1 package com.lframework.xingyun.sc.impl.order;
2 2
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
3 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 4 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
5 import com.github.pagehelper.PageInfo; 6 import com.github.pagehelper.PageInfo;
@@ -555,6 +556,17 @@ public class PurchaseOrderInfoServiceImpl extends BaseMpServiceImpl<PurchaseOrde @@ -555,6 +556,17 @@ public class PurchaseOrderInfoServiceImpl extends BaseMpServiceImpl<PurchaseOrde
555 } 556 }
556 557
557 @Override 558 @Override
  559 + public List<PurchaseOrderInfo> listByCustomerIds(List<String> customerIds) {
  560 + if (CollectionUtils.isEmpty(customerIds)) {
  561 + return Collections.emptyList();
  562 + }
  563 + LambdaQueryWrapper<PurchaseOrderInfo> queryWrapper = Wrappers.lambdaQuery(PurchaseOrderInfo.class);
  564 + queryWrapper.in(PurchaseOrderInfo::getOrderingUnit, customerIds);
  565 +
  566 + return getBaseMapper().selectList(queryWrapper);
  567 + }
  568 +
  569 + @Override
558 public void cleanCacheByKey(Serializable key) { 570 public void cleanCacheByKey(Serializable key) {
559 571
560 } 572 }
@@ -256,7 +256,7 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr @@ -256,7 +256,7 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
256 String type = vo.getType(); 256 String type = vo.getType();
257 if ("AUTO".equals(type)) { 257 if ("AUTO".equals(type)) {
258 // 根据客户批量生成 258 // 根据客户批量生成
259 - List<ShipmentsPlanDetail> detailList = shipmentsPlanDetailService.listByPlanId(planId); 259 + List<ShipmentsPlanDetail> detailList = shipmentsPlanDetailService.listByPlanId(planId, false);
260 if (CollectionUtils.isEmpty(detailList)) { 260 if (CollectionUtils.isEmpty(detailList)) {
261 throw new DefaultClientException("发货明细数据不存在!"); 261 throw new DefaultClientException("发货明细数据不存在!");
262 } 262 }
@@ -420,6 +420,25 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr @@ -420,6 +420,25 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
420 return getBaseMapper().queryByIds(ids); 420 return getBaseMapper().queryByIds(ids);
421 } 421 }
422 422
  423 + @Override
  424 + public Map<String, Double> statisticsActualNum(List<String> customerIds) {
  425 + if (CollectionUtils.isEmpty(customerIds)) {
  426 + return Collections.emptyMap();
  427 + }
  428 + List<Map<String, Object>> mapList = getBaseMapper().statisticsActualNum(customerIds);
  429 + if (CollectionUtils.isEmpty(mapList)) {
  430 + return Collections.emptyMap();
  431 + }
  432 + Map<String, Double> result = new HashMap<>();
  433 + for (Map<String, Object> map : mapList) {
  434 + String key = (String) map.get("customer_id");
  435 + Double value = (Double) map.get("actual_num");
  436 +
  437 + result.put(key, value);
  438 + }
  439 + return result;
  440 + }
  441 +
423 442
424 /** 443 /**
425 * 处理批次数据 444 * 处理批次数据
@@ -32,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional; @@ -32,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
32 import javax.annotation.Resource; 32 import javax.annotation.Resource;
33 import java.math.BigDecimal; 33 import java.math.BigDecimal;
34 import java.time.LocalDate; 34 import java.time.LocalDate;
  35 +import java.time.LocalTime;
35 import java.util.*; 36 import java.util.*;
36 import java.util.function.Function; 37 import java.util.function.Function;
37 import java.util.stream.Collectors; 38 import java.util.stream.Collectors;
@@ -365,11 +366,11 @@ public class ShipmentsPlanDetailServiceImpl extends BaseMpServiceImpl<ShipmentsP @@ -365,11 +366,11 @@ public class ShipmentsPlanDetailServiceImpl extends BaseMpServiceImpl<ShipmentsP
365 } 366 }
366 367
367 @Override 368 @Override
368 - public List<ShipmentsPlanDetail> listByPlanId(String planId) { 369 + public List<ShipmentsPlanDetail> listByPlanId(String planId, boolean includePreShipment) {
369 if (StringUtils.isBlank(planId)) { 370 if (StringUtils.isBlank(planId)) {
370 return Collections.emptyList(); 371 return Collections.emptyList();
371 } 372 }
372 - return getBaseMapper().listByPlanId(planId); 373 + return getBaseMapper().listByPlanId(planId, includePreShipment);
373 } 374 }
374 375
375 @Override 376 @Override
@@ -407,6 +408,35 @@ public class ShipmentsPlanDetailServiceImpl extends BaseMpServiceImpl<ShipmentsP @@ -407,6 +408,35 @@ public class ShipmentsPlanDetailServiceImpl extends BaseMpServiceImpl<ShipmentsP
407 return getBaseMapper().selectList(queryWrapper); 408 return getBaseMapper().selectList(queryWrapper);
408 } 409 }
409 410
  411 + @Override
  412 + public void checkDataIntegrity(String planId, String status) {
  413 + // 获取明细数据
  414 + List<ShipmentsPlanDetail> detailList = listByPlanId(planId, true);
  415 + if (CollectionUtils.isEmpty(detailList)) {
  416 + return;
  417 + }
  418 + // 校验数据完整性
  419 + for (ShipmentsPlanDetail detail : detailList) {
  420 + LocalTime shipmentsTime = detail.getShipmentsTime();
  421 + Boolean canShipments = detail.getCanShipments();
  422 + Boolean preShipments = detail.getPreShipments();
  423 + if ("CHECKING".equals(status)) {
  424 + // 提交计划
  425 + if (!preShipments && shipmentsTime == null) {
  426 + throw new DefaultClientException("发货时点不能为空!");
  427 + }
  428 + if (preShipments && canShipments == null) {
  429 + throw new DefaultClientException("是否可发货不能为空!");
  430 + }
  431 + } else if ("IN_PROGRESS".equals(status)) {
  432 + // 核对计划
  433 + if (!preShipments && canShipments == null) {
  434 + throw new DefaultClientException("是否可发货不能为空!");
  435 + }
  436 + }
  437 + }
  438 + }
  439 +
410 440
411 /** 441 /**
412 * 封装发货计划明细数据 442 * 封装发货计划明细数据
@@ -114,9 +114,6 @@ public class ShipmentsPlanServiceImpl extends BaseMpServiceImpl<ShipmentsPlanMap @@ -114,9 +114,6 @@ public class ShipmentsPlanServiceImpl extends BaseMpServiceImpl<ShipmentsPlanMap
114 .eq(ShipmentsPlan::getId, vo.getId()); 114 .eq(ShipmentsPlan::getId, vo.getId());
115 115
116 getBaseMapper().update(updateWrapper); 116 getBaseMapper().update(updateWrapper);
117 - if ("CHECK".equals(vo.getStatus())) {  
118 - // 更新订货单规格发货状态  
119 - }  
120 117
121 OpLogUtil.setVariable("id", data.getId()); 118 OpLogUtil.setVariable("id", data.getId());
122 OpLogUtil.setExtra(vo); 119 OpLogUtil.setExtra(vo);
@@ -6,6 +6,7 @@ import com.lframework.xingyun.sc.vo.shipments.order.QueryShipmentsOrderInfoVo; @@ -6,6 +6,7 @@ import com.lframework.xingyun.sc.vo.shipments.order.QueryShipmentsOrderInfoVo;
6 import org.apache.ibatis.annotations.Param; 6 import org.apache.ibatis.annotations.Param;
7 7
8 import java.util.List; 8 import java.util.List;
  9 +import java.util.Map;
9 10
10 /** 11 /**
11 * <p> 12 * <p>
@@ -38,4 +39,12 @@ public interface ShipmentsOrderInfoMapper extends BaseMapper<ShipmentsOrderInfo> @@ -38,4 +39,12 @@ public interface ShipmentsOrderInfoMapper extends BaseMapper<ShipmentsOrderInfo>
38 * @return List<ShipmentsOrderInfo> 39 * @return List<ShipmentsOrderInfo>
39 */ 40 */
40 List<ShipmentsOrderInfo> queryByIds(@Param("ids") List<String> ids); 41 List<ShipmentsOrderInfo> queryByIds(@Param("ids") List<String> ids);
  42 +
  43 + /**
  44 + * 根据客户分组统计实发数
  45 + *
  46 + * @param customerIds 客户ID集合
  47 + * @return List<Map<String, Double>>
  48 + */
  49 + List<Map<String, Object>> statisticsActualNum(@Param("customerIds") List<String> customerIds);
41 } 50 }
@@ -51,10 +51,11 @@ public interface ShipmentsPlanDetailMapper extends BaseMapper<ShipmentsPlanDetai @@ -51,10 +51,11 @@ public interface ShipmentsPlanDetailMapper extends BaseMapper<ShipmentsPlanDetai
51 /** 51 /**
52 * 根据计划ID查询 52 * 根据计划ID查询
53 * 53 *
54 - * @param planId 计划ID 54 + * @param planId 计划ID
  55 + * @param includePreShipment 是否包含预发数据
55 * @return List<ShipmentsPlanDetail> 56 * @return List<ShipmentsPlanDetail>
56 */ 57 */
57 - List<ShipmentsPlanDetail> listByPlanId(@Param("planId") String planId); 58 + List<ShipmentsPlanDetail> listByPlanId(@Param("planId") String planId, @Param("includePreShipment") boolean includePreShipment);
58 59
59 /** 60 /**
60 * 查询 61 * 查询
@@ -124,4 +124,12 @@ public interface PurchaseOrderInfoService extends BaseMpService<PurchaseOrderInf @@ -124,4 +124,12 @@ public interface PurchaseOrderInfoService extends BaseMpService<PurchaseOrderInf
124 * @return List<PurchaseOrderInfo> 124 * @return List<PurchaseOrderInfo>
125 */ 125 */
126 List<PurchaseOrderInfo> queryByIds(List<String> ids); 126 List<PurchaseOrderInfo> queryByIds(List<String> ids);
  127 +
  128 + /**
  129 + * 批量获取客户所有订货单数据
  130 + *
  131 + * @param customerIds 客户ID集合
  132 + * @return List<PurchaseOrderInfo>
  133 + */
  134 + List<PurchaseOrderInfo> listByCustomerIds(List<String> customerIds);
127 } 135 }
@@ -5,6 +5,7 @@ import com.lframework.xingyun.sc.entity.ShipmentsOrderInfo; @@ -5,6 +5,7 @@ import com.lframework.xingyun.sc.entity.ShipmentsOrderInfo;
5 import com.lframework.starter.web.core.service.BaseMpService; 5 import com.lframework.starter.web.core.service.BaseMpService;
6 import com.lframework.starter.web.core.components.resp.PageResult; 6 import com.lframework.starter.web.core.components.resp.PageResult;
7 import java.util.List; 7 import java.util.List;
  8 +import java.util.Map;
8 9
9 /** 10 /**
10 * 发货单 Service 11 * 发货单 Service
@@ -99,4 +100,12 @@ public interface ShipmentsOrderInfoService extends BaseMpService<ShipmentsOrderI @@ -99,4 +100,12 @@ public interface ShipmentsOrderInfoService extends BaseMpService<ShipmentsOrderI
99 * @return List<ShipmentsOrderInfo> 100 * @return List<ShipmentsOrderInfo>
100 */ 101 */
101 List<ShipmentsOrderInfo> queryByIds(List<String> ids); 102 List<ShipmentsOrderInfo> queryByIds(List<String> ids);
  103 +
  104 + /**
  105 + * 根据客户分组统计实发数
  106 + *
  107 + * @param customerIds 客户ID集合
  108 + * @return List<ShipmentsPlanDetail>
  109 + */
  110 + Map<String, Double> statisticsActualNum(List<String> customerIds);
102 } 111 }
@@ -113,7 +113,7 @@ public interface ShipmentsPlanDetailService extends BaseMpService<ShipmentsPlanD @@ -113,7 +113,7 @@ public interface ShipmentsPlanDetailService extends BaseMpService<ShipmentsPlanD
113 * @param planId 计划ID 113 * @param planId 计划ID
114 * @return List<ShipmentsPlanDetail> 114 * @return List<ShipmentsPlanDetail>
115 */ 115 */
116 - List<ShipmentsPlanDetail> listByPlanId(String planId); 116 + List<ShipmentsPlanDetail> listByPlanId(String planId, boolean includePreShipment);
117 117
118 118
119 /** 119 /**
@@ -130,4 +130,13 @@ public interface ShipmentsPlanDetailService extends BaseMpService<ShipmentsPlanD @@ -130,4 +130,13 @@ public interface ShipmentsPlanDetailService extends BaseMpService<ShipmentsPlanD
130 * @return List<ShipmentsPlanDetail> 130 * @return List<ShipmentsPlanDetail>
131 */ 131 */
132 List<ShipmentsPlanDetail> listBySpecIds(List<String> specIds); 132 List<ShipmentsPlanDetail> listBySpecIds(List<String> specIds);
  133 +
  134 + /**
  135 + * 校验数据完整性
  136 + * 仅针对发货时点、是否可发货
  137 + *
  138 + * @param planId 计划ID
  139 + * @param status 状态
  140 + */
  141 + void checkDataIntegrity(String planId, String status);
133 } 142 }
@@ -113,4 +113,15 @@ @@ -113,4 +113,15 @@
113 #{item} 113 #{item}
114 </foreach> 114 </foreach>
115 </select> 115 </select>
  116 +
  117 + <select id="statisticsActualNum" resultType="java.util.Map">
  118 + select o.customer_id,sum(d.actual_shipment_quantity) as actual_num
  119 + from shipments_order_info o
  120 + inner join shipments_plan_detail d on o.id = d.shipment_order_id
  121 + where o.customer_id in
  122 + <foreach collection="customerIds" open="(" separator="," close=")" item="item">
  123 + #{item}
  124 + </foreach>
  125 + group by o.customer_id
  126 + </select>
116 </mapper> 127 </mapper>
@@ -275,7 +275,12 @@ @@ -275,7 +275,12 @@
275 ol.quantity, 275 ol.quantity,
276 c.id as customer_id 276 c.id as customer_id
277 from shipments_plan_detail pd 277 from shipments_plan_detail pd
278 - inner join shipments_plan p on pd.plan_id = p.id and pd.shipments_date = p.tomo_pre_ship_date 278 + <if test="includePreShipment == true">
  279 + inner join shipments_plan p on pd.plan_id = p.id
  280 + </if>
  281 + <if test="includePreShipment == false">
  282 + inner join shipments_plan p on pd.plan_id = p.id and pd.shipments_date = p.tomo_pre_ship_date
  283 + </if>
279 left join tbl_purchase_order_line ol on pd.order_spec_id = ol.id 284 left join tbl_purchase_order_line ol on pd.order_spec_id = ol.id
280 left join purchase_order_info o on pd.order_id = o.id 285 left join purchase_order_info o on pd.order_id = o.id
281 left join base_data_customer c on o.ordering_unit = c.id 286 left join base_data_customer c on o.ordering_unit = c.id