Commit 225719d692abb3f62a64091323cfddb69241c37f

Authored by 房远帅
2 parents 088127fd 4f84b661

Merge branch 'master_chujiang_0805' into master_quotation

... ... @@ -170,7 +170,7 @@ public class ReceiptLedgerInfoController extends DefaultBaseController {
170 170 */
171 171 @ApiOperation("自动生成台账明细数据")
172 172 @GetMapping("/autoGenerate")
173   - @Scheduled(cron = "0 10 2 * * ?")
  173 +// @Scheduled(cron = "0 10 2 * * ?")
174 174 public InvokeResult<Void> autoGenerate() {
175 175 receiptLedgerInfoService.autoGenerate();
176 176 return InvokeResultBuilder.success();
... ...
... ... @@ -160,10 +160,18 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
160 160 return;
161 161 }
162 162
163   - boolean isYwy = roleCodes.contains("ywy");
  163 + // 1. 优先判断:是否拥有【办事处内勤】或【办事处主管】权限
  164 + boolean isNeiqinOrZhuguan = roleCodes.contains("bscnq") || roleCodes.contains("bsczg");
164 165
165   - if (isYwy) {
166   - // 业务员:有区域按区域过滤,没有则按办事处过滤
  166 + if (isNeiqinOrZhuguan) {
  167 + // 办事处内勤/办事处主管:始终按办事处过滤
  168 + if (StringUtils.isNotBlank(scope.getOfficeDeptId())) {
  169 + vo.setDeptId(scope.getOfficeDeptId());
  170 + vo.setRegion(null);
  171 + }
  172 + } else if (roleCodes.contains("ywy")) {
  173 + // 2. 次优先级:业务员权限
  174 + // 有区域按区域过滤,没有则按办事处过滤
167 175 if (StringUtils.isNotBlank(scope.getRegionId())) {
168 176 vo.setRegion(scope.getRegionId());
169 177 vo.setDeptId(null);
... ... @@ -171,12 +179,6 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
171 179 vo.setDeptId(scope.getOfficeDeptId());
172 180 vo.setRegion(null);
173 181 }
174   - } else {
175   - // 办事处内勤/办事处主管:始终按办事处过滤
176   - if (StringUtils.isNotBlank(scope.getOfficeDeptId())) {
177   - vo.setDeptId(scope.getOfficeDeptId());
178   - vo.setRegion(null);
179   - }
180 182 }
181 183 }
182 184
... ... @@ -308,7 +310,7 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
308 310 @HasPermission({"shipping-plan-manage:shipping-plan:generate"})
309 311 @PostMapping("/generate")
310 312 public InvokeResult<Void> generate(@Valid @RequestBody GenerateShipmentsOrderVo vo) {
311   - // 生成发货单和要车相关数据
  313 + // 生成发货单和要车单、要车计划相关数据
312 314 shipmentsOrderInfoService.generate(vo);
313 315 return InvokeResultBuilder.success();
314 316 }
... ... @@ -330,7 +332,7 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
330 332 }
331 333
332 334 /**
333   - * 明细数据补充录入
  335 + * 明细数据补充录入(填写实发数)
334 336 */
335 337 @ApiOperation("明细数据补充录入")
336 338 @HasPermission({"shipping-plan-manage:invoice:fill"})
... ... @@ -383,7 +385,7 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
383 385
384 386 @ApiModelProperty("数据处理")
385 387 @GetMapping("/dataHandler")
386   - @Scheduled(cron = "0 8 0 * * ?")
  388 +// @Scheduled(cron = "0 8 0 * * ?")
387 389 public InvokeResult<Void> dataHandler() {
388 390 // 只处理今日应该发货但状态仍是未发货的数据,避免已签收/已发货的数据被重复处理
389 391 log.info("=========定时任务开始执行========");
... ... @@ -411,7 +413,8 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
411 413 }
412 414 }
413 415 List<PurchaseOrderInfo> orderInfoList = purchaseOrderInfoService.listByIds(orderIds);
414   - shipmentsOrderInfoService.handleData(shipmentsOrderInfo, orderInfoList, orderSpecIds, detailIds);
  416 + //todo 暂时只在填写实发数的时候处理相关数据(生成发货明细报表数据、生成台账等)
  417 +// shipmentsOrderInfoService.handleData(shipmentsOrderInfo, orderInfoList, orderSpecIds, detailIds);
415 418 } catch (Exception e) {
416 419 // 单张发货单处理失败不影响其他发货单
417 420 log.error("定时任务处理发货单 [{}] 失败:{}", orderInfo.getId(), e.getMessage(), e);
... ...
... ... @@ -610,7 +610,7 @@ public class BusinessDataHandlerServiceImpl implements BusinessDataHandlerServic
610 610 //更新外办审核人
611 611 draftRequestCarTicketService.updateExamineUser(businessId, SecurityUtil.getCurrentUser().getId(), null, null);
612 612 //如果是发货计划生成的草稿要车单-需要生成要车单和要车计划
613   - DraftRequestCarTicket draftRequestCarTicket = draftRequestCarTicketService.findById(businessId);
  613 +/* DraftRequestCarTicket draftRequestCarTicket = draftRequestCarTicketService.findById(businessId);
614 614 if (draftRequestCarTicket != null && "SHIPMENTSPLAN".equals(draftRequestCarTicket.getSource())) {
615 615 // 处理发货单
616 616 String shipmentOrderId = (String) redisHandler.get("GET_SHIPMENTS_ORDER_ID_" + draftRequestCarTicket.getId());
... ... @@ -632,7 +632,7 @@ public class BusinessDataHandlerServiceImpl implements BusinessDataHandlerServic
632 632 shipmentsOrderInfoService.updateStatus(shipmentOrderId, "UN_SHIPMENTS");
633 633 }
634 634 }
635   - }
  635 + }*/
636 636 } else if (FlowInstanceStatus.REVOKE.getCode().equals(flowStatus)
637 637 || FlowInstanceStatus.REFUSE.getCode().equals(flowStatus)
638 638 || FlowInstanceStatus.TERMINATION.getCode().equals(flowStatus)) {
... ...
... ... @@ -797,7 +797,7 @@ public class ReceiptLedgerInfoServiceImpl extends BaseMpServiceImpl<ReceiptLedge
797 797 // 生成发货明细报表数据
798 798 shipmentDetailStatisticsService.generateStatisticsData(detailIds);
799 799 // 生成要车计划、要车单
800   - generateCarPlanAndTicket(shipmentsOrderInfos);
  800 +// generateCarPlanAndTicket(shipmentsOrderInfos);
801 801 }
802 802
803 803 @Override
... ...
... ... @@ -443,7 +443,8 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
443 443 }
444 444 }
445 445 List<PurchaseOrderInfo> orderInfoList = purchaseOrderInfoService.listByIds(orderIds);
446   - this.handleData(data, orderInfoList, orderSpecIds, detailIds);
  446 + //todo 暂时只在填写实发数的时候处理相关数据(生成发货明细报表数据、生成台账等)
  447 +// this.handleData(data, orderInfoList, orderSpecIds, detailIds);
447 448 }
448 449 }
449 450
... ... @@ -642,12 +643,13 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
642 643 }
643 644 }
644 645 // 判断当前日期是否大于等于发货日期
645   - LocalDate now = LocalDate.now();
646   - LocalDate shipmentsDate = orderInfo.getShipmentsDate();
647   - if (BooleanUtils.isTrue(vo.getOnTimeShipment()) && !now.isBefore(shipmentsDate)) {
648   - orderInfo = findById(shipmentsOrderId);
  646 +// LocalDate now = LocalDate.now();
  647 +// LocalDate shipmentsDate = orderInfo.getShipmentsDate();
  648 +// if (BooleanUtils.isTrue(vo.getOnTimeShipment()) && !now.isBefore(shipmentsDate)) {
  649 +// orderInfo = findById(shipmentsOrderId);
  650 + //todo 填写实发数的时候就直接生成相关数据,目前暂时不考虑不是当日发货的情况
649 651 handleData(orderInfo, orderInfoList, orderSpecIds, detailIds);
650   - }
  652 +// }
651 653 }
652 654
653 655 @Override
... ... @@ -882,7 +884,8 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
882 884 // 生成发货明细报表数据
883 885 shipmentDetailStatisticsService.generateStatisticsData(detailIds);
884 886 // 生成要车计划、要车单数据
885   - carRequestPlanService.generate(orderInfoList, shipmentsOrderInfo);
  887 + //todo 提前到生成发货单的时候生成要车计划、要车单数据
  888 +// carRequestPlanService.generate(orderInfoList, shipmentsOrderInfo);
886 889 // 消息通知
887 890 String type = shipmentsOrderInfo.getShipmentType();
888 891 List<String> userIds = new ArrayList<>();
... ... @@ -927,12 +930,22 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
927 930 if (CollectionUtils.isNotEmpty(orderInfoList)) {
928 931 orderInfoMap = orderInfoList.stream().collect(Collectors.toMap(PurchaseOrderInfo::getId, Function.identity()));
929 932 }
  933 + //先检查是否都有审核通过的草稿要车单
  934 + boolean allApproved = areAllDraftTicketsApproved(orderIds);
  935 +
930 936 Map<String, BigDecimal> quantityMap = new HashMap<>();
931 937 Map<String, String> shipmentsOrderIdMap = new HashMap<>();
932 938 Map<String, List<String>> deptIdMap = new HashMap<>();
933 939 Map<String, List<String>> regionMap = new HashMap<>();
934 940 List<ShipmentsOrderInfo> shipmentsOrderInfoList = new ArrayList<>();
935 941 for (List<ShipmentsPlanDetail> details : batchList) {
  942 + // 获取当前批次订货单数据
  943 + List<String> batchOrderIds = details.stream()
  944 + .map(ShipmentsPlanDetail::getOrderId)
  945 + .filter(Objects::nonNull)
  946 + .distinct()
  947 + .collect(Collectors.toList());
  948 + List<PurchaseOrderInfo> batchOrderInfoList = purchaseOrderInfoService.queryByIds(batchOrderIds);
936 949 List<String> detailIds = new ArrayList<>();
937 950 String id = IdUtil.getId();
938 951 String customerId = details.get(0).getCustomerId();
... ... @@ -1034,7 +1047,11 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
1034 1047
1035 1048 shipmentsOrderInfoList.add(shipmentsOrderInfo);
1036 1049 // 更新明细数据
1037   - shipmentsPlanDetailService.setShipmentsOrderId(detailIds, id);
  1050 + if (allApproved) {
  1051 + shipmentsPlanDetailService.setShipmentsOrderId(detailIds, id);
  1052 + //生成要车单和要车计划
  1053 + carRequestPlanService.generate(batchOrderInfoList, shipmentsOrderInfo);
  1054 + }
1038 1055 }
1039 1056 // 获取所有部门数据
1040 1057 for (ShipmentsOrderInfo orderInfo : shipmentsOrderInfoList) {
... ... @@ -1050,11 +1067,10 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
1050 1067 orderInfo.setRegion(regionStr);
1051 1068 }
1052 1069 }
1053   - // 批量新增发货单
1054   - batchAdd(shipmentsOrderInfoList);
  1070 + // 先检查是否都有审核通过的草稿,再批量新增发货单,否则只生成草稿要车单
  1071 + generateRequestCarData(orderInfoList, orderIds, plan, quantityMap);
1055 1072 // todo 后续如果数据量过大,则此处需要优化
1056   - // 生成要车相关数据
1057   - generateRequestCarData(orderInfoList, orderIds, plan, quantityMap, shipmentsOrderIdMap);
  1073 + batchAdd(shipmentsOrderInfoList);
1058 1074 // 生成发货单编号
1059 1075 // 获取当月最后一天的23:59:59
1060 1076 LocalDateTime monthEnd = LocalDateTime.now()
... ... @@ -1070,6 +1086,32 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
1070 1086 getBaseMapper().setShipmentOrderCode(shipmentsOrderInfoList);
1071 1087 }
1072 1088
  1089 + /**
  1090 + * 检查指定的订单是否都存在审核通过的草稿要车单
  1091 + * @param orderIds 订单ID列表
  1092 + * @return true-全部审核通过;false-存在缺失或未通过的草稿
  1093 + */
  1094 + private boolean areAllDraftTicketsApproved(List<String> orderIds) {
  1095 + if (CollectionUtils.isEmpty(orderIds)) {
  1096 + return true;
  1097 + }
  1098 +
  1099 + List<DraftRequestCarTicket> draftTickets = draftRequestCarTicketService.listByOrderId(orderIds);
  1100 + Map<String, DraftRequestCarTicket> draftTicketMap = new HashMap<>();
  1101 + if (CollectionUtils.isNotEmpty(draftTickets)) {
  1102 + draftTicketMap = draftTickets.stream()
  1103 + .collect(Collectors.toMap(DraftRequestCarTicket::getPurchaseOrderId, Function.identity(), (v1, v2) -> v2));
  1104 + }
  1105 +
  1106 + for (String orderId : orderIds) {
  1107 + DraftRequestCarTicket draftTicket = draftTicketMap.get(orderId);
  1108 + // 只要有一个不存在,或者状态不是 PASS,直接返回 false
  1109 + if (draftTicket == null || !"PASS".equals(draftTicket.getStatus())) {
  1110 + return false;
  1111 + }
  1112 + }
  1113 + return true;
  1114 + }
1073 1115
1074 1116 /**
1075 1117 * 生成要车相关数据
... ... @@ -1079,44 +1121,53 @@ public class ShipmentsOrderInfoServiceImpl extends BaseMpServiceImpl<ShipmentsOr
1079 1121 * @param plan 发货计划
1080 1122 */
1081 1123 private void generateRequestCarData(List<PurchaseOrderInfo> orderInfoList, List<String> orderIds, ShipmentsPlan plan
1082   - , Map<String, BigDecimal> quantityMap, Map<String, String> shipmentsOrderIdMap) {
1083   - // 根据订货单获取草稿要车单
  1124 + , Map<String, BigDecimal> quantityMap) {
  1125 + // 1. 批量获取已有的草稿要车单
1084 1126 Map<String, DraftRequestCarTicket> draftTicketMap = new HashMap<>();
1085 1127 List<DraftRequestCarTicket> draftTickets = draftRequestCarTicketService.listByOrderId(orderIds);
1086 1128 if (CollectionUtils.isNotEmpty(draftTickets)) {
1087   - draftTicketMap = draftTickets.stream().collect(Collectors.toMap(DraftRequestCarTicket::getPurchaseOrderId, Function.identity()
1088   - , (v1, v2) -> v2));
  1129 + draftTicketMap = draftTickets.stream()
  1130 + .collect(Collectors.toMap(DraftRequestCarTicket::getPurchaseOrderId, Function.identity(), (v1, v2) -> v2));
1089 1131 }
  1132 +
  1133 + // 标记本次循环中是否有新生成的草稿要车单
  1134 + boolean hasNewDraftCreated = false;
  1135 +
1090 1136 for (PurchaseOrderInfo orderInfo : orderInfoList) {
1091 1137 String orderId = orderInfo.getId();
1092 1138 DraftRequestCarTicket draftTicket = draftTicketMap.get(orderId);
1093 1139 BigDecimal quantity = quantityMap.get(orderId);
1094   - String shipmentsOrderId = shipmentsOrderIdMap.get(orderId);
1095 1140 if (draftTicket == null) {
  1141 + // 【第一阶段:生成草稿】
1096 1142 // 生成草稿要车单
1097 1143 CreateDraftRequestCarTicketVo createVo = packDraftRequestCarTicket(orderInfo, plan.getTomoPreShipDate(), quantity);
1098   - String draftId = draftRequestCarTicketService.create(createVo);
1099   - // 草稿要车单ID和发货单ID映射
1100   - redisHandler.set("GET_SHIPMENTS_ORDER_ID_" + draftId, shipmentsOrderId);
1101   - //发送消息提醒业务员(发货单中合同创建人)补充草稿要车单相关数据
  1144 + draftRequestCarTicketService.create(createVo);
  1145 + // 发送消息提醒业务员补充数据
1102 1146 SysSiteMessageDto messageDto = new SysSiteMessageDto();
1103 1147 List<String> userIdList = new ArrayList<>();
1104 1148 userIdList.add(orderInfo.getContractCreateById());
1105 1149 messageDto.setUserIdList(userIdList);
1106 1150 messageDto.setTitle("草稿要车单补充通知");
1107   - messageDto.setContent("您有新的草稿要车单需要补充,请尽快完成!");
  1151 + messageDto.setContent("您有新的草稿要车单需要补充,请尽快完成!订单编号:" + orderInfo.getOrderNo());
1108 1152 messageDto.setBizKey(IdUtil.getId());
1109   - //如果是空表示由系统自动发起
1110   - messageDto.setCreateUserId(null);
  1153 + messageDto.setCreateUserId(null); // 系统自动发起
1111 1154 mqProducerService.createSysSiteMessage(messageDto);
1112   - // 更新发货单状态为草稿
1113   - updateStatus(shipmentsOrderId, "DRAFT");
1114   - continue;
1115   - }
1116   - if (!"PASS".equals(draftTicket.getStatus())) {
1117   - throw new DefaultClientException("请先补充草稿要车单数据!");
  1155 +
  1156 + // 标记已生成新草稿
  1157 + hasNewDraftCreated = true;
  1158 +
  1159 + } else if (!"PASS".equals(draftTicket.getStatus())) {
  1160 + // 如果草稿已存在但未通过审核,也标记为需要补充
  1161 + hasNewDraftCreated = true;
1118 1162 }
1119 1163 }
  1164 +
  1165 + // 【第二阶段:统一校验并返回提示】
  1166 + // 循环结束后,只要生成了新的草稿或有未通过的草稿,就统一抛出异常
  1167 + // 这样既保证了所有草稿都被创建,又实现了已创建数据不回退的效果
  1168 + if (hasNewDraftCreated) {
  1169 + throw new DefaultClientException("请先补充草稿要车单数据!");
  1170 + }
1120 1171 }
1121 1172
1122 1173
... ...
... ... @@ -91,7 +91,7 @@ public interface ShipmentsOrderInfoService extends BaseMpService<ShipmentsOrderI
91 91 void batchAdd(List<ShipmentsOrderInfo> orderInfos);
92 92
93 93 /**
94   - * 数据补充录入
  94 + * 数据补充录入(填写实发数)
95 95 *
96 96 * @param vo 数据实体
97 97 */
... ...