48 Commits
Author SHA1 Message Date
王奎兴 c2e3de244b feign地址修改; 2026-09-12 17:50:48 +08:00
王奎兴 9453aea60f feign地址修改; 2026-09-12 17:36:09 +08:00
王奎兴 c877696eca Merge branch 'dev' into dev-bms-260826
# Conflicts:
#	mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java
#	mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java
#	mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java
#	mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java
#	mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java
#	mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java
#	mhd_oms/src/main/java/com/mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java
2026-09-12 17:28:12 +08:00
王奎兴 edcfa0b510 月度汇总明细接口; 2026-09-12 14:52:03 +08:00
王奎兴 03b168abc0 token参数名 2026-09-12 14:02:47 +08:00
王奎兴 c9bd81c8f2 返回值判断 2026-09-12 11:46:01 +08:00
王奎兴 9ac60e446a 客户月结报告; 2026-09-11 17:39:29 +08:00
王奎兴 5ba179d29d 客户月结报告; 2026-09-11 17:36:38 +08:00
王奎兴 6613eeb3fb 批量红冲; 2026-09-11 16:36:23 +08:00
王奎兴 0ca8548c06 查询参数; 2026-09-11 15:56:48 +08:00
王奎兴 3653c37914 查询参数; 2026-09-11 15:52:02 +08:00
王奎兴 c1bbda9f9a 撤销付款逻辑修改; 2026-09-11 15:33:59 +08:00
秦鸿展 0077e5d673 30 2026-09-10 23:29:33 +08:00
秦鸿展 4b5ed4d0e1 调整同步TMS修改 2026-09-10 23:07:59 +08:00
秦鸿展 3b8c0ffe8f 调整同步TMS修改 2026-09-10 22:53:22 +08:00
秦鸿展 21db0bc5da 调整同步TMS修改 2026-09-10 22:43:45 +08:00
秦鸿展 eaeb100b22 调整同步TMS修改 2026-09-10 22:21:41 +08:00
秦鸿展 8d6c252eb4 调整同步TMS修改 2026-09-10 22:16:47 +08:00
秦鸿展 86c4c07708 调整修改 2026-09-10 21:55:02 +08:00
秦鸿展 db31711ad0 驳回订单修改 2026-09-10 21:20:09 +08:00
秦鸿展 6282849468 驳回订单修改 2026-09-10 21:15:14 +08:00
秦鸿展 60381ad7c9 OMS订单费用修改 2026-09-10 20:42:16 +08:00
秦鸿展 cd4ceecf98 OMS调整字段映射 2026-09-10 20:17:05 +08:00
王奎兴 cf3299165d 定时任务方法; 2026-09-10 17:29:09 +08:00
王奎兴 432f71de06 json解析修改; 2026-09-10 17:11:12 +08:00
王奎兴 6efd37fe0e json解析修改; 2026-09-10 17:00:48 +08:00
王奎兴 65fdac5354 定时任务生成发票; 2026-09-10 16:18:32 +08:00
王奎兴 3387d1712d 红冲接口 2026-09-10 15:33:51 +08:00
王奎兴 76ded7ed01 Merge branch 'dev' into dev-bms-260826 2026-09-10 11:19:16 +08:00
王奎兴 bbde788aa4 撤销收款接口 2026-09-10 11:17:58 +08:00
王奎兴 10012b3437 Merge remote-tracking branch 'origin/dev-bms-260826' into dev-bms-260826 2026-09-10 10:32:09 +08:00
王奎兴 7a5e84453c xxljob 2026-09-10 10:31:56 +08:00
秦鸿展 698a8ea9a6 OMS调整修改 2026-09-09 20:34:24 +08:00
秦鸿展 f991485ba3 OMS调整接口修改 2026-09-09 19:04:01 +08:00
王奎兴 5a3791e334 Merge branch 'dev' into dev-bms-260826 2026-09-09 16:44:07 +08:00
王奎兴 e2bee47aac 月度汇总视图查询接口; 2026-09-09 14:31:56 +08:00
王奎兴 910c7b1701 月度汇总视图查询接口; 2026-09-09 14:19:38 +08:00
王奎兴 f118c7ff29 组织信息; 2026-09-07 17:58:16 +08:00
王奎兴 cdc8396b57 金额参数; 2026-09-07 17:45:25 +08:00
王奎兴 aad54545f1 获取不到登录人 2026-09-07 16:27:58 +08:00
王奎兴 49fb27f273 流水金额取值修改; 2026-09-07 16:08:51 +08:00
王奎兴 1367a1d225 登录用户拿不到问题处理; 2026-09-07 15:45:03 +08:00
王奎兴 590e840a7b 汇率数据类型转换; 2026-09-07 15:33:53 +08:00
王奎兴 a326af15f7 查询汇率; 2026-09-07 15:28:47 +08:00
王奎兴 494f5f8999 计费单据仓库类型; 2026-09-07 15:24:59 +08:00
王奎兴 9990701c5e 冻仓生成应收帐单; 2026-09-07 15:10:41 +08:00
王奎兴 9a15dc4978 查询结算配置 2026-09-07 15:05:41 +08:00
王奎兴 e55840c485 表别名; 2026-09-07 14:41:36 +08:00
58 changed files with 3220 additions and 215 deletions
@@ -536,7 +536,12 @@ public interface WlhyServiceFeign {
*/ */
@PostMapping("/feign/order/add") @PostMapping("/feign/order/add")
public AjaxResult add(@RequestBody TmsOrderAddDTO tmsOrderAddDTO); public AjaxResult add(@RequestBody TmsOrderAddDTO tmsOrderAddDTO);
/**
* 修改运单(OMS调整业务单后同步修改TMS订单)
* @param tmsOrderAddDTO 需携带 TMS 订单 id 定位
*/
@PostMapping("/feign/order/update")
public AjaxResult update(@RequestBody TmsOrderAddDTO tmsOrderAddDTO);
@GetMapping("/feign/order/cancelIssueDocuments") @GetMapping("/feign/order/cancelIssueDocuments")
public AjaxResult cancelIssueDocuments(@RequestParam(name="executeOrderId") String executeOrderId); public AjaxResult cancelIssueDocuments(@RequestParam(name="executeOrderId") String executeOrderId);
@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.Map; import java.util.Map;
// 目标地址由 nacos 配置项 feign.url.xxl-job-service 指定,未配置时按服务名走服务发现 // 目标地址由 nacos 配置项 feign.url.xxl-job-service 指定,未配置时按服务名走服务发现
@FeignClient(contextId = "XxlJobService", value = ServiceNameConstants.XXL_JOB_SERVICE,url = "http://10.102.192.32:8020",fallbackFactory = RemoteXxlJobFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "XxlJobService", value = ServiceNameConstants.XXL_JOB_SERVICE,url = "http://127.0.0.1:8020",fallbackFactory = RemoteXxlJobFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface XxlJobServiceFeign { public interface XxlJobServiceFeign {
@@ -10,7 +10,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
// 目标地址由 nacos 配置项 feign.url.mhd-yms-service 指定,未配置时按服务名走服务发现 // 目标地址由 nacos 配置项 feign.url.mhd-yms-service 指定,未配置时按服务名走服务发现
@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.32:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface YmsServiceFeign { public interface YmsServiceFeign {
/** /**
@@ -546,6 +546,11 @@ public class RemoteWlhyFallbackFactory implements FallbackFactory<WlhyServiceFei
return AjaxResult.error(cause.getMessage()); return AjaxResult.error(cause.getMessage());
} }
@Override
public AjaxResult update(TmsOrderAddDTO tmsOrderAddDTO) {
return AjaxResult.error(cause.getMessage());
}
@Override @Override
public AjaxResult cancelIssueDocuments(String executeOrderId) { public AjaxResult cancelIssueDocuments(String executeOrderId) {
return AjaxResult.error(cause.getMessage()); return AjaxResult.error(cause.getMessage());
@@ -29,7 +29,7 @@ public interface BiPlatformRealDataMapper {
/** 今日作业任务数 */ /** 今日作业任务数 */
Long countTodayTasks(); Long countTodayTasks();
/** 车辆状态统计(今日,含叫号状态合计 callStatusTotal = 已签到+已叫号+已过号 */ /** 车辆状态统计(今日) */
RealVehicleStatusPO queryVehicleStatusToday(); RealVehicleStatusPO queryVehicleStatusToday();
/** 本月任务量 */ /** 本月任务量 */
@@ -19,9 +19,6 @@ public class RealVehicleStatusPO implements Serializable {
/** 当前等待作业(FLOW_STATUS IN '1','2','3' 已预约/已签到/已叫号) */ /** 当前等待作业(FLOW_STATUS IN '1','2','3' 已预约/已签到/已叫号) */
private Long waiting; private Long waiting;
/** 叫号状态合计:已签到 + 已叫号 + 已过号(FLOW_STATUS IN '2','3','4',预约日期为今天) */
private Long callStatusTotal;
/** 当前作业中 */ /** 当前作业中 */
private Long operatingVehicles; private Long operatingVehicles;
@@ -16,9 +16,7 @@ import com.mhd.bi.domain.biPlatformSurveillance.repository.mapper.BiPlatformSurv
import com.mhd.bi.domain.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper; import com.mhd.bi.domain.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper;
import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder; import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformVehicleItemVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformVehicleItemVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskLoadItemVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskLoadItemVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskTypeStatisticsVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskTypeStatisticsVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskTypeCountItemVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskTypeCountItemVO;
@@ -108,13 +106,9 @@ public class BiPlatformRealDataService {
fp.put("todayReservedVehicles", vo.getVehicleStatus().getTodayReservedVehicles()); fp.put("todayReservedVehicles", vo.getVehicleStatus().getTodayReservedVehicles());
fp.put("notCheckedIn", vo.getVehicleStatus().getNotCheckedIn()); fp.put("notCheckedIn", vo.getVehicleStatus().getNotCheckedIn());
fp.put("waiting", vo.getVehicleStatus().getWaiting()); fp.put("waiting", vo.getVehicleStatus().getWaiting());
fp.put("callStatusTotal", vo.getVehicleStatus().getCallStatusTotal());
fp.put("operatingVehicles", vo.getVehicleStatus().getOperatingVehicles()); fp.put("operatingVehicles", vo.getVehicleStatus().getOperatingVehicles());
fp.put("completedVehicles", vo.getVehicleStatus().getCompletedVehicles()); fp.put("completedVehicles", vo.getVehicleStatus().getCompletedVehicles());
} }
if (vo.getMonthlyTaskStatistics() != null) { if (vo.getMonthlyTaskStatistics() != null) {
fp.put("taskTotal", vo.getMonthlyTaskStatistics().getTaskTotal()); fp.put("taskTotal", vo.getMonthlyTaskStatistics().getTaskTotal());
fp.put("avgTaskDuration", vo.getMonthlyTaskStatistics().getAvgTaskDuration()); fp.put("avgTaskDuration", vo.getMonthlyTaskStatistics().getAvgTaskDuration());
@@ -232,7 +226,6 @@ public class BiPlatformRealDataService {
if (po.getTodayReservedVehicles() == null) po.setTodayReservedVehicles(0L); if (po.getTodayReservedVehicles() == null) po.setTodayReservedVehicles(0L);
if (po.getNotCheckedIn() == null) po.setNotCheckedIn(0L); if (po.getNotCheckedIn() == null) po.setNotCheckedIn(0L);
if (po.getWaiting() == null) po.setWaiting(0L); if (po.getWaiting() == null) po.setWaiting(0L);
if (po.getCallStatusTotal() == null) po.setCallStatusTotal(0L);
if (po.getOperatingVehicles() == null) po.setOperatingVehicles(0L); if (po.getOperatingVehicles() == null) po.setOperatingVehicles(0L);
if (po.getCompletedVehicles() == null) po.setCompletedVehicles(0L); if (po.getCompletedVehicles() == null) po.setCompletedVehicles(0L);
return po; return po;
@@ -242,13 +235,10 @@ public class BiPlatformRealDataService {
po.setTodayReservedVehicles(0L); po.setTodayReservedVehicles(0L);
po.setNotCheckedIn(0L); po.setNotCheckedIn(0L);
po.setWaiting(0L); po.setWaiting(0L);
po.setCallStatusTotal(0L);
po.setOperatingVehicles(0L); po.setOperatingVehicles(0L);
po.setCompletedVehicles(0L); po.setCompletedVehicles(0L);
return po; return po;
} }
} }
public long countMonthTasks() { public long countMonthTasks() {
@@ -414,15 +404,10 @@ public class BiPlatformRealDataService {
template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue()); template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue());
template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue()); template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue());
template.getVehicleStatus().setWaiting(vs.getWaiting().intValue()); template.getVehicleStatus().setWaiting(vs.getWaiting().intValue());
// 叫号状态合计:已签到 + 已叫号 + 已过号(一个字段表示三个状态的总数量)
template.getVehicleStatus().setCallStatusTotal(vs.getCallStatusTotal().intValue());
template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue()); template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue());
template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue()); template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue());
} }
// 本月任务统计:taskTotal / avgTaskDuration / taskCompletionRate 均有真实数据源,无条件覆盖;YoY 保留模板写死值 // 本月任务统计:taskTotal / avgTaskDuration / taskCompletionRate 均有真实数据源,无条件覆盖;YoY 保留模板写死值
if (template.getMonthlyTaskStatistics() != null) { if (template.getMonthlyTaskStatistics() != null) {
template.getMonthlyTaskStatistics().setTaskTotal((int) countMonthTasks()); template.getMonthlyTaskStatistics().setTaskTotal((int) countMonthTasks());
@@ -87,9 +87,7 @@ public final class BiReportSnapshotMapperSupport {
.platformOverview(PlatformOverviewVO.builder() .platformOverview(PlatformOverviewVO.builder()
.totalPlatforms(0).currentOccupancyRate(0d).operatingPlatforms(0).todayTasks(0).build()) .totalPlatforms(0).currentOccupancyRate(0d).operatingPlatforms(0).todayTasks(0).build())
.vehicleStatus(VehicleStatusVO.builder() .vehicleStatus(VehicleStatusVO.builder()
.todayReservedVehicles(0).notCheckedIn(0).waiting(0) .todayReservedVehicles(0).notCheckedIn(0).waiting(0).operatingVehicles(0).completedVehicles(0).build())
.callStatusTotal(0)
.operatingVehicles(0).completedVehicles(0).build())
.avgOperationDurationTrend(Collections.emptyList()) .avgOperationDurationTrend(Collections.emptyList())
.monthlyTaskStatistics(MonthlyTaskStatisticsVO.builder() .monthlyTaskStatistics(MonthlyTaskStatisticsVO.builder()
.taskTotal(0).taskTotalYoY(0).avgTaskDuration(0d).avgDurationYoY(0) .taskTotal(0).taskTotalYoY(0).avgTaskDuration(0d).avgDurationYoY(0)
@@ -206,13 +206,8 @@ public class BiReportSnapshotSyncService {
template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue()); template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue());
template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue()); template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue());
template.getVehicleStatus().setWaiting(vs.getWaiting().intValue()); template.getVehicleStatus().setWaiting(vs.getWaiting().intValue());
// 叫号状态合计已签到 + 已叫号 + 已过号一个字段表示三个状态的总数量
template.getVehicleStatus().setCallStatusTotal(vs.getCallStatusTotal() == null ? 0 : vs.getCallStatusTotal().intValue());
template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue()); template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue());
template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue()); template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue());
} }
// ====== 真实数据本月任务统计 taskTotal / avgTaskDuration / taskCompletionRate ====== // ====== 真实数据本月任务统计 taskTotal / avgTaskDuration / taskCompletionRate ======
@@ -155,13 +155,10 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
VehicleStatusVO vs = VehicleStatusVO.builder() VehicleStatusVO vs = VehicleStatusVO.builder()
.todayReservedVehicles(Math.max(0, jitterInt(Baseline.P_RESV, r))) .todayReservedVehicles(Math.max(0, jitterInt(Baseline.P_RESV, r)))
.notCheckedIn(Math.max(0, jitterInt(Baseline.P_NC, r))) .notCheckedIn(Math.max(0, jitterInt(Baseline.P_NC, r)))
.waiting(Math.max(0, jitterInt(Baseline.P_WAIT, r)))
.callStatusTotal(Math.max(0, jitterInt(Baseline.P_CALL_STATUS_TOTAL, r)))
.operatingVehicles(Math.max(0, jitterInt(Baseline.P_OPV, r))) .operatingVehicles(Math.max(0, jitterInt(Baseline.P_OPV, r)))
.completedVehicles(Math.max(0, jitterInt(Baseline.P_DONE, r))) .completedVehicles(Math.max(0, jitterInt(Baseline.P_DONE, r)))
.build(); .build();
List<AvgOperationDurationTrendItemVO> avgTrend = new ArrayList<>(); List<AvgOperationDurationTrendItemVO> avgTrend = new ArrayList<>();
for (int i = 0; i < Baseline.P_MO_LABELS.length; i++) { for (int i = 0; i < Baseline.P_MO_LABELS.length; i++) {
avgTrend.add(AvgOperationDurationTrendItemVO.builder() avgTrend.add(AvgOperationDurationTrendItemVO.builder()
@@ -407,7 +404,6 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
static final int P_RESV = 2_850; static final int P_RESV = 2_850;
static final int P_NC = 920; static final int P_NC = 920;
static final int P_WAIT = 680; static final int P_WAIT = 680;
static final int P_CALL_STATUS_TOTAL = 680;
static final int P_OPV = 1_180; static final int P_OPV = 1_180;
static final int P_DONE = 1_420; static final int P_DONE = 1_420;
static final String[] P_MO_LABELS = {"5月", "6月", "7月"}; static final String[] P_MO_LABELS = {"5月", "6月", "7月"};
@@ -23,9 +23,6 @@ public class VehicleStatusVO {
@ApiModelProperty("当前等待作业(已预约/已签到/已叫号),单位:辆") @ApiModelProperty("当前等待作业(已预约/已签到/已叫号),单位:辆")
private Integer waiting; private Integer waiting;
@ApiModelProperty("已签到+已叫号+已过号(FLOW_STATUS IN 2/3/4),单位:辆")
private Integer callStatusTotal;
@ApiModelProperty("当前作业中,单位:辆") @ApiModelProperty("当前作业中,单位:辆")
private Integer operatingVehicles; private Integer operatingVehicles;
+2 -2
View File
@@ -19,14 +19,14 @@ spring:
# username: nacos # username: nacos
# password: manhuoda@2023 # password: manhuoda@2023
#线上正式环境 #线上正式环境
server-addr: 10.102.192.31:6848 server-addr: 10.102.192.30:6848
username: nacos username: nacos
password: manhuoda@2023 password: manhuoda@2023
config: config:
# server-addr: 127.0.0.1:8848 # server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号 # 线上测试环境配置 容器名+端口号
# server-addr: 10.33.0.129:6010 # server-addr: 10.33.0.129:6010
server-addr: 10.102.192.31:6848 server-addr: 10.102.192.30:6848
username: nacos username: nacos
password: manhuoda@2023 password: manhuoda@2023
#线上正式环境 #线上正式环境
@@ -70,21 +70,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 车辆状态统计:今日的统计(按创建时间 CREATE_TIME / 流程状态) <!-- 车辆状态统计:今日的统计(按创建时间 CREATE_TIME / 流程状态)
todayReservedVehicles 改为按预约日期 TARGET_DATE(其它 3 项保持 CREATE_TIME todayReservedVehicles 改为按预约日期 TARGET_DATE(其它 3 项保持 CREATE_TIME
waiting 等待作业:FLOW_STATUS IN ('1','2','3') 已预约/已签到/已叫号 且 预约日期 = 今天 waiting 等待作业:FLOW_STATUS IN ('1','2','3') 已预约/已签到/已叫号 且 预约日期 = 今天
callStatusTotal 叫号状态合计:已签到 + 已叫号 + 已过号 = FLOW_STATUS IN ('2','3','4') 且 预约日期 = 今天
FLOW_STATUS: 1已预约 2已签到 3已叫号 4已过号 5已进场 6已称重 7已装车 8二次称重 9已结算 10已还卡 11已出场 12已取消 --> FLOW_STATUS: 1已预约 2已签到 3已叫号 4已过号 5已进场 6已称重 7已装车 8二次称重 9已结算 10已还卡 11已出场 12已取消 -->
<select id="queryVehicleStatusToday" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO"> <select id="queryVehicleStatusToday" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO">
SELECT SELECT
SUM(CASE WHEN TRUNC(TARGET_DATE) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS todayReservedVehicles, SUM(CASE WHEN TRUNC(TARGET_DATE) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS todayReservedVehicles,
SUM(CASE WHEN FLOW_STATUS = '1' AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS notCheckedIn, SUM(CASE WHEN FLOW_STATUS = '1' AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS notCheckedIn,
SUM(CASE WHEN FLOW_STATUS IN ('1','2','3') AND TRUNC(TARGET_DATE) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS waiting, SUM(CASE WHEN FLOW_STATUS IN ('1','2','3') AND TRUNC(TARGET_DATE) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS waiting,
SUM(CASE WHEN FLOW_STATUS IN ('2','3','4') AND TRUNC(TARGET_DATE) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS callStatusTotal,
SUM(CASE WHEN FLOW_STATUS IN ('5','6','7','8','9','10') AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS operatingVehicles, SUM(CASE WHEN FLOW_STATUS IN ('5','6','7','8','9','10') AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS operatingVehicles,
SUM(CASE WHEN FLOW_STATUS = '11' AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS completedVehicles SUM(CASE WHEN FLOW_STATUS = '11' AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS completedVehicles
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
</select> </select>
<!-- 本月任务量:按预约日期 TARGET_DATE(Y预约日期)统计本月预约总数量 --> <!-- 本月任务量:按预约日期 TARGET_DATE(Y预约日期)统计本月预约总数量 -->
<select id="countMonthTasks" resultType="java.lang.Long"> <select id="countMonthTasks" resultType="java.lang.Long">
SELECT COUNT(1) SELECT COUNT(1)
@@ -27,7 +27,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
// 目标地址由 nacos 配置项 feign.url.mhd-third-party-service 指定未配置时按服务名走服务发现 // 目标地址由 nacos 配置项 feign.url.mhd-third-party-service 指定未配置时按服务名走服务发现
@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31:8012", configuration = FeignAutoConfiguration.class) @FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.32:8012", configuration = FeignAutoConfiguration.class)
public interface ThirdPartyServiceFeign { public interface ThirdPartyServiceFeign {
//查询当前组织所有三方接口信息 //查询当前组织所有三方接口信息
@@ -38,13 +38,13 @@ public class XxlJobOpenApiUtil {
try { try {
Map<String, Object> formMap = BeanUtil.beanToMap(addReq); Map<String, Object> formMap = BeanUtil.beanToMap(addReq);
HttpResponse response = HttpRequest.post(url) HttpResponse response = HttpRequest.post(url)
.header("Cookie", cookie) .header("Authorization", cookie)
.form(formMap) .form(formMap)
.execute(); .execute();
int status = response.getStatus(); int status = response.getStatus();
log.info("[XxlJob] addJob status:{}", status); log.info("[XxlJob] addJob status:{}", status);
// 新增成功200重定向到列表页 // 新增成功200重定向到列表页
return status == 200; return status == 200 || status == 302;
} catch (Exception e) { } catch (Exception e) {
log.error("[XxlJob] addJob异常", e); log.error("[XxlJob] addJob异常", e);
return false; return false;
@@ -128,10 +128,10 @@ public class XxlJobOpenApiUtil {
String url = adminUrl + "/jobinfo/pause"; String url = adminUrl + "/jobinfo/pause";
try { try {
HttpResponse response = HttpRequest.post(url) HttpResponse response = HttpRequest.post(url)
.header("Cookie", cookie) .header("Authorization", cookie)
.form("id", jobId) .form("id", jobId)
.execute(); .execute();
return response.getStatus() == 200; return response.getStatus() == 200 || response.getStatus() == 302;
} catch (Exception e) { } catch (Exception e) {
log.error("[XxlJob] pauseJob jobId:{}异常", jobId, e); log.error("[XxlJob] pauseJob jobId:{}异常", jobId, e);
return false; return false;
@@ -150,10 +150,10 @@ public class XxlJobOpenApiUtil {
String url = adminUrl + "/jobinfo/start"; String url = adminUrl + "/jobinfo/start";
try { try {
HttpResponse response = HttpRequest.post(url) HttpResponse response = HttpRequest.post(url)
.header("Cookie", cookie) .header("Authorization", cookie)
.form("id", jobId) .form("id", jobId)
.execute(); .execute();
return response.getStatus() == 200; return response.getStatus() == 200 || response.getStatus() == 302;
} catch (Exception e) { } catch (Exception e) {
log.error("[XxlJob] startJob jobId:{}异常", jobId, e); log.error("[XxlJob] startJob jobId:{}异常", jobId, e);
return false; return false;
@@ -172,10 +172,10 @@ public class XxlJobOpenApiUtil {
String url = adminUrl + "/jobinfo/remove"; String url = adminUrl + "/jobinfo/remove";
try { try {
HttpResponse response = HttpRequest.post(url) HttpResponse response = HttpRequest.post(url)
.header("Cookie", cookie) .header("Authorization", cookie)
.form("id", jobId) .form("id", jobId)
.execute(); .execute();
return response.getStatus() == 200; return response.getStatus() == 200 || response.getStatus() == 302;
} catch (Exception e) { } catch (Exception e) {
log.error("[XxlJob] removeJob jobId:{}异常", jobId, e); log.error("[XxlJob] removeJob jobId:{}异常", jobId, e);
return false; return false;
@@ -33,6 +33,7 @@ import com.mhd.bms.infrastructure.constant.BillLogsConstants;
import com.mhd.bms.interfaces.assembler.billManage.BillManageAssembler; import com.mhd.bms.interfaces.assembler.billManage.BillManageAssembler;
import com.mhd.bms.interfaces.dto.billManage.BillDetailDTO; import com.mhd.bms.interfaces.dto.billManage.BillDetailDTO;
import com.mhd.bms.interfaces.dto.billManage.BillManageDTO; import com.mhd.bms.interfaces.dto.billManage.BillManageDTO;
import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO;
import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO; import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO;
import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException;
@@ -138,6 +139,74 @@ public class BillManageApplicationService {
String billNumber = billManagePO.getBillNumber(); // 获取账单编号 String billNumber = billManagePO.getBillNumber(); // 获取账单编号
// 原有 - 前端列表用不变 // 原有 - 前端列表用不变
List<BillDetail> billDetails = billDetailMapper.selectList(new LambdaQueryWrapper<BillDetail>().eq(BillDetail::getBillNumber, billNumber)); List<BillDetail> billDetails = billDetailMapper.selectList(new LambdaQueryWrapper<BillDetail>().eq(BillDetail::getBillNumber, billNumber));
BigDecimal totalTaxAmount = billDetails.stream().map(BillDetail::getTaxAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalTaxFreeFee = billDetails.stream().map(BillDetail::getTaxFreeFee).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
billManagePO.setTaxAmount(totalTaxAmount);
billManagePO.setTaxFreeFee(totalTaxFreeFee);
billManagePO.setBillDetailList(billDetails);
// 新增 - 导出用LEFT JOIN billing_statement 拿到费用科目
List<BillDetailPO> billDetailPOs = billDetailMapper.getDetailsByBillManageId(billManagePO.getBillManageId());
billManagePO.setBillDetailPOList(billDetailPOs);
}
return billManagePOS;
}
public List<BillManagePO> customerMonthlyReport(BillManageDO billManageDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long userOrganizationId = loginUser.getUserPo().getOrganizationId();
Long frontendOrganizationId = billManageDO.getOrganizationId(); // 前端传递的 organizationId
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (userOrganizationId != null && userOrganizationId == 2827L) {
// 南光组织organizationId=2827可以查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId包括2827或其他组织使用前端传递的值进行过滤
billManageDO.setOrganizationId(frontendOrganizationId);
billManageDO.setTopOrganizationId(null); // 明确设置为 null避免使用 topOrganizationId 条件
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
billManageDO.setOrganizationId(null);
billManageDO.setTopOrganizationId(null);
}
} else {
// 其他组织设置organizationId只查询当前组织的数据
// 如果前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (frontendOrganizationId != null && userOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(userOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
billManageDO.setOrganizationId(userOrganizationId);
}
// 如果前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
if (userOrganizationId != null) {
billManageDO.setOrganizationId(userOrganizationId);
}
}
// 如果 organizationId 不为 null则优先使用 organizationId不使用 topOrganizationId
if (billManageDO.getOrganizationId() == null) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1) {
billManageDO.setTopOrganizationId(topOrganizationId);
}
} else {
// 对于非2827组织必须设置 topOrganizationId=2827
billManageDO.setTopOrganizationId(2827L);
}
}
}
List<BillManagePO> billManagePOS = billManageDomainService.customerMonthlyReport(billManageDO);
for (BillManagePO billManagePO : billManagePOS) {
String billNumber = billManagePO.getBillNumber(); // 获取账单编号
// 原有 - 前端列表用不变
List<BillDetail> billDetails = billDetailMapper.selectList(new LambdaQueryWrapper<BillDetail>().eq(BillDetail::getBillNumber, billNumber));
BigDecimal totalTaxAmount = billDetails.stream().map(BillDetail::getTaxAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalTaxFreeFee = billDetails.stream().map(BillDetail::getTaxFreeFee).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
billManagePO.setTaxAmount(totalTaxAmount);
billManagePO.setTaxFreeFee(totalTaxFreeFee);
billManagePO.setBillDetailList(billDetails); billManagePO.setBillDetailList(billDetails);
// 新增 - 导出用LEFT JOIN billing_statement 拿到费用科目 // 新增 - 导出用LEFT JOIN billing_statement 拿到费用科目
List<BillDetailPO> billDetailPOs = billDetailMapper.getDetailsByBillManageId(billManagePO.getBillManageId()); List<BillDetailPO> billDetailPOs = billDetailMapper.getDetailsByBillManageId(billManagePO.getBillManageId());
@@ -184,6 +253,10 @@ public class BillManageApplicationService {
return billManageDomainService.save(billingStatementDTO); return billManageDomainService.save(billingStatementDTO);
} }
public Boolean saveBillJob(BillingStatementDTO billingStatementDTO) {
return billManageDomainService.saveJob(billingStatementDTO);
}
/** /**
* 批量删除账单管理 * 批量删除账单管理
*/ */
@@ -287,6 +360,28 @@ public class BillManageApplicationService {
return billManageDomainService.confirmBilling(billManageDO); return billManageDomainService.confirmBilling(billManageDO);
} }
@Transactional
public Boolean confirmBillingJob(BillManageDTO billManageDTO) {
//确认账单未收款状态之前都可以进行确认账单跳过核账流程直接到未收款状态
if(!StringUtils.isNotEmpty(billManageDTO.getBillManageIds())){
throw new ServiceException("账单管理ids不能为空");
}
//校验
Set<String> billManageIds = Stream.of(billManageDTO.getBillManageIds().split(",")).collect(Collectors.toSet());
BillManageDO billManageDO = new BillManageDO();
billManageDO.setBillManageIdSet(billManageIds);
List<BillManagePO> billManageList = billManageDomainService.queryList(billManageDO);
for (BillManagePO billManage : billManageList) {
if(billManage.getBillState() > 2){
throw new ServiceException("选中数据"+ billManage.getBillNumber() + "状态不可操作确认账单");
}
}
billManageDO.setOrganizationId(billManageDTO.getOrganizationId());
billManageDO.setOrganizationName(billManageDTO.getOrganizationName());
billManageDO.setTopOrganizationId(billManageDTO.getTopOrganizationId());
return billManageDomainService.confirmBillingJob(billManageDO);
}
public int editIsInvoice(String billNumber, Integer isInvoice, String invoiceId, String invoiceMakeTime,String applyNumber) public int editIsInvoice(String billNumber, Integer isInvoice, String invoiceId, String invoiceMakeTime,String applyNumber)
{ {
@@ -621,6 +716,22 @@ public class BillManageApplicationService {
return originalBill; return originalBill;
} }
/**
* 应收账单-红冲
*/
@Transactional
public Boolean redFlushBill(BillManageDTO billManageDTO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
if (StringUtils.isEmpty(billManageDTO.getBillManageIds())) {
throw new ServiceException("账单id不能为空");
}
return billManageDomainService.redFlushBill(billManageDTO);
}
/** /**
* 应收账单-客户确认 * 应收账单-客户确认
*/ */
@@ -872,5 +983,66 @@ public class BillManageApplicationService {
return flag && flagTwo; return flag && flagTwo;
} }
/**
* 客户每月账单分组查询
*/
public List<CustomerMonthBillVO> queryCustomerMonthBillList(BillManageDO billManageDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long userOrganizationId = loginUser.getUserPo().getOrganizationId();
Long frontendOrganizationId = billManageDO.getOrganizationId();
if (userOrganizationId != null && userOrganizationId == 2827L) {
if (frontendOrganizationId != null) {
billManageDO.setOrganizationId(frontendOrganizationId);
billManageDO.setTopOrganizationId(null);
} else {
billManageDO.setOrganizationId(null);
billManageDO.setTopOrganizationId(null);
}
} else {
if (frontendOrganizationId != null && userOrganizationId != null) {
if (!frontendOrganizationId.equals(userOrganizationId)) {
billManageDO.setOrganizationId(userOrganizationId);
}
} else {
if (userOrganizationId != null) {
billManageDO.setOrganizationId(userOrganizationId);
}
}
if (billManageDO.getOrganizationId() == null) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1) {
billManageDO.setTopOrganizationId(topOrganizationId);
}
} else {
billManageDO.setTopOrganizationId(2827L);
}
}
}
List<CustomerMonthBillVO> list = billManageDomainService.queryCustomerMonthBillList(billManageDO);
// 计算付款状态
for (CustomerMonthBillVO vo : list) {
BigDecimal totalAmount = vo.getTotalBillAmount() != null ? vo.getTotalBillAmount() : BigDecimal.ZERO;
BigDecimal settledAmount = vo.getTotalSettledAmount() != null ? vo.getTotalSettledAmount() : BigDecimal.ZERO;
if (totalAmount.compareTo(BigDecimal.ZERO) == 0) {
vo.setPaymentStatus(3);
vo.setPaymentStatusName("已付款");
} else if (settledAmount.compareTo(BigDecimal.ZERO) == 0) {
vo.setPaymentStatus(1);
vo.setPaymentStatusName("未付款");
} else if (settledAmount.compareTo(totalAmount) >= 0) {
vo.setPaymentStatus(3);
vo.setPaymentStatusName("已付款");
} else {
vo.setPaymentStatus(2);
vo.setPaymentStatusName("部分付款");
}
}
return list;
}
} }
@@ -147,6 +147,25 @@ public class ReceiptManageApplicationService {
} }
/**
* 撤销收款
*/
@Transactional
public Boolean cancelCollection(ReceiptManageDO receiptManageDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
return receiptManageDomainService.cancelCollection(receiptManageDO);
}
/**
* 撤销收款-查询账单涉及的收款单id用于加锁防止并发撤销时收款单金额重算冲突
*/
public Set<Long> queryCancelCollectionReceiptManageIds(String billManageIds) {
return receiptManageDomainService.queryReceiptManageIdsByBillManageIds(billManageIds);
}
/** /**
* 退款 * 退款
*/ */
@@ -575,6 +575,8 @@ public class ReportFormApplicationService {
//收款单 //收款单
QueryWrapper<ReceiptManage> queryWrapper = new QueryWrapper<>(); QueryWrapper<ReceiptManage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("top_organization_id", loginUser.getUserPo().getTopOrganizationId()); queryWrapper.eq("top_organization_id", loginUser.getUserPo().getTopOrganizationId());
//过滤已撤销逻辑删除的收款单
queryWrapper.eq("del_flag", 1);
for (int i = 0; i < formQueryParamsList.size(); i++) { for (int i = 0; i < formQueryParamsList.size(); i++) {
FormQueryParams formQueryParams = formQueryParamsList.get(i); FormQueryParams formQueryParams = formQueryParamsList.get(i);
FormQueryParams beforeFormQueryParams = null; FormQueryParams beforeFormQueryParams = null;
@@ -47,8 +47,8 @@ public class BillManage extends BaseVOEntity{
@Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付")
private Integer billType; private Integer billType;
@ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
@Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
private Integer billState; private Integer billState;
@ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)")
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.bms.domain.billManage.entity.BillManage; import com.mhd.bms.domain.billManage.entity.BillManage;
import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.po.BillManagePO;
import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO;
import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO;
import java.util.List; import java.util.List;
@@ -20,6 +21,14 @@ public interface IBillManageService extends IService<BillManage>
*/ */
public List<BillManagePO> queryList(BillManageDO billManageDO); public List<BillManagePO> queryList(BillManageDO billManageDO);
public List<BillManagePO> customerMonthlyReport(BillManageDO billManageDO);
/**
* 客户每月账单分组查询
*/
public List<CustomerMonthBillVO> queryCustomerMonthBillList(BillManageDO billManageDO);
/** /**
* 新增账单管理 * 新增账单管理
*/ */
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.bms.domain.billManage.entity.BillManage; import com.mhd.bms.domain.billManage.entity.BillManage;
import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.po.BillManagePO;
import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO;
import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
/** /**
* 账单管理Mapper接口 * 账单管理Mapper接口
@@ -19,6 +20,13 @@ public interface BillManageMapper extends BaseMapper<BillManage>
*/ */
public List<BillManagePO> queryList(@Param("billManageDO") BillManageDO billManageDO); public List<BillManagePO> queryList(@Param("billManageDO") BillManageDO billManageDO);
public List<BillManagePO> customerMonthlyReport(@Param("billManageDO") BillManageDO billManageDO);
/**
* 客户每月账单分组查询
*/
public List<CustomerMonthBillVO> queryCustomerMonthBillList(@Param("billManageDO") BillManageDO billManageDO);
String getInvoiceItemName(@Param("invoiceItemId") String invoiceItemId); String getInvoiceItemName(@Param("invoiceItemId") String invoiceItemId);
String getInvoiceItemNcCode(@Param("invoiceItemId") String invoiceItemId); String getInvoiceItemNcCode(@Param("invoiceItemId") String invoiceItemId);
@@ -31,6 +31,7 @@ import com.mhd.bms.domain.settlementCustomers.entity.SettlementCustomers;
import com.mhd.bms.domain.settlementCustomers.repository.facade.ISettlementCustomersService; import com.mhd.bms.domain.settlementCustomers.repository.facade.ISettlementCustomersService;
import com.mhd.bms.interfaces.dto.billManage.BillDetailDTO; import com.mhd.bms.interfaces.dto.billManage.BillDetailDTO;
import com.mhd.bms.interfaces.dto.billManage.BillManageDTO; import com.mhd.bms.interfaces.dto.billManage.BillManageDTO;
import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO;
import com.mhd.common.core.domain.dto.ReconciliationDTO; import com.mhd.common.core.domain.dto.ReconciliationDTO;
import com.mhd.common.core.domain.dto.nc.*; import com.mhd.common.core.domain.dto.nc.*;
import com.mhd.common.core.domain.entity.R; import com.mhd.common.core.domain.entity.R;
@@ -126,6 +127,14 @@ public class BillManageImpl extends ServiceImpl<BillManageMapper, BillManage> im
return billManageMapper.queryList(billManageDO); return billManageMapper.queryList(billManageDO);
} }
@Override
public List<BillManagePO> customerMonthlyReport(BillManageDO billManageDO)
{
return billManageMapper.customerMonthlyReport(billManageDO);
}
/** /**
* 新增账单管理 * 新增账单管理
*/ */
@@ -1504,4 +1513,9 @@ public class BillManageImpl extends ServiceImpl<BillManageMapper, BillManage> im
return 0; return 0;
} }
@Override
public List<CustomerMonthBillVO> queryCustomerMonthBillList(BillManageDO billManageDO) {
return billManageMapper.queryCustomerMonthBillList(billManageDO);
}
} }
@@ -2,6 +2,7 @@ package com.mhd.bms.domain.billManage.repository.po;
import com.mhd.bms.domain.billManage.entity.BillDetail; import com.mhd.bms.domain.billManage.entity.BillDetail;
import com.mhd.bms.domain.billingStatement.repository.po.BillingStatementPO; import com.mhd.bms.domain.billingStatement.repository.po.BillingStatementPO;
import com.mhd.bms.domain.receiptManage.entity.ReceiptDetail;
import com.mhd.common.core.annotation.Excel; import com.mhd.common.core.annotation.Excel;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
@@ -52,8 +53,8 @@ public class BillManagePO extends BaseVOEntity{
@Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付")
private Integer billType; private Integer billType;
@ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
@Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
private Integer billState; private Integer billState;
@ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)")
@@ -262,9 +263,12 @@ public class BillManagePO extends BaseVOEntity{
@ApiModelProperty("收款帐户名称") @ApiModelProperty("收款帐户名称")
private String paymentAccountName; private String paymentAccountName;
private List<BillDetail> billDetailList; private List<BillDetail> billDetailList;
private List<ReceiptDetail> receiptDetailList;
@ApiModelProperty("最近收款时间") @ApiModelProperty("最近收款时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@Excel(name = "最近收款时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @Excel(name = "最近收款时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date collectionTime; private Date collectionTime;
@ApiModelProperty("合同编码")
private String contractNumbers;
} }
@@ -47,8 +47,8 @@ public class BillManageDO extends BaseVOEntity{
@Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付")
private Integer billType; private Integer billType;
@ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
@Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
private Integer billState; private Integer billState;
@ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)")
@@ -266,4 +266,7 @@ public class BillManageDO extends BaseVOEntity{
private String paymentAccountName; private String paymentAccountName;
@ApiModelProperty("业务员ID") @ApiModelProperty("业务员ID")
private String salesmanId; private String salesmanId;
@ApiModelProperty("账单月份(yyyy-MM,按创建时间月份筛选,用于客户月账单分组查询)")
private String billMonth;
} }
@@ -12,7 +12,9 @@ import com.mhd.bms.domain.billManage.repository.facade.IBillManageService;
import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.po.BillManagePO;
import com.mhd.bms.domain.billManage.repository.todo.BillDetailDO; import com.mhd.bms.domain.billManage.repository.todo.BillDetailDO;
import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO;
import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO;
import com.mhd.bms.domain.billOperationLog.entity.BillOperationLog; import com.mhd.bms.domain.billOperationLog.entity.BillOperationLog;
import com.mhd.bms.domain.billOperationLog.repository.po.BillOperationLogPO;
import com.mhd.bms.domain.billOperationLog.repository.todo.BillOperationLogDO; import com.mhd.bms.domain.billOperationLog.repository.todo.BillOperationLogDO;
import com.mhd.bms.domain.billOperationLog.service.BillOperationLogDomainService; import com.mhd.bms.domain.billOperationLog.service.BillOperationLogDomainService;
import com.mhd.bms.domain.billingStatement.entity.BillingStatement; import com.mhd.bms.domain.billingStatement.entity.BillingStatement;
@@ -44,6 +46,7 @@ import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.model.LoginUser; import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -85,6 +88,10 @@ public class BillManageDomainService {
return billManageService.queryList(billManageDO); return billManageService.queryList(billManageDO);
} }
public List<BillManagePO> customerMonthlyReport(BillManageDO billManageDO) {
return billManageService.customerMonthlyReport(billManageDO);
}
/** /**
* 新增账单管理 * 新增账单管理
@@ -233,6 +240,124 @@ public class BillManageDomainService {
return flag && flagTwo && three; return flag && flagTwo && three;
} }
public Boolean saveBillJob(List<BillingStatementPO> billingStatementPOS,String billingRemark,Date billCreateTime,BillingStatementDTO billingStatementDTO) {
// LoginUser loginUser = SecurityUtils.getLoginUser();
// if (ObjectUtil.isNull(loginUser)) {
//// throw new DigitalLogisticsException(UserError.TIMEOUT);
// }
BigDecimal taxAmount = billingStatementDTO.getTaxAmount(); // 获取税额
Double taxRate = billingStatementDTO.getTaxRate(); // 获取税率
BigDecimal taxFreeFee = billingStatementDTO.getTaxFreeFee(); // 获取税免金额
String settlementCurrency = billingStatementDTO.getSettlementCurrency(); // 获取结算币种
BillManage billManage = new BillManage();
billManage.setTaxAmount(taxAmount);
billManage.setTaxRate(taxRate);
billManage.setTaxFreeFee(taxFreeFee);
billManage.setSettlementCurrency(settlementCurrency);
// billManage.setCreateBy(loginUser.getUserPo().getUserId());
// billManage.setCreateByName(loginUser.getUserPo().getUserName());
billManage.setCreateTime(billCreateTime==null ? new Date():billCreateTime);
billManage.setDelFlag(1);
billManage.setBillNumber(OrderSequence.getOrderCode("ZD"));
billManage.setTopOrganizationId(billingStatementDTO.getTopOrganizationId());
billManage.setOrganizationId(billingStatementDTO.getOrganizationId());
billManage.setOrganizationName(billingStatementDTO.getOrganizationName());
billManage.setBillType(billingStatementPOS.get(0).getAccountExpenseType());
billManage.setBelongModule(billingStatementPOS.get(0).getBelongModule());
billManage.setBelongModuleCode(billingStatementPOS.get(0).getBelongModuleCode());
billManage.setSettlementCustomersId(billingStatementPOS.get(0).getSettlementCustomersId());
billManage.setSettlementEntity(billingStatementPOS.get(0).getSettlementEntity());
billManage.setSettlementCustomersCode(billingStatementPOS.get(0).getSettlementCustomersCode());
billManage.setSalesmanId(billingStatementPOS.get(0).getSalesmanId());
billManage.setSalesmanName(billingStatementPOS.get(0).getSalesmanName());
billManage.setPaymentAccountId(billingStatementPOS.get(0).getPaymentAccountId());
billManage.setPaymentAccountName(billingStatementPOS.get(0).getPaymentAccountName());
billManage.setBillRemark(billingRemark);
//查询结算对象信息
SettlementCustomersPO settlementCustomersPO = settlementCustomersDomainService.getInfo(billingStatementPOS.get(0).getSettlementCustomersId());
if(null == settlementCustomersPO){
throw new ServiceException("结算对象信息未找到");
}
billManage.setSettlementMethod(settlementCustomersPO.getSettlementMethod());
billManage.setSettlementMethodCode(settlementCustomersPO.getSettlementMethodCode());
// if(settlementCustomersPO.getMainRole()==1){
// billManage.setBillType(1);
// }else {
// billManage.setBillType(2);
// }
//计算所有流水列表中的最早周期开始时间和晚周期结束时间
List<Date> cycleBeginTimeSet = billingStatementPOS.stream().map(BillingStatementPO::getCycleBeginTime).collect(Collectors.toList());
List<Date> cycleEndTimeSet = billingStatementPOS.stream().map(BillingStatementPO::getCycleEndTime).collect(Collectors.toList());
cycleBeginTimeSet.removeIf(Objects::isNull);
cycleEndTimeSet.removeIf(Objects::isNull);
if(cycleBeginTimeSet.size()>0){
billManage.setCycleBeginTime(Collections.min(cycleBeginTimeSet));
}
if(cycleEndTimeSet.size()>0){
billManage.setCycleEndTime(Collections.max(cycleEndTimeSet));
}
//将所有的流水金额相加
billManage.setBillTotalAmount(billingStatementPOS.stream().map(BillingStatementPO::getBillingAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
billManage.setBillAmount(billManage.getBillTotalAmount());
billManage.setBillAmountUnsettled(billManage.getBillTotalAmount());
boolean flag = billManageService.save(billManage);
billingStatementDTO.setBillManageId(billManage.getBillManageId());
List<BillDetail> billDetailList = new ArrayList<>();
for (BillingStatementPO billingStatementPO : billingStatementPOS) {
//生成对账单详情
BillDetail billDetail = new BillDetail();
billDetail.setTopOrganizationId(billingStatementPO.getTopOrganizationId());
billDetail.setOrganizationId(billingStatementPO.getOrganizationId());
billDetail.setOrganizationName(billingStatementPO.getOrganizationName());
billDetail.setCreateBy(billManage.getCreateBy());
billDetail.setCreateByName(billManage.getCreateByName());
billDetail.setCreateTime(billManage.getCreateTime());
billDetail.setBillManageId(billManage.getBillManageId());
billDetail.setBillNumber(billManage.getBillNumber());
billDetail.setBillingStatementId(billingStatementPO.getBillingStatementId());
billDetail.setBillingFlow(billingStatementPO.getBillingFlow());
billDetail.setBillingTotalAmount(billingStatementPO.getBillingAmount());
billDetail.setBillingAmount(billingStatementPO.getBillingAmount());
billDetail.setBillType(billingStatementPO.getAccountExpenseType());
billDetail.setTaxAmount(billingStatementPO.getTaxAmount());
billDetail.setTaxRate(billingStatementPO.getTaxRate());
billDetail.setTaxFreeFee(billingStatementPO.getTaxFreeFee());
billDetail.setSettlementCurrency(billingStatementPO.getSettlementCurrency());
billDetail.setFeeType(billingStatementPO.getFeeType());
billDetail.setInvoiceItem(billingStatementPO.getInvoiceItem());
billDetail.setInvoiceItemName(billingStatementPO.getInvoiceItemName());
billDetailList.add(billDetail);
}
boolean flagTwo = billDetailDomainService.insertBatch(billDetailList);
//保存账单操作记录
BillOperationLogDO billOperationLogDO = new BillOperationLogDO();
billOperationLogDO.setBillManageId(billManage.getBillManageId());
billOperationLogDO.setOperationInfo(StringUtils.format(BillLogsConstants.create_bill_text, billManage.getBillNumber(), billManage.getBillTotalAmount()));
billOperationLogDO.setOperationType(1);
billOperationLogDO.setCreateByName(billManage.getCreateByName());
billOperationLogDO.setUpdateByName(billManage.getUpdateByName());
billOperationLogDO.setCreateTime(new Date());
billOperationLogDO.setUpdateTime(new Date());
billOperationLogDO.setDelFlag(1);
billOperationLogDO.setCreateBy(billManage.getCreateBy());
billOperationLogDO.setUpdateBy(billManage.getUpdateBy());
billOperationLogDO.setTopOrganizationId(billManage.getTopOrganizationId());
billOperationLogDO.setOrganizationId(billManage.getOrganizationId());
billOperationLogDO.setOrganizationName(billManage.getOrganizationName());
boolean three = billOperationLogDomainService.saveBillOperationLogJob(billOperationLogDO);
//修改流水记录
/*billingStatementDTO.getBillingStatementList().forEach(billingStatementADDVO -> {
billingStatementMapper.update(null,
new LambdaUpdateWrapper<BillingStatement>().set(BillingStatement::getTaxAmount,billingStatementADDVO.getTaxAmount())
.set(BillingStatement::getTaxRate,billingStatementADDVO.getTaxRate())
.set(BillingStatement::getTaxFreeFee,billingStatementADDVO.getTaxFreeFee())
.set(BillingStatement::getSettlementCurrency,billingStatementADDVO.getSettlementCurrency())
.eq(BillingStatement::getBillingStatementId,billingStatementADDVO.getBillingStatementId()));
});*/
return flag && flagTwo && three;
}
/** /**
* 保存账单 * 保存账单
* @param billingStatementDTO * @param billingStatementDTO
@@ -296,6 +421,64 @@ public class BillManageDomainService {
return saveBill(distinctList,billingStatementDTO.getBillingRemark(),billingStatementDTO.getBillCreateTime(),billingStatementDTO); return saveBill(distinctList,billingStatementDTO.getBillingRemark(),billingStatementDTO.getBillCreateTime(),billingStatementDTO);
} }
public Boolean saveJob(BillingStatementDTO billingStatementDTO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
// throw new DigitalLogisticsException(UserError.TIMEOUT);
}
//根据前端传的流水id查询计费流水信息列表
Set<String> billingSet = Stream.of(billingStatementDTO.getBillingStatementIds().split(",")).collect(Collectors.toSet());
BillingStatementDO billingStatementDO = new BillingStatementDO();
billingStatementDO.setBillingStatementIdSet(billingSet);
List<BillingStatementPO> billingStatementPOS = billingStatementDomainService.queryList(billingStatementDO);
//获取最新一条的业务员信息
String salesmanId = null;
String salesmanName = null;
if (billingStatementPOS != null && !billingStatementPOS.isEmpty()) {
billingStatementPOS.sort((a, b) -> {
if (a.getCreateTime() == null && b.getCreateTime() == null) return 0;
if (a.getCreateTime() == null) return 1;
if (b.getCreateTime() == null) return -1;
return b.getCreateTime().compareTo(a.getCreateTime());
});
salesmanId = billingStatementPOS.get(0).getSalesmanId();
salesmanName = billingStatementPOS.get(0).getSalesmanName();
}
List<BillingStatementADDVO> billingStatementList = billingStatementDTO.getBillingStatementList();
for (BillingStatementPO billingStatementPO : billingStatementPOS) {
String billingStatementId = billingStatementPO.getBillingStatementId() == null ? "" : String.valueOf(billingStatementPO.getBillingStatementId());
BillingStatementADDVO billingStatementADDVO = billingStatementList.stream().filter(billingStatementADDVO1 -> billingStatementADDVO1.getBillingStatementId().contains(billingStatementId)).findFirst().orElse(null);
billingStatementPO.setTaxAmount(billingStatementADDVO.getTaxAmount()); // 设置税额
billingStatementPO.setTaxRate(billingStatementADDVO.getTaxRate()); // 设置税率
billingStatementPO.setTaxFreeFee(billingStatementADDVO.getTaxFreeFee()); // 设置税免金额
billingStatementPO.setSettlementCurrency(billingStatementADDVO.getSettlementCurrency());//设置结算币种
billingStatementPO.setFeeType(billingStatementADDVO.getFeeType());
billingStatementPO.setInvoiceItem(billingStatementADDVO.getInvoiceItem());
billingStatementPO.setInvoiceItemName(billingStatementADDVO.getInvoiceItemName());
billingStatementPO.setBillingAmount(billingStatementADDVO.getBillingAmount());
billingStatementPO.setBillingStatementIdStr(billingStatementADDVO.getBillingStatementId());
if (salesmanName != null && !salesmanName.isEmpty() && salesmanId != null && !salesmanId.isEmpty()) {
billingStatementPO.setSalesmanId(salesmanId);
billingStatementPO.setSalesmanName(salesmanName);
}
}
List<BillingStatementPO> distinctList = billingStatementPOS.stream()
.filter(Objects::nonNull)
.collect(Collectors.toMap(
BillingStatementPO::getBillingStatementIdStr, // key去重字段
po -> po, // value对象本身
(existing, replacement) -> existing // 重复时保留第一个
))
.values()
.stream().collect(Collectors.toList());
if(billingStatementPOS==null || billingStatementPOS.size()==0){
throw new ServiceException("所选流水信息未找到");
}
return saveBillJob(distinctList,billingStatementDTO.getBillingRemark(),billingStatementDTO.getBillCreateTime(),billingStatementDTO);
}
public List<BillManage> queryListLambda(LambdaQueryWrapper<BillManage> queryWrapper) { public List<BillManage> queryListLambda(LambdaQueryWrapper<BillManage> queryWrapper) {
return billManageService.list(queryWrapper); return billManageService.list(queryWrapper);
@@ -378,6 +561,32 @@ public class BillManageDomainService {
return flag && three; return flag && three;
} }
public Boolean confirmBillingJob(BillManageDO billManageDO) {
//直接修改状态到未收款3状态
// LoginUser loginUser = SecurityUtils.getLoginUser();
// if (ObjectUtil.isNull(loginUser)) {
// throw new DigitalLogisticsException(UserError.TIMEOUT);
// }
LambdaUpdateWrapper<BillManage> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(BillManage::getBillManageId,billManageDO.getBillManageIdSet())
.set(BillManage::getBillStep,4)
.set(BillManage::getBillState,3)
// .set(BillManage::getUpdateBy,loginUser.getUserPo().getUserId())
// .set(BillManage::getUpdateByName,loginUser.getUserPo().getUserName())
.set(BillManage::getUpdateTime,new Date());
boolean flag = billManageService.update(updateWrapper);
//保存账单操作记录
BillOperationLogDO billOperationLogDO = new BillOperationLogDO();
billOperationLogDO.setBillManageIdSet(billManageDO.getBillManageIdSet());
billOperationLogDO.setOperationInfo(BillLogsConstants.confirm_bill_text);
billOperationLogDO.setOperationType(3);
billOperationLogDO.setOrganizationId(billManageDO.getOrganizationId());
billOperationLogDO.setOrganizationName(billManageDO.getOrganizationName());
billOperationLogDO.setTopOrganizationId(billManageDO.getTopOrganizationId());
boolean three = billOperationLogDomainService.saveBillOperationLogBatchJob(billOperationLogDO);
return flag && three;
}
public int editIsInvoice(String billNumber, Integer isInvoice, String invoiceId, String invoiceMakeTime,String applyNumber) public int editIsInvoice(String billNumber, Integer isInvoice, String invoiceId, String invoiceMakeTime,String applyNumber)
{ {
@@ -504,6 +713,261 @@ public class BillManageDomainService {
} }
/**
* 撤销收款账单恢复为收款为0状态并保存撤销收款操作日志
*/
public Boolean cancelCollectionInfo(List<ReceiptDetail> receiptDetails) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
//按账单分组收款明细一个账单可能对应多个收款单
Map<Long, List<ReceiptDetail>> billDetailMap = receiptDetails.stream().collect(Collectors.groupingBy(ReceiptDetail::getBillManageId));
LambdaQueryWrapper<BillManage> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(BillManage::getBillManageId,billDetailMap.keySet());
List<BillManage> billManageList = billManageService.list(queryWrapper);
if(billManageList == null || billManageList.size()==0){
throw new ServiceException("账单信息未找到");
}
List<BillManage> billManageListSave = new ArrayList<>();
List<BillOperationLog> billOperationLogSave = new ArrayList<>();
for (BillManage billManage : billManageList) {
List<ReceiptDetail> receiptDetailList = billDetailMap.get(billManage.getBillManageId());
if(null == receiptDetailList || receiptDetailList.size() == 0){
continue;
}
BillManage billManageSave = new BillManage();
billManageSave.setBillManageId(billManage.getBillManageId());
//账单恢复为收款为0状态
billManageSave.setBillAmountSettlement(BigDecimal.ZERO);
billManageSave.setBillAmountUnsettled(billManage.getBillAmount());
billManageSave.setActualReceivedAmount(BigDecimal.ZERO);
billManageSave.setSettlementDiscountsAmount(BigDecimal.ZERO);
billManageSave.setBillState(3);
billManageSave.setUpdateBy(loginUser.getUserPo().getUserId());
billManageSave.setUpdateByName(loginUser.getUserPo().getUserName());
billManageSave.setUpdateTime(new Date());
billManageListSave.add(billManageSave);
//汇总该账单本次撤销的收款金额与收款单号
BigDecimal collectedDiscount = receiptDetailList.stream().map(info -> info.getCollectedDiscount() == null ? BigDecimal.ZERO : info.getCollectedDiscount()).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal collectedAmount = receiptDetailList.stream().map(info -> info.getCollectedAmount() == null ? BigDecimal.ZERO : info.getCollectedAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal all = collectedAmount.add(collectedDiscount);
String collectionNums = receiptDetailList.stream().map(ReceiptDetail::getCollectionNum).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining(","));
//保存账单操作记录
BillOperationLog billOperationLog = new BillOperationLog();
billOperationLog.setBillManageId(billManage.getBillManageId());
billOperationLog.setOperationInfo(StringUtils.format(BillLogsConstants.cancel_collection_bill_text,collectionNums,all,collectedAmount,collectedDiscount));
billOperationLog.setOperationType(12);
billOperationLog.setDelFlag(1);
billOperationLogSave.add(billOperationLog);
}
Boolean three = billOperationLogDomainService.insertBatch(billOperationLogSave);
Boolean flag = billManageService.updateBatchById(billManageListSave);
return flag && three;
}
/**
* 应收账单红冲生成金额为负数的红冲账单对冲原账单不操作收款单等数据支持批量
*/
public Boolean redFlushBill(BillManageDTO billManageDTO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
if (StringUtils.isEmpty(billManageDTO.getBillManageIds())) {
throw new ServiceException("账单id不能为空");
}
Set<Long> billManageIdSet = Stream.of(billManageDTO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).map(Long::valueOf).collect(Collectors.toSet());
if (billManageIdSet.size() == 0) {
throw new ServiceException("账单id不能为空");
}
//查询账单信息
LambdaQueryWrapper<BillManage> queryWrapperBill = new LambdaQueryWrapper<>();
queryWrapperBill.in(BillManage::getBillManageId, billManageIdSet);
queryWrapperBill.eq(BillManage::getDelFlag, 1);
List<BillManage> billManageList = billManageService.list(queryWrapperBill);
if (null == billManageList || billManageList.size() == 0) {
throw new ServiceException("账单信息未找到");
}
if (billManageList.size() != billManageIdSet.size()) {
throw new ServiceException("部分账单信息未找到,请刷新后重试");
}
//逐个账单红冲任一账单校验不通过时事务整体回滚
Boolean flag = true;
for (BillManage originalBill : billManageList) {
flag = redFlushSingleBill(originalBill, billManageDTO.getRedFlushRemark(), loginUser) && flag;
}
return flag;
}
/**
* 红冲单个账单生成金额为负数的红冲账单对冲原账单同步镜像计费流水与账单明细
*/
private Boolean redFlushSingleBill(BillManage originalBill, String redFlushRemark, LoginUser loginUser) {
if (ObjectUtil.equal(originalBill.getBillType(), 2)) {
throw new ServiceException("账单" + originalBill.getBillNumber() + "为付款账单,仅支持应收账单红冲");
}
if (!ObjectUtil.equal(originalBill.getBillState(), 5)) {
throw new ServiceException("账单" + originalBill.getBillNumber() + "不是已收款状态,仅已收款状态的账单可以红冲,请刷新后重试");
}
//校验账单是否已红冲避免重复生成红冲账单
BillOperationLogDO redFlushLogQuery = new BillOperationLogDO();
redFlushLogQuery.setBillManageId(originalBill.getBillManageId());
redFlushLogQuery.setOperationType(13);
List<BillOperationLogPO> redFlushLogList = billOperationLogDomainService.queryList(redFlushLogQuery);
if (null != redFlushLogList && redFlushLogList.stream().anyMatch(info -> ObjectUtil.equal(info.getDelFlag(), 1))) {
throw new ServiceException("账单" + originalBill.getBillNumber() + "已红冲,不能重复红冲");
}
//生成红冲账单编号
String billNumber = OrderSequence.getOrderCode("ZD");
BigDecimal redFlushAmount = negateAmount(originalBill.getBillAmount());
//构建红冲账单金额全部取负对冲原账单
BillManage redBill = new BillManage();
BeanUtils.copyProperties(originalBill, redBill);
redBill.setBillManageId(null);
redBill.setBillNumber(billNumber);
redBill.setBillAmount(redFlushAmount);
redBill.setBillTotalAmount(negateAmount(originalBill.getBillTotalAmount()));
redBill.setBillDiscountAmount(negateAmount(originalBill.getBillDiscountAmount()));
redBill.setBillAmountSettlement(negateAmount(originalBill.getBillAmountSettlement()));
redBill.setBillAmountUnsettled(BigDecimal.ZERO);
redBill.setActualReceivedAmount(negateAmount(originalBill.getActualReceivedAmount()));
redBill.setSettlementDiscountsAmount(negateAmount(originalBill.getSettlementDiscountsAmount()));
redBill.setTaxAmount(negateAmount(originalBill.getTaxAmount()));
redBill.setTaxFreeFee(negateAmount(originalBill.getTaxFreeFee()));
//红冲账单状态为红冲已核对无误
redBill.setBillState(8);
redBill.setBillStep(4);
redBill.setReconciliationStatus(4);
redBill.setSettlementTime(new Date());
//重置对账审核开票同步等状态红冲账单不需要再走这些流程
redBill.setBillExpectedAmount(null);
redBill.setReconciliationOpinion(null);
redBill.setVoucherAddress(null);
redBill.setFinancialReviewFlag(null);
redBill.setFinancialReviewOpinion(null);
redBill.setIsInvoice(0);
redBill.setInvoiceId(null);
redBill.setInvoiceMakeTime(null);
redBill.setApplyNumber(null);
redBill.setSynchronousStatus(0);
redBill.setSynchronousTime(null);
redBill.setNcId(null);
redBill.setSkSynchronousStatus(0);
redBill.setSkSynchronousTime(null);
redBill.setSkNcId(null);
//红冲原因写入账单备注
String billRemark = "红冲原账单编号:" + originalBill.getBillNumber();
if (StringUtils.isNotEmpty(redFlushRemark)) {
billRemark = billRemark + ",红冲原因:" + redFlushRemark;
}
redBill.setBillRemark(billRemark);
redBill.setDelFlag(1);
redBill.setCreateBy(loginUser.getUserid());
redBill.setCreateByName(loginUser.getUserPo().getUserName());
redBill.setCreateTime(new Date());
redBill.setUpdateBy(loginUser.getUserid());
redBill.setUpdateByName(loginUser.getUserPo().getUserName());
redBill.setUpdateTime(new Date());
Boolean flag = billManageService.save(redBill);
if (!flag || null == redBill.getBillManageId()) {
throw new ServiceException("生成红冲账单失败");
}
//镜像红冲计费流水金额取负并记录原流水id与新流水的映射
Map<Long, BillingStatementDO> statementMapping = new HashMap<>();
List<BillingStatementPO> originalStatementList = billingStatementDomainService.getDetailsByManageId(originalBill.getBillManageId());
if (null != originalStatementList && originalStatementList.size() > 0) {
for (BillingStatementPO originalStatement : originalStatementList) {
BillingStatementDO redStatement = new BillingStatementDO();
BeanUtils.copyProperties(originalStatement, redStatement);
redStatement.setBillingStatementId(null);
redStatement.setBillManageId(redBill.getBillManageId());
redStatement.setBillingFlow(OrderSequence.getOrderCode("JFLS"));
redStatement.setBillingAmount(negateAmount(originalStatement.getBillingAmount()));
redStatement.setTaxAmount(negateAmount(originalStatement.getTaxAmount()));
redStatement.setTaxFreeFee(negateAmount(originalStatement.getTaxFreeFee()));
redStatement.setBillingState(3);
redStatement.setRedFlushState(1);
redStatement.setRedFlushRemark("红冲自计费流水:" + originalStatement.getBillingFlow());
redStatement.setReviewRemarks(null);
redStatement.setBusinessDocumentId(null);
redStatement.setDelFlag(1);
redStatement.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
redStatement.setOrganizationId(loginUser.getUserPo().getOrganizationId());
redStatement.setOrganizationName(loginUser.getUserPo().getOrganizationName());
redStatement.setCreateBy(loginUser.getUserid());
redStatement.setCreateByName(loginUser.getUserPo().getUserName());
redStatement.setCreateTime(new Date());
redStatement.setUpdateBy(loginUser.getUserid());
redStatement.setUpdateByName(loginUser.getUserPo().getUserName());
redStatement.setUpdateTime(new Date());
redStatement.setBillingStatementId(billingStatementDomainService.insertAndReturnId(redStatement));
statementMapping.put(originalStatement.getBillingStatementId(), redStatement);
}
}
//镜像红冲账单明细金额取负并关联新计费流水
Boolean flagTwo = true;
LambdaQueryWrapper<BillDetail> detailQueryWrapper = new LambdaQueryWrapper<>();
detailQueryWrapper.eq(BillDetail::getBillManageId, originalBill.getBillManageId());
detailQueryWrapper.eq(BillDetail::getDelFlag, 1);
List<BillDetail> originalDetailList = billDetailDomainService.queryByLambda(detailQueryWrapper);
if (null != originalDetailList && originalDetailList.size() > 0) {
List<BillDetail> redDetailList = new ArrayList<>();
for (BillDetail originalDetail : originalDetailList) {
BillDetail redDetail = new BillDetail();
BeanUtils.copyProperties(originalDetail, redDetail);
redDetail.setBillDetailId(null);
redDetail.setBillManageId(redBill.getBillManageId());
redDetail.setBillNumber(billNumber);
redDetail.setBillingTotalAmount(negateAmount(originalDetail.getBillingTotalAmount()));
redDetail.setBillingAmount(negateAmount(originalDetail.getBillingAmount()));
redDetail.setBillingDiscountAmount(negateAmount(originalDetail.getBillingDiscountAmount()));
redDetail.setTaxAmount(negateAmount(originalDetail.getTaxAmount()));
redDetail.setTaxFreeFee(negateAmount(originalDetail.getTaxFreeFee()));
redDetail.setBillingExpectedAmount(null);
BillingStatementDO redStatement = statementMapping.get(originalDetail.getBillingStatementId());
if (null != redStatement) {
redDetail.setBillingStatementId(redStatement.getBillingStatementId());
redDetail.setBillingFlow(redStatement.getBillingFlow());
} else {
redDetail.setBillingStatementId(null);
redDetail.setBillingFlow(null);
}
redDetail.setDelFlag(1);
redDetail.setCreateBy(loginUser.getUserid());
redDetail.setCreateByName(loginUser.getUserPo().getUserName());
redDetail.setCreateTime(new Date());
redDetail.setUpdateBy(loginUser.getUserid());
redDetail.setUpdateByName(loginUser.getUserPo().getUserName());
redDetail.setUpdateTime(new Date());
redDetailList.add(redDetail);
}
flagTwo = billDetailDomainService.insertBatch(redDetailList);
}
//红冲账单保存创建账单操作日志
BillOperationLogDO redBillLog = new BillOperationLogDO();
redBillLog.setBillManageId(redBill.getBillManageId());
redBillLog.setOperationInfo(StringUtils.format(BillLogsConstants.create_bill_text, billNumber, redFlushAmount));
redBillLog.setOperationType(1);
Boolean flagThree = billOperationLogDomainService.saveBillOperationLog(redBillLog);
//原账单保存红冲操作日志
BillOperationLogDO originalBillLog = new BillOperationLogDO();
originalBillLog.setBillManageId(originalBill.getBillManageId());
originalBillLog.setOperationInfo(StringUtils.format(BillLogsConstants.red_flush_bill_text, billNumber, null == redFlushAmount ? BigDecimal.ZERO : redFlushAmount.abs()));
originalBillLog.setOperationType(13);
Boolean flagFour = billOperationLogDomainService.saveBillOperationLog(originalBillLog);
return flag && flagTwo && flagThree && flagFour;
}
/**
* 金额取负空值返回null
*/
private BigDecimal negateAmount(BigDecimal amount) {
return null == amount ? null : amount.negate();
}
/** /**
* 更改账单状态付款 * 更改账单状态付款
*/ */
@@ -600,4 +1064,11 @@ public class BillManageDomainService {
{ {
return billManageService.synchronousNcSK(businessDocumentDetaliIds); return billManageService.synchronousNcSK(businessDocumentDetaliIds);
} }
/**
* 客户每月账单分组查询
*/
public List<CustomerMonthBillVO> queryCustomerMonthBillList(BillManageDO billManageDO) {
return billManageService.queryCustomerMonthBillList(billManageDO);
}
} }
@@ -42,8 +42,8 @@ public class BillOperationLog extends BaseVOEntity{
@Excel(name = "账单管理id") @Excel(name = "账单管理id")
private Long billManageId; private Long billManageId;
@ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
@Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
private Integer operationType; private Integer operationType;
@ApiModelProperty("操作信息") @ApiModelProperty("操作信息")
@@ -41,8 +41,8 @@ public class BillOperationLogPO extends BaseVOEntity{
@Excel(name = "账单管理id") @Excel(name = "账单管理id")
private Long billManageId; private Long billManageId;
@ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
@Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
private Integer operationType; private Integer operationType;
@ApiModelProperty("操作信息") @ApiModelProperty("操作信息")
@@ -42,8 +42,8 @@ public class BillOperationLogDO extends BaseVOEntity{
@Excel(name = "账单管理id") @Excel(name = "账单管理id")
private Long billManageId; private Long billManageId;
@ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
@Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
private Integer operationType; private Integer operationType;
@ApiModelProperty("操作信息") @ApiModelProperty("操作信息")
@@ -95,6 +95,12 @@ public class BillOperationLogDomainService {
return billOperationLogService.insert(billOperationLogDO); return billOperationLogService.insert(billOperationLogDO);
} }
public Boolean saveBillOperationLogJob(BillOperationLogDO billOperationLogDO) {
billOperationLogDO.setDelFlag(1);
return billOperationLogService.insert(billOperationLogDO);
}
/** /**
* 批量保存操作日志 * 批量保存操作日志
@@ -133,6 +139,40 @@ public class BillOperationLogDomainService {
return billOperationLogService.saveBatch(saveList); return billOperationLogService.saveBatch(saveList);
} }
public Boolean saveBillOperationLogBatchJob(BillOperationLogDO billOperationLogDO) {
// LoginUser loginUser = SecurityUtils.getLoginUser();
// if (ObjectUtil.isNull(loginUser)) {
// throw new DigitalLogisticsException(UserError.TIMEOUT);
// }
if(billOperationLogDO.getBillManageIdSet()==null || billOperationLogDO.getBillManageIdSet().size()==0){
throw new ServiceException("账单集合不能为空");
}
// String userName = loginUser.getUserPo().getUserName();
// // 获取登录人id
// Long userId = loginUser.getUserid();
BillOperationLogDO common = new BillOperationLogDO();
// common.setCreateByName(userName);
// common.setUpdateByName(userName);
common.setCreateTime(new Date());
common.setUpdateTime(new Date());
common.setDelFlag(1);
// common.setCreateBy(userId);
// common.setUpdateBy(userId);
// common.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
// common.setOrganizationId(loginUser.getUserPo().getOrganizationId());
// common.setOrganizationName(loginUser.getUserPo().getOrganizationName());
common.setOperationType(billOperationLogDO.getOperationType());
common.setOperationInfo(billOperationLogDO.getOperationInfo());
List<BillOperationLog> saveList = new ArrayList<>();
for (String billManageId : billOperationLogDO.getBillManageIdSet()) {
BillOperationLog save = new BillOperationLog();
BeanUtils.copyProperties(common, save);
save.setBillManageId(Long.valueOf(billManageId));
saveList.add(save);
}
return billOperationLogService.saveBatch(saveList);
}
/** /**
* 批量保存数据 * 批量保存数据
@@ -171,6 +171,48 @@ public class BillingStatementDomainService {
return billingStatementService.updateBatchById(billingStatements); return billingStatementService.updateBatchById(billingStatements);
} }
public Boolean reviewBillingJob(BillingStatementDTO billingStatementDTO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
// throw new DigitalLogisticsException(UserError.TIMEOUT);
}
List<BillingStatement> billingStatements = new ArrayList<>();
Set<String> billingSet = Stream.of(billingStatementDTO.getBillingStatementIds().split(",")).collect(Collectors.toSet());
for (String billingId : billingSet) {
Long billingStatementId = Long.valueOf(billingId);
BillingStatementPO billingStatementPO = billingStatementService.getInfo(billingStatementId);
if(null == billingStatementPO){
throw new ServiceException("流水不存在");
}
if(billingStatementPO.getBillingState()!=1){
throw new ServiceException("该计费流水状态不为待审核,不能进行审核");
}
if(billingStatementPO.getRedFlushState()==2){
throw new ServiceException("计费流水"+ billingStatementPO.getBillingFlow() +"已红冲,不能进行审核");
}
BillingStatement billingStatement = new BillingStatement();
billingStatement.setBillingStatementId(billingStatementId);
billingStatement.setReviewRemarks(billingStatementDTO.getReviewRemarks());
if(billingStatementDTO.getAuditOperation()==1){
//审核通过
billingStatement.setBillingState(2);
}else {
//审核不通过
billingStatement.setBillingState(4);
//计费流水审核不通过时修改业务单据中的状态到已生效
BusinessDocumentDO businessDocumentDO = new BusinessDocumentDO();
businessDocumentDO.setBusinessDocumentId(billingStatementPO.getBusinessDocumentId());
businessDocumentDO.setBusinessState(2);
businessDocumentService.update(businessDocumentDO);
}
billingStatement.setUpdateTime(new Date());
// billingStatement.setUpdateBy(loginUser.getUserPo().getUserId());
// billingStatement.setUpdateByName(loginUser.getUserPo().getUserName());
billingStatements.add(billingStatement);
}
return billingStatementService.updateBatchById(billingStatements);
}
/** /**
* 批量红冲 * 批量红冲
@@ -299,6 +341,45 @@ public class BillingStatementDomainService {
return update; return update;
} }
public Boolean updateBillingStateJob(BillingStatementDTO billingStatementDTO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
// throw new DigitalLogisticsException(UserError.TIMEOUT);
}
Set<String> billingSet = Stream.of(billingStatementDTO.getBillingStatementIds().split(",")).collect(Collectors.toSet());
LambdaUpdateWrapper<BillingStatement> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(BillingStatement::getBillingStatementId,billingSet);
updateWrapper.set(BillingStatement::getBillingState,billingStatementDTO.getBillingState());
// updateWrapper.set(BillingStatement::getUpdateBy,loginUser.getUserPo().getUserId());
updateWrapper.set(BillingStatement::getUpdateTime,new Date());
// updateWrapper.set(BillingStatement::getUpdateByName,loginUser.getUserPo().getUserName());
updateWrapper.set(BillingStatement::getBillManageId,billingStatementDTO.getBillManageId());
boolean update = billingStatementService.update(updateWrapper);
List<BillingStatementADDVO> billingStatementList = billingStatementDTO.getBillingStatementList();
for (BillingStatementADDVO billingStatementADDVO : billingStatementList) {
String billingStatementIds = billingStatementADDVO.getBillingStatementId();
Set<String> billings = Stream.of(billingStatementIds.split(",")).collect(Collectors.toSet());
if (billings != null && billings.size() > 0) {
for (String billing : billings) {
Long billingStatementId = Long.valueOf(billing);
Double taxRate = billingStatementADDVO.getTaxRate();
BillingStatement billingStatement = billingStatementService.getById(billingStatementId);
if (billingStatement != null) {
BigDecimal billingAmount = billingStatement.getBillingAmount();
BigDecimal taxAmount = billingAmount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))),10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal taxFreeFee = billingAmount.subtract(taxAmount);
billingStatement.setTaxAmount(taxAmount);
billingStatement.setTaxFreeFee(taxFreeFee);
billingStatement.setTaxRate(taxRate);
billingStatementService.updateById(billingStatement);
}
}
}
}
return update;
}
public Boolean nullifyByIds(BillingStatementDTO billingStatementDTO) { public Boolean nullifyByIds(BillingStatementDTO billingStatementDTO) {
LoginUser loginUser = SecurityUtils.getLoginUser(); LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -26,6 +26,8 @@ public interface IBmsInvoiceListService extends IService<BmsInvoiceList> {
void addReceivableBill(BmsInvoiceListAddDTO tmsInvoiceListAddDTO); void addReceivableBill(BmsInvoiceListAddDTO tmsInvoiceListAddDTO);
void addReceivableBillJob(BmsInvoiceListAddDTO tmsInvoiceListAddDTO);
void update(BmsInvoiceListDTO tmsInvoiceListDTO); void update(BmsInvoiceListDTO tmsInvoiceListDTO);
int delete(List<String> ids); int delete(List<String> ids);
@@ -188,6 +188,76 @@ public class BmsInvoiceListServiceImpl extends ServiceImpl<BmsInvoiceListMapper,
} }
} }
// BillManage billManage = billManageMapper.selectById(bmsInvoiceListAddDTO.getBillManageId());
// if (billManage != null) {
// billManage.setIsInvoice(1);
// billManage.setInvoiceId(bmsInvoiceList.getId().toString());
// billManage.setApplyNumber(bmsInvoiceList.getApplyNumber());
// billManageMapper.updateById(billManage);
// }
List<Long> billManageIds = bmsInvoiceListAddDTO.getBillManageIds();
if (billManageIds != null && billManageIds.size() > 0){
} else {
billManageIds = new ArrayList<>();
billManageIds.add(bmsInvoiceListAddDTO.getBillManageId());
}
List<BillManage> billManages = billManageMapper.selectList(new LambdaQueryWrapper<BillManage>().in(BillManage::getBillManageId, billManageIds));
if (billManages != null && billManages.size() > 0) {
for (BillManage billManage : billManages) {
billManage.setIsInvoice(1);
billManage.setInvoiceId(bmsInvoiceList.getId().toString());
billManage.setApplyNumber(bmsInvoiceList.getApplyNumber());
billManageMapper.updateById(billManage);
}
}
/*AjaxResult ajaxResult = financeServiceFeign.editIsInvoice(transportationId,1,bmsInvoiceList.getId(),"",bmsInvoiceList.getApplyNumber());
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new com.mhd.common.core.exception.ServiceException(ajaxResult.get("msg").toString());
}*/
}
@Transactional
@Override
public void addReceivableBillJob(BmsInvoiceListAddDTO bmsInvoiceListAddDTO) {
//获取登录人
// WlhyLoginUser sysUser = SecurityUtils.getLoginUser().getWlhyLoginUser();
// if (null == sysUser) {
// throw new ServiceException("sysUser是空值!");
// }
/*if (StringUtils.isEmpty(bmsInvoiceListAddDTO.getInvoiceTitle())){
throw new ServiceException("发票抬头不能为空!");
}*/
bmsInvoiceListAddDTO.setInvoiceValue(bmsInvoiceListAddDTO.getBillAmount());
BmsInvoiceList bmsInvoiceList = new BmsInvoiceList(); // 销项发票表
BeanUtils.copyProperties(bmsInvoiceListAddDTO, bmsInvoiceList);
// String createBy = sysUser.getId(); // 创建人ID
if(StringUtils.isNotBlank(bmsInvoiceListAddDTO.getCompanyName())){
bmsInvoiceList.setShipperName(bmsInvoiceListAddDTO.getCompanyName());
bmsInvoiceList.setCompanyName(bmsInvoiceListAddDTO.getCompanyName());
}
// 保存销项发票表数据
Long listId = saveBmsInvoiceListJob(bmsInvoiceList, bmsInvoiceListAddDTO, null, null);
//预保存发票明细信息
if(ObjectUtil.isNotNull(listId)){
List<BmsMakeOutInvoice> bmsMakeOutInvoices = bmsInvoiceListAddDTO.getBmsMakeOutInvoices();
if (ObjectUtil.isNotNull(bmsMakeOutInvoices) && bmsMakeOutInvoices.size() > 0) {
for (BmsMakeOutInvoice bmsMakeOutInvoice : bmsMakeOutInvoices) {
bmsMakeOutInvoice.setInvoiceId(listId);
//bmsMakeOutInvoice.setCreateBy(sysUser.getId());
bmsMakeOutInvoice.setCreateTime(new Date());
bmsMakeOutInvoiceMapper.insert(bmsMakeOutInvoice);
for (BmsMakeOutInvoiceItem bmsMakeOutInvoiceItem : bmsMakeOutInvoice.getBmsMakeOutInvoiceItems()) {
bmsMakeOutInvoiceItem.setMakeId(bmsMakeOutInvoice.getId());
//bmsMakeOutInvoiceItem.setCreateBy(sysUser.getId());
bmsMakeOutInvoiceItem.setCreateTime(new Date());
bmsMakeOutInvoiceItemMapper.insert(bmsMakeOutInvoiceItem);
}
}
}
}
// BillManage billManage = billManageMapper.selectById(bmsInvoiceListAddDTO.getBillManageId()); // BillManage billManage = billManageMapper.selectById(bmsInvoiceListAddDTO.getBillManageId());
// if (billManage != null) { // if (billManage != null) {
// billManage.setIsInvoice(1); // billManage.setIsInvoice(1);
@@ -932,4 +1002,43 @@ public class BmsInvoiceListServiceImpl extends ServiceImpl<BmsInvoiceListMapper,
} }
return null; return null;
} }
public Long saveBmsInvoiceListJob(BmsInvoiceList bmsInvoiceList, BmsInvoiceListAddDTO bmsInvoiceListAddDTO, WlhyLoginUser sysUser, String createBy){
bmsInvoiceList.setReceivingAddressId(bmsInvoiceListAddDTO.getReceivingAddressId());
//bmsInvoiceList.setCreateBy(createBy);
bmsInvoiceList.setApplyNumber(OrderSequence.getOrderCode("XF"));
bmsInvoiceList.setCreateTime(new Date());
bmsInvoiceList.setInvoiceApplyTime(new Date());
// bmsInvoiceList.setApplicantId(sysUser.getId());
// bmsInvoiceList.setRealCreateBy(sysUser.getId());
// bmsInvoiceList.setRealCreateName(sysUser.getRealname());
bmsInvoiceList.setCompanyName(bmsInvoiceListAddDTO.getSettlementEntity());
// 设置组织相关字段从当前登录用户获取组织信息
// LoginUser loginUser = SecurityUtils.getLoginUser();
// if (loginUser != null && loginUser.getUserPo() != null) {
// // 设置组织ID
// if (loginUser.getUserPo().getOrganizationId() != null) {
// bmsInvoiceList.setOrganizationId(loginUser.getUserPo().getOrganizationId());
// }
// // 设置组织名称
// if (StringUtils.isNotBlank(loginUser.getUserPo().getOrganizationName())) {
// bmsInvoiceList.setOrganizationName(loginUser.getUserPo().getOrganizationName());
// }
// // 设置一级组织ID
// if (loginUser.getUserPo().getTopOrganizationId() != null) {
// bmsInvoiceList.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
// }
// }
boolean saveSuccess = this.save(bmsInvoiceList);
// 3. 插入成功后直接从实体对象获取ID已被MyBatis-Plus自动赋值
if (saveSuccess) {
Long id = bmsInvoiceList.getId();
System.out.println("插入成功,生成的ID" + id);
return id;
}
return null;
}
} }
@@ -79,5 +79,19 @@ public class BmsInvoiceListAddDTO implements Serializable {
@ApiModelProperty(value = "对账单id列表") @ApiModelProperty(value = "对账单id列表")
@Excel(name = "对账单id列表", width = 15) @Excel(name = "对账单id列表", width = 15)
private List<Long> billManageIds; private List<Long> billManageIds;
/**组织ID*/
@ApiModelProperty(value = "组织ID")
@Excel(name = "组织ID", width = 15)
private Long organizationId;
/**组织名称*/
@ApiModelProperty(value = "组织名称")
@Excel(name = "组织名称", width = 15)
private String organizationName;
/**一级组织ID*/
@ApiModelProperty(value = "一级组织ID")
@Excel(name = "一级组织ID", width = 15)
private Long topOrganizationId;
} }
@@ -1,16 +1,22 @@
package com.mhd.bms.domain.receiptManage.service; package com.mhd.bms.domain.receiptManage.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import cn.hutool.core.util.ObjectUtil;
import com.mhd.bms.domain.receiptManage.entity.ReceiptDetail; import com.mhd.bms.domain.receiptManage.entity.ReceiptDetail;
import com.mhd.bms.domain.receiptManage.repository.facade.IReceiptDetailService; import com.mhd.bms.domain.receiptManage.repository.facade.IReceiptDetailService;
import com.mhd.bms.domain.receiptManage.repository.po.ReceiptDetailPO; import com.mhd.bms.domain.receiptManage.repository.po.ReceiptDetailPO;
import com.mhd.bms.domain.receiptManage.repository.todo.ReceiptDetailDO; import com.mhd.bms.domain.receiptManage.repository.todo.ReceiptDetailDO;
import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException;
import com.mhd.common.core.exception.digitalLogisticsException.UserError;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -95,6 +101,28 @@ public class ReceiptDetailDomainService {
public List<ReceiptDetail> queryListByIdSet(Set<Long> orderIdSet) { public List<ReceiptDetail> queryListByIdSet(Set<Long> orderIdSet) {
LambdaQueryWrapper<ReceiptDetail> queryWrapperDetail = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ReceiptDetail> queryWrapperDetail = new LambdaQueryWrapper<>();
queryWrapperDetail.in(ReceiptDetail::getReceiptManageId, orderIdSet); queryWrapperDetail.in(ReceiptDetail::getReceiptManageId, orderIdSet);
queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1);
return receiptDetailService.list(queryWrapperDetail); return receiptDetailService.list(queryWrapperDetail);
} }
/**
* 撤销收款批量逻辑删除收款明细
*/
public Boolean cancelCollectionDetails(List<ReceiptDetail> receiptDetails) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
List<ReceiptDetail> receiptDetailSaveList = new ArrayList<>();
for (ReceiptDetail receiptDetail : receiptDetails) {
ReceiptDetail receiptDetailSave = new ReceiptDetail();
receiptDetailSave.setReceiptDetailId(receiptDetail.getReceiptDetailId());
receiptDetailSave.setDelFlag(2);
receiptDetailSave.setUpdateBy(loginUser.getUserPo().getUserId());
receiptDetailSave.setUpdateByName(loginUser.getUserPo().getUserName());
receiptDetailSave.setUpdateTime(new Date());
receiptDetailSaveList.add(receiptDetailSave);
}
return receiptDetailService.updateBatchById(receiptDetailSaveList);
}
} }
@@ -42,7 +42,9 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -300,6 +302,132 @@ public class ReceiptManageDomainService {
return flag && flagTwo && flagThree; return flag && flagTwo && flagThree;
} }
/**
* 撤销收款
*/
public Boolean cancelCollection(ReceiptManageDO receiptManageDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
if (StringUtils.isEmpty(receiptManageDO.getBillManageIds())) {
throw new ServiceException("撤销账单不能为空");
}
Set<Long> billManageIdSet = Stream.of(receiptManageDO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).map(Long::valueOf).collect(Collectors.toSet());
if (billManageIdSet.size() == 0) {
throw new ServiceException("撤销账单不能为空");
}
//查询账单信息
LambdaQueryWrapper<BillManage> queryWrapperBill = new LambdaQueryWrapper<>();
queryWrapperBill.in(BillManage::getBillManageId, billManageIdSet);
queryWrapperBill.eq(BillManage::getDelFlag, 1);
List<BillManage> billManageList = billManageDomainService.queryListLambda(queryWrapperBill);
if (null == billManageList || billManageList.size() == 0) {
throw new ServiceException("账单信息未找到");
}
if (billManageList.size() != billManageIdSet.size()) {
throw new ServiceException("部分账单信息未找到,请刷新后重试");
}
//查询账单的全部有效收款明细一个账单可能对应多个收款单
LambdaQueryWrapper<ReceiptDetail> queryWrapperDetail = new LambdaQueryWrapper<>();
queryWrapperDetail.in(ReceiptDetail::getBillManageId, billManageIdSet);
queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1);
List<ReceiptDetail> receiptDetails = receiptDetailDomainService.queryListByLambda(queryWrapperDetail);
if (null == receiptDetails || receiptDetails.size() == 0) {
throw new ServiceException("账单收款记录不存在或已撤销,请刷新后重试");
}
//校验每个账单都有收款记录
Map<Long, List<ReceiptDetail>> billDetailMap = receiptDetails.stream().collect(Collectors.groupingBy(ReceiptDetail::getBillManageId));
for (BillManage billManage : billManageList) {
if (!billDetailMap.containsKey(billManage.getBillManageId())) {
throw new ServiceException("账单" + billManage.getBillNumber() + "收款记录不存在或已撤销,请刷新后重试");
}
}
//校验收款单退款状态已退款的收款单不能撤销收款
Set<Long> receiptManageIdSet = receiptDetails.stream().map(ReceiptDetail::getReceiptManageId).collect(Collectors.toSet());
LambdaQueryWrapper<ReceiptManage> queryWrapperManage = new LambdaQueryWrapper<>();
queryWrapperManage.in(ReceiptManage::getReceiptManageId, receiptManageIdSet);
List<ReceiptManage> receiptManageList = receiptManageService.list(queryWrapperManage);
if (null != receiptManageList) {
ReceiptManage refundManage = receiptManageList.stream().filter(info -> ObjectUtil.equal(info.getPaymentStatus(), 2)).findAny().orElse(null);
if (null != refundManage) {
throw new ServiceException("收款单" + refundManage.getCollectionNum() + "已退款,无法撤销收款");
}
}
//账单恢复为收款为0状态并保存撤销收款操作日志
Boolean flagTwo = billManageDomainService.cancelCollectionInfo(receiptDetails);
//逻辑删除收款明细
Boolean flag = receiptDetailDomainService.cancelCollectionDetails(receiptDetails);
//按剩余明细重新计算涉及的收款单金额明细已全部撤销时逻辑删除收款单
Boolean flagThree = true;
for (Long receiptManageId : receiptManageIdSet) {
flagThree = updateReceiptManageByCancel(receiptManageId) && flagThree;
}
return flag && flagTwo && flagThree;
}
/**
* 撤销收款后重新计算收款单信息收款明细已全部撤销时逻辑删除收款单
*/
private Boolean updateReceiptManageByCancel(Long receiptManageId) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
//查询收款单下剩余未撤销的收款明细
LambdaQueryWrapper<ReceiptDetail> queryWrapperDetail = new LambdaQueryWrapper<>();
queryWrapperDetail.eq(ReceiptDetail::getReceiptManageId, receiptManageId);
queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1);
List<ReceiptDetail> receiptDetailList = receiptDetailDomainService.queryListByLambda(queryWrapperDetail);
ReceiptManage receiptManageSave = new ReceiptManage();
receiptManageSave.setReceiptManageId(receiptManageId);
receiptManageSave.setUpdateBy(loginUser.getUserPo().getUserId());
receiptManageSave.setUpdateByName(loginUser.getUserPo().getUserName());
receiptManageSave.setUpdateTime(new Date());
if (null == receiptDetailList || receiptDetailList.size() == 0) {
//收款明细已全部撤销逻辑删除收款单
receiptManageSave.setDelFlag(2);
return receiptManageService.updateById(receiptManageSave);
}
//按剩余明细重新计算收款单金额
BigDecimal billAmount = receiptDetailList.stream().map(ReceiptDetail::getBillAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal collectedDiscount = receiptDetailList.stream().map(ReceiptDetail::getCollectedDiscount).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal collectedAmount = receiptDetailList.stream().map(ReceiptDetail::getCollectedAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal uncollectedAmount = receiptDetailList.stream().map(ReceiptDetail::getBillAmountUnsettledResidue).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal billAmountUnsettled = receiptDetailList.stream().map(ReceiptDetail::getBillAmountUnsettled).reduce(BigDecimal.ZERO, BigDecimal::add);
receiptManageSave.setBillAmount(billAmount);
receiptManageSave.setCollectedDiscount(collectedDiscount);
receiptManageSave.setCollectedAmount(collectedAmount);
receiptManageSave.setUncollectedAmount(uncollectedAmount);
receiptManageSave.setBillAmountUnsettled(billAmountUnsettled);
//账单金额 = 已收金额 + 剩余未收金额 + 收款优惠金额 + 收款金额
receiptManageSave.setBillAmountSettlement(billAmount.subtract(uncollectedAmount).subtract(collectedDiscount).subtract(collectedAmount));
return receiptManageService.updateById(receiptManageSave);
}
/**
* 撤销收款-查询账单涉及的收款单id用于加锁防止并发撤销时收款单金额重算冲突
*/
public Set<Long> queryReceiptManageIdsByBillManageIds(String billManageIds) {
Set<Long> receiptManageIdSet = new HashSet<>();
if (StringUtils.isEmpty(billManageIds)) {
return receiptManageIdSet;
}
Set<Long> billManageIdSet = Stream.of(billManageIds.split(",")).filter(StringUtils::isNotEmpty).map(String::trim).map(Long::valueOf).collect(Collectors.toSet());
if (billManageIdSet.size() == 0) {
return receiptManageIdSet;
}
LambdaQueryWrapper<ReceiptDetail> queryWrapperDetail = new LambdaQueryWrapper<>();
queryWrapperDetail.in(ReceiptDetail::getBillManageId, billManageIdSet);
queryWrapperDetail.eq(ReceiptDetail::getDelFlag, 1);
List<ReceiptDetail> receiptDetails = receiptDetailDomainService.queryListByLambda(queryWrapperDetail);
if (null == receiptDetails || receiptDetails.size() == 0) {
return receiptManageIdSet;
}
receiptDetails.forEach(receiptDetail -> receiptManageIdSet.add(receiptDetail.getReceiptManageId()));
return receiptManageIdSet;
}
/** /**
* 查询收款单详情 * 查询收款单详情
*/ */
@@ -88,6 +88,14 @@ public class BillLogsConstants
public static final String refund_bill_text = "退款单号:{},退款金额:{}元"; public static final String refund_bill_text = "退款单号:{},退款金额:{}元";
/**
* 撤销收款
* 收款单号{}撤销收款金额{}实收{}优惠{}
*/
public static final String cancel_collection_bill_title = "撤销收款";
public static final String cancel_collection_bill_text = "收款单号:{},撤销收款金额:{}元(实收{}元,优惠{}元)";
/** /**
* 付款 * 付款
* 付款单号{}付款金额{} * 付款单号{}付款金额{}
@@ -104,4 +112,11 @@ public class BillLogsConstants
public static final String copy_bill_text = "原账单编号:{},新账单编号:{}"; public static final String copy_bill_text = "原账单编号:{},新账单编号:{}";
/**
* 红冲账单
* 红冲账单编号{}红冲金额{}
*/
public static final String red_flush_bill_title = "红冲账单";
public static final String red_flush_bill_text = "红冲账单编号:{},红冲金额:{}元";
} }
@@ -47,8 +47,8 @@ public class BillManageDTO extends BaseVOEntity{
@Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付")
private Integer billType; private Integer billType;
@ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款)") @ApiModelProperty("账单状态(1-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
@Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
private Integer billState; private Integer billState;
@ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)") @ApiModelProperty("账单流程节点(1-发起对账,2-客户确认,3-财务审核,4-收款/付款)")
@@ -276,4 +276,11 @@ public class BillManageDTO extends BaseVOEntity{
private String paymentAccountId; private String paymentAccountId;
@ApiModelProperty("收款帐户名称") @ApiModelProperty("收款帐户名称")
private String paymentAccountName; private String paymentAccountName;
@ApiModelProperty("账单月份(yyyy-MM,按创建时间月份筛选,用于客户月账单分组查询)")
private String billMonth;
@ApiModelProperty("红冲原因")
@Excel(name = "红冲原因")
private String redFlushRemark;
} }
@@ -28,7 +28,7 @@ public class BillManageExportVO {
@Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付") @Excel(name = "账单类型", readConverterExp = "1=-应收,2-应付")
private Integer billType; private Integer billType;
@Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款") @Excel(name = "账单状态", readConverterExp = "1=-未确认,2-对账中,3-未收款/付款,4-部分收款/付款,5-已收款/付款,6-已作废,7-已退款,8-红冲")
private Integer billState; private Integer billState;
@Excel(name = "账单流程节点", readConverterExp = "1=-发起对账,2-客户确认,3-财务审核,4-收款/付款") @Excel(name = "账单流程节点", readConverterExp = "1=-发起对账,2-客户确认,3-财务审核,4-收款/付款")
@@ -0,0 +1,65 @@
package com.mhd.bms.interfaces.dto.billManage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "客户月账单VO", description = "客户每月账单分组统计信息")
public class CustomerMonthBillVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("结算对象id")
private Long settlementCustomersId;
@ApiModelProperty("结算对象code")
private String settlementCustomersCode;
@ApiModelProperty("结算对象/客户名称")
private String settlementEntity;
@ApiModelProperty("结算主体id")
private Long settlementEntityId;
@ApiModelProperty("结算主体")
private String settlementEntityName;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@ApiModelProperty("账单月份(yyyy-MM")
private String billMonth;
@ApiModelProperty("账单总金额合计")
private BigDecimal totalBillAmount;
@ApiModelProperty("已收金额合计")
private BigDecimal totalSettledAmount;
@ApiModelProperty("未收金额合计")
private BigDecimal totalUnsettledAmount;
@ApiModelProperty("账单数量")
private Integer billCount;
@ApiModelProperty("付款状态(1-未付款,2-部分付款,3-已付款)")
private Integer paymentStatus;
@ApiModelProperty("付款状态名称")
private String paymentStatusName;
@ApiModelProperty("应收账单id列表(逗号拼接)")
private String billManageIds;
@ApiModelProperty("结算方式")
private String settlementMethod;
@ApiModelProperty("默认结算币种")
private String settlementCurrency;
}
@@ -40,8 +40,8 @@ public class BillOperationLogDTO extends BaseVOEntity{
@Excel(name = "账单管理id") @Excel(name = "账单管理id")
private Long billManageId; private Long billManageId;
@ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款)") @ApiModelProperty("操作类型(1-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
@Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款") @Excel(name = "操作类型", readConverterExp = "1=-创建账单,2-调整账单,3-确认账单,4-发起对账,5-客户确认,6-财务审核,7-收款,8-作废账单,9-删除账单,10-退款,11-付款,12-撤销收款,13-红冲")
private Integer operationType; private Integer operationType;
@ApiModelProperty("操作信息") @ApiModelProperty("操作信息")
@@ -3,6 +3,7 @@ package com.mhd.bms.interfaces.facadeApi;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.math.BigDecimal;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -17,6 +18,7 @@ import com.mhd.bms.infrastructure.utils.UniqueKeyUtil;
import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO; import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO;
import com.mhd.bms.interfaces.dto.billManage.BillManageExportVO; import com.mhd.bms.interfaces.dto.billManage.BillManageExportVO;
import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.common.core.utils.poi.ExcelUtil;
import com.mhd.common.log.annotation.Log; import com.mhd.common.log.annotation.Log;
import com.mhd.common.log.enums.BusinessType; import com.mhd.common.log.enums.BusinessType;
@@ -31,9 +33,17 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.mhd.bms.interfaces.dto.billManage.BillManageDTO; import com.mhd.bms.interfaces.dto.billManage.BillManageDTO;
import com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO;
import com.mhd.bms.domain.billManage.repository.todo.BillManageDO; import com.mhd.bms.domain.billManage.repository.todo.BillManageDO;
import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.po.BillManagePO;
import com.mhd.bms.interfaces.assembler.billManage.BillManageAssembler; import com.mhd.bms.interfaces.assembler.billManage.BillManageAssembler;
import com.mhd.bms.domain.receiptManage.service.ReceiptDetailDomainService;
import com.mhd.bms.domain.receiptManage.entity.ReceiptDetail;
import com.mhd.bms.domain.receiptManage.entity.ReceiptManage;
import com.mhd.bms.domain.receiptManage.repository.facade.IReceiptManageService;
import com.mhd.bms.domain.receiptManage.repository.po.ReceiptManagePO;
import com.mhd.bms.domain.receiptManage.repository.po.ReceiptDetailPO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.controller.BaseController;
@@ -54,6 +64,10 @@ public class BillManageApi extends BaseController{
private BillManageApplicationService billManageApplicationService; private BillManageApplicationService billManageApplicationService;
@Autowired @Autowired
private RedisLock redisLock; private RedisLock redisLock;
@Autowired
private ReceiptDetailDomainService receiptDetailDomainService;
@Autowired
private IReceiptManageService receiptManageService;
/** /**
* 分页查询账单管理列表 * 分页查询账单管理列表
@@ -84,6 +98,171 @@ public class BillManageApi extends BaseController{
return AjaxResult.success(billManageApplicationService.listCount(billManageDO)); return AjaxResult.success(billManageApplicationService.listCount(billManageDO));
} }
/**
* 客户每月账单分组列表应收
*/
@ApiOperation("客户每月账单分组列表")
@GetMapping("/receivableCustomerMonthList")
public TableDataInfo receivableCustomerMonthList(BillManageDTO billManageDTO)
{
BillManageDO billManageDO = new BillManageDO();
BeanUtils.copyProperties(billManageDTO, billManageDO);
billManageDO.setBillType(1);
startPage();
List<CustomerMonthBillVO> list = billManageApplicationService.queryCustomerMonthBillList(billManageDO);
return getDataTable(list);
}
/**
* 客户每月账单分组列表统计应收
*/
@ApiOperation("客户每月账单分组列表统计")
@GetMapping(value = "/receivableCustomerMonthListCount")
public AjaxResult receivableCustomerMonthListCount(BillManageDTO billManageDTO)
{
BillManageDO billManageDO = new BillManageDO();
BeanUtils.copyProperties(billManageDTO, billManageDO);
billManageDO.setBillType(1);
List<CustomerMonthBillVO> list = billManageApplicationService.queryCustomerMonthBillList(billManageDO);
BigDecimal totalBillAmount = list.stream()
.map(CustomerMonthBillVO::getTotalBillAmount)
.filter(java.util.Objects::nonNull)
.reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add);
BigDecimal totalSettledAmount = list.stream()
.map(CustomerMonthBillVO::getTotalSettledAmount)
.filter(java.util.Objects::nonNull)
.reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add);
BigDecimal totalUnsettledAmount = list.stream()
.map(CustomerMonthBillVO::getTotalUnsettledAmount)
.filter(java.util.Objects::nonNull)
.reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add);
java.util.Map<String, Object> resultMap = new java.util.HashMap<>();
resultMap.put("totalBillAmount", totalBillAmount);
resultMap.put("totalSettledAmount", totalSettledAmount);
resultMap.put("totalUnsettledAmount", totalUnsettledAmount);
resultMap.put("totalCount", list.size());
return AjaxResult.success(resultMap);
}
/**
* 根据账单ID列表查询应收账单详情客户月账单点击账单数量回显
*/
@ApiOperation("根据账单ID列表查询应收账单详情")
@GetMapping("/receivableDetailByMonth")
public TableDataInfo receivableDetailByMonth(BillManageDTO billManageDTO)
{
if (billManageDTO.getBillManageIds() != null && !billManageDTO.getBillManageIds().isEmpty()) {
Set<String> idSet = java.util.Arrays.stream(billManageDTO.getBillManageIds().split(","))
.collect(java.util.stream.Collectors.toSet());
billManageDTO.setBillManageIdSet(idSet);
}
BillManageDO billManageDO = new BillManageDO();
BeanUtils.copyProperties(billManageDTO, billManageDO);
billManageDO.setBillType(1);
startPage();
List<BillManagePO> list = billManageApplicationService.queryList(billManageDO);
return getDataTable(list);
}
@ApiOperation("根据账单ID列表查询应收账单汇总")
@GetMapping("/receivableSumByMonth")
public AjaxResult receivableSumByMonth(BillManageDTO billManageDTO)
{
if (billManageDTO.getBillManageIds() != null && !billManageDTO.getBillManageIds().isEmpty()) {
Set<String> idSet = java.util.Arrays.stream(billManageDTO.getBillManageIds().split(","))
.collect(java.util.stream.Collectors.toSet());
billManageDTO.setBillManageIdSet(idSet);
}
BillManageDO billManageDO = new BillManageDO();
BeanUtils.copyProperties(billManageDTO, billManageDO);
billManageDO.setBillType(1);
List<BillManagePO> list = billManageApplicationService.queryList(billManageDO);
Set<Long> billManageIdSet = list.stream()
.map(BillManagePO::getBillManageId)
.filter(java.util.Objects::nonNull)
.collect(java.util.stream.Collectors.toSet());
List<ReceiptDetail> allReceiptDetails = new ArrayList<>();
Set<Long> receiptManageIdSet = new java.util.HashSet<>();
List<ReceiptManagePO> receiptManageList = new ArrayList<>();
if (!billManageIdSet.isEmpty()) {
allReceiptDetails = receiptDetailDomainService.queryListByLambda(
new LambdaQueryWrapper<ReceiptDetail>()
.in(ReceiptDetail::getBillManageId, billManageIdSet)
.eq(ReceiptDetail::getDelFlag, 1));
java.util.Map<Long, List<ReceiptDetail>> detailByBillId = allReceiptDetails.stream()
.collect(java.util.stream.Collectors.groupingBy(ReceiptDetail::getBillManageId));
for (BillManagePO bill : list) {
bill.setReceiptDetailList(detailByBillId.getOrDefault(bill.getBillManageId(), new ArrayList<>()));
}
receiptManageIdSet = allReceiptDetails.stream()
.map(ReceiptDetail::getReceiptManageId)
.filter(java.util.Objects::nonNull)
.collect(java.util.stream.Collectors.toSet());
if (!receiptManageIdSet.isEmpty()) {
List<ReceiptManage> manages = receiptManageService.list(
new LambdaQueryWrapper<ReceiptManage>()
.in(ReceiptManage::getReceiptManageId, receiptManageIdSet)
.eq(ReceiptManage::getDelFlag, 1));
java.util.Map<Long, List<ReceiptDetailPO>> detailPOByManageId = allReceiptDetails.stream()
.map(d -> {
ReceiptDetailPO po = new ReceiptDetailPO();
BeanUtils.copyProperties(d, po);
return po;
})
.collect(java.util.stream.Collectors.groupingBy(ReceiptDetailPO::getReceiptManageId));
for (ReceiptManage m : manages) {
ReceiptManagePO po = new ReceiptManagePO();
BeanUtils.copyProperties(m, po);
po.setReceiptDetailPOList(detailPOByManageId.getOrDefault(m.getReceiptManageId(), new ArrayList<>()));
receiptManageList.add(po);
}
}
}
BigDecimal totalBillAmount = list.stream()
.map(BillManagePO::getBillAmount)
.filter(java.util.Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalSettledAmount = list.stream()
.map(BillManagePO::getBillAmountSettlement)
.filter(java.util.Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalUnsettledAmount = list.stream()
.map(BillManagePO::getBillAmountUnsettled)
.filter(java.util.Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
int billCount = list.size();
String collectionStatus;
if (billCount == 0) {
collectionStatus = "无数据";
} else if (totalUnsettledAmount.compareTo(BigDecimal.ZERO) == 0) {
collectionStatus = "已收款";
} else if (totalSettledAmount.compareTo(BigDecimal.ZERO) == 0) {
collectionStatus = "未收款";
} else {
collectionStatus = "部分收款";
}
java.util.Map<String, Object> resultMap = new java.util.HashMap<>();
resultMap.put("totalBillAmount", totalBillAmount);
resultMap.put("totalSettledAmount", totalSettledAmount);
resultMap.put("totalUnsettledAmount", totalUnsettledAmount);
resultMap.put("billCount", billCount);
resultMap.put("collectionStatus", collectionStatus);
resultMap.put("billList", list);
resultMap.put("receiptManageList", receiptManageList);
return AjaxResult.success(resultMap);
}
@ApiOperation("导出应收账单") @ApiOperation("导出应收账单")
@GetMapping(value = "/exportReceivableList", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") @GetMapping(value = "/exportReceivableList", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
public void exportReceivableList(BillManageDTO billManageDTO, HttpServletResponse response) throws IOException public void exportReceivableList(BillManageDTO billManageDTO, HttpServletResponse response) throws IOException
@@ -328,6 +507,46 @@ public class BillManageApi extends BaseController{
} }
@ApiOperation("应收账单-红冲")
@PostMapping("/redFlushBill")
public AjaxResult redFlushBill(@RequestBody BillManageDTO billManageDTO)
{
if(!StringUtils.isNotEmpty(billManageDTO.getBillManageIds())){
throw new ServiceException("账单id不能为空");
}
//批量加锁
RedissonMultiLock redissonMultiLock = null;
boolean lockFlag = false;
try {
RedisLockTypeEnum redisLockTypeEnum = RedisLockTypeEnum.BMS;
List<RLock> locks = new ArrayList<>();
Set<String> billIdSet = Stream.of(billManageDTO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).collect(Collectors.toSet());
billIdSet.forEach(x -> {
//获取唯一key值
String key = redisLockTypeEnum.getUniqueKey(UniqueKeyUtil.getBillingKey(x));
locks.add(redisLock.getRLock(key));
});
redissonMultiLock = new RedissonMultiLock(locks.toArray(new RLock[billIdSet.size()]));
//尝试获取锁 不等待 持有锁10分钟
lockFlag = redissonMultiLock.tryLock(-1, 10, TimeUnit.MINUTES);
if (!lockFlag) {
redissonMultiLock = null;
throw new ServiceException("账单正在操作中,请稍后重试");
}
log.info("红冲账单加锁成功");
billManageApplicationService.redFlushBill(billManageDTO);
return AjaxResult.success("操作成功");
}catch (Exception e){
return AjaxResult.error("红冲账单失败:"+e.getMessage());
} finally {
if (redissonMultiLock != null && lockFlag){
redissonMultiLock.unlock();
log.info("红冲账单释放锁成功");
}
}
}
@ApiOperation("应收账单-客户确认") @ApiOperation("应收账单-客户确认")
@PostMapping("/customerConfirmation") @PostMapping("/customerConfirmation")
public AjaxResult customerConfirmation(@RequestBody BillManageDTO billManageDTO) public AjaxResult customerConfirmation(@RequestBody BillManageDTO billManageDTO)
@@ -438,6 +657,21 @@ public class BillManageApi extends BaseController{
} }
/**
* 客户月结报表
*/
@ApiOperation("客户月结报表")
@GetMapping("/customerMonthlyReport")
public TableDataInfo customerMonthlyReport(BillManageDTO billManageDTO)
{
//转换实体
BillManageDO billManageDO = new BillManageDO();
BeanUtils.copyProperties(billManageDTO,billManageDO);
startPage();
billManageDO.setBillType(1);
List<BillManagePO> list = billManageApplicationService.customerMonthlyReport(billManageDO);
return getDataTable(list);
}
@@ -339,7 +339,10 @@ public class BillingStatementApi extends BaseController {
String shipperId = XxlJobHelper.getJobParam(); String shipperId = XxlJobHelper.getJobParam();
logger.info("XXL-JOB 开始入库业务单推送bms计费流水,货主id参数:{}", shipperId); logger.info("XXL-JOB 开始入库业务单推送bms计费流水,货主id参数:{}", shipperId);
try { try {
//干仓
billingStatementApplicationService.pushBillManage(shipperId); billingStatementApplicationService.pushBillManage(shipperId);
//冻仓
billingStatementApplicationService.pushBillManageDC(shipperId);
// 设置任务执行结果 // 设置任务执行结果
XxlJobHelper.handleSuccess("入库业务单推送bms计费流水执行成功"); XxlJobHelper.handleSuccess("入库业务单推送bms计费流水执行成功");
} catch (Exception e) { } catch (Exception e) {
@@ -1,6 +1,7 @@
package com.mhd.bms.interfaces.facadeApi; package com.mhd.bms.interfaces.facadeApi;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -114,6 +115,57 @@ public class ReceiptManageApi extends BaseController{
} }
} }
/**
* 撤销收款
*/
@ApiOperation("撤销收款")
@RepeatSubmit
@PostMapping("/cancelCollection")
public AjaxResult cancelCollection(@RequestBody ReceiptManageDTO receiptManageDTO)
{
if(!StringUtils.isNotEmpty(receiptManageDTO.getBillManageIds())){
throw new ServiceException("撤销账单不能为空");
}
RedissonMultiLock redissonMultiLock = null;
boolean payInfoDetailLock = false;
try {
RedisLockTypeEnum redisLockTypeEnum = RedisLockTypeEnum.BMS;
List<RLock> locks = new ArrayList<>();
//账单id与涉及的收款单id去重后加锁避免同一把锁重复加锁
Set<String> lockKeySet = new LinkedHashSet<>();
lockKeySet.addAll(Stream.of(receiptManageDTO.getBillManageIds().split(",")).filter(StringUtils::isNotEmpty).map(String::trim).collect(Collectors.toSet()));
//查询账单涉及的收款单一并加锁避免并发撤销时收款单金额重算冲突
Set<Long> receiptManageIdSet = receiptManageApplicationService.queryCancelCollectionReceiptManageIds(receiptManageDTO.getBillManageIds());
if (null != receiptManageIdSet) {
receiptManageIdSet.forEach(x -> lockKeySet.add(String.valueOf(x)));
}
lockKeySet.forEach(x -> {
//获取唯一key值
String key = redisLockTypeEnum.getUniqueKey(UniqueKeyUtil.getBillingKey(x));
locks.add(redisLock.getRLock(key));
});
redissonMultiLock = new RedissonMultiLock(locks.toArray(new RLock[lockKeySet.size()]));
//尝试获取锁 不等待 持有锁10分钟
payInfoDetailLock = redissonMultiLock.tryLock(-1, 10, TimeUnit.MINUTES);
if (!payInfoDetailLock) {
redissonMultiLock = null;
return AjaxResult.error("收款单正在处理,请稍后再试");
}
log.info("撤销收款加锁成功");
//转换实体
ReceiptManageDO receiptManageDO = new ReceiptManageDO();
BeanUtils.copyProperties(receiptManageDTO,receiptManageDO);
return toAjax(receiptManageApplicationService.cancelCollection(receiptManageDO));
}catch (Exception e){
return AjaxResult.error("撤销收款失败:" + e.getMessage());
}finally {
if (redissonMultiLock != null && payInfoDetailLock) {
redissonMultiLock.unlock();
log.info("撤销收款释放了锁");
}
}
}
/** /**
* 批量删除收款单管理 * 批量删除收款单管理
*/ */
@@ -22,7 +22,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ORDER BY a.create_time DESC ORDER BY a.create_time DESC
</select> </select>
<select id="customerMonthlyReport" parameterType="com.mhd.bms.domain.billManage.repository.todo.BillManageDO" resultType="com.mhd.bms.domain.billManage.repository.po.BillManagePO">
SELECT
a.*,
b.SETTLEMENT_ENTITY_ID AS "settlementEntityId",
(SELECT MAX(c.collection_time)
FROM receipt_detail rd
LEFT JOIN receipt_manage c ON rd.receipt_manage_id = c.receipt_manage_id
WHERE rd.bill_manage_id = a.bill_manage_id
AND rd.del_flag = 1
AND c.del_flag = 1) AS "collectionTime",
(SELECT LISTAGG(bs.CONTRACT_NUMBER, ',') WITHIN GROUP (ORDER BY bs.CONTRACT_NUMBER)
FROM BILLING_STATEMENT bs
WHERE bs.BILL_MANAGE_ID = a.bill_manage_id
AND bs.CONTRACT_NUMBER IS NOT NULL) AS "contractNumbers"
FROM bill_manage a
LEFT JOIN SETTLEMENT_CUSTOMERS b ON a.SETTLEMENT_CUSTOMERS_ID = b.SETTLEMENT_CUSTOMERS_ID
WHERE a.del_flag = 1
<include refid="common_where"/>
ORDER BY a.create_time DESC
</select>
<select id="queryCustomerMonthBillList" parameterType="com.mhd.bms.domain.billManage.repository.todo.BillManageDO" resultType="com.mhd.bms.interfaces.dto.billManage.CustomerMonthBillVO">
SELECT
a.SETTLEMENT_CUSTOMERS_ID AS settlementCustomersId,
a.SETTLEMENT_CUSTOMERS_CODE AS settlementCustomersCode,
a.SETTLEMENT_ENTITY AS settlementEntity,
b.SETTLEMENT_ENTITY_ID AS settlementEntityId,
b.SETTLEMENT_ENTITY AS settlementEntityName,
a.ORGANIZATION_ID AS organizationId,
a.ORGANIZATION_NAME AS organizationName,
TO_CHAR(a.CREATE_TIME, 'YYYY-MM') AS billMonth,
SUM(a.BILL_AMOUNT) AS totalBillAmount,
SUM(NVL(a.BILL_AMOUNT_SETTLEMENT, 0)) AS totalSettledAmount,
SUM(NVL(a.BILL_AMOUNT_UNSETTLED, 0)) AS totalUnsettledAmount,
COUNT(*) AS billCount,
LISTAGG(a.BILL_MANAGE_ID, ',') WITHIN GROUP (ORDER BY a.BILL_MANAGE_ID) AS billManageIds,
b.SETTLEMENT_METHOD AS settlementMethod,
b.SETTLEMENT_CURRENCY AS settlementCurrency
FROM bill_manage a
LEFT JOIN SETTLEMENT_CUSTOMERS b ON a.SETTLEMENT_CUSTOMERS_ID = b.SETTLEMENT_CUSTOMERS_ID AND b.del_flag = 1
WHERE a.del_flag = 1
<include refid="common_where"/>
GROUP BY a.SETTLEMENT_CUSTOMERS_ID, TO_CHAR(a.CREATE_TIME, 'YYYY-MM'), a.ORGANIZATION_ID, a.ORGANIZATION_NAME, b.SETTLEMENT_ENTITY_ID, b.SETTLEMENT_ENTITY, b.SETTLEMENT_METHOD, b.SETTLEMENT_CURRENCY, a.SETTLEMENT_CUSTOMERS_CODE, a.SETTLEMENT_ENTITY
ORDER BY MAX(a.CREATE_TIME) DESC
</select>
<sql id="common_where"> <sql id="common_where">
<if test="billManageDO.billMonth != null and billManageDO.billMonth != ''">
AND TO_CHAR(a.CREATE_TIME, 'YYYY-MM') = #{billManageDO.billMonth}
</if>
<if test="billManageDO.createTimeStart != null and billManageDO.createTimeStart != ''"> <if test="billManageDO.createTimeStart != null and billManageDO.createTimeStart != ''">
AND date_format(a.create_time,'%Y-%m-%d') <![CDATA[>=]]> #{billManageDO.createTimeStart} AND date_format(a.create_time,'%Y-%m-%d') <![CDATA[>=]]> #{billManageDO.createTimeStart}
</if> </if>
@@ -12,39 +12,39 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectBillOperationLogPo1"> <sql id="selectBillOperationLogPo1">
<where> <where>
<if test="createByName != null and createByName != ''"> <if test="billOperationLogDO.createByName != null and billOperationLogDO.createByName != ''">
and create_by_name like concat('%', #{createByName}, '%') and create_by_name like concat('%', #{billOperationLogDO.createByName}, '%')
</if> </if>
<if test="updateByName != null and updateByName != ''"> <if test="billOperationLogDO.updateByName != null and billOperationLogDO.updateByName != ''">
and update_by_name like concat('%', #{updateByName}, '%') and update_by_name like concat('%', #{billOperationLogDO.updateByName}, '%')
</if> </if>
<if test="topOrganizationId != null "> <if test="billOperationLogDO.topOrganizationId != null ">
and top_organization_id = #{topOrganizationId} and top_organization_id = #{billOperationLogDO.topOrganizationId}
</if> </if>
<if test="organizationId != null "> <if test="billOperationLogDO.organizationId != null ">
and organization_id = #{organizationId} and organization_id = #{billOperationLogDO.organizationId}
</if> </if>
<if test="organizationName != null and organizationName != ''"> <if test="billOperationLogDO.organizationName != null and billOperationLogDO.organizationName != ''">
and organization_name like concat('%', #{organizationName}, '%') and organization_name like concat('%', #{billOperationLogDO.organizationName}, '%')
</if> </if>
<if test="billManageId != null "> <if test="billOperationLogDO.billManageId != null ">
and bill_manage_id = #{billManageId} and bill_manage_id = #{billOperationLogDO.billManageId}
</if> </if>
<if test="billNumber != null and billNumber != ''"> <!-- <if test="billOperationLogDO.billNumber != null and billOperationLogDO.billNumber != ''">-->
and bill_number = #{billNumber} <!-- and bill_number = #{billOperationLogDO.billNumber}-->
<!-- </if>-->
<if test="billOperationLogDO.operationType != null ">
and operation_type = #{billOperationLogDO.operationType}
</if> </if>
<if test="operationType != null "> <if test="billOperationLogDO.operationInfo != null and billOperationLogDO.operationInfo != ''">
and operation_type = #{operationType} and operation_info = #{billOperationLogDO.operationInfo}
</if>
<if test="operationInfo != null and operationInfo != ''">
and operation_info = #{operationInfo}
</if>
<if test="operator != null and operator != ''">
and operator = #{operator}
</if>
<if test="operationTime != null ">
and operation_time = #{operationTime}
</if> </if>
<!-- <if test="billOperationLogDO.operator != null and billOperationLogDO.operator != ''">-->
<!-- and operator = #{billOperationLogDO.operator}-->
<!-- </if>-->
<!-- <if test="billOperationLogDO.operationTime != null ">-->
<!-- and operation_time = #{billOperationLogDO.operationTime}-->
<!-- </if>-->
</where> </where>
</sql> </sql>
@@ -275,7 +275,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT SELECT
RATE as "taxRate" RATE as "taxRate"
FROM FROM
EXPENSE_ACCOUNT NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT
WHERE WHERE
SUBJECT_CODE = #{subjectCode} SUBJECT_CODE = #{subjectCode}
AND SUBJECT_NAME = #{subjectName} AND SUBJECT_NAME = #{subjectName}
@@ -13,7 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
WM_CONCAT(b.bill_number) AS billNumbers WM_CONCAT(b.bill_number) AS billNumbers
FROM FROM
receipt_manage a receipt_manage a
LEFT JOIN receipt_detail b ON a.receipt_manage_id = b.receipt_manage_id LEFT JOIN receipt_detail b ON a.receipt_manage_id = b.receipt_manage_id AND b.del_flag = 1
WHERE WHERE
a.del_flag = 1 a.del_flag = 1
<include refid="common_where"/> <include refid="common_where"/>
@@ -101,6 +101,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join PAYMENT_WALLET c on b.payment_card_id = c.PAYMENT_WALLET_ID left join PAYMENT_WALLET c on b.payment_card_id = c.PAYMENT_WALLET_ID
WHERE WHERE
a.bill_manage_id = #{billManageId} a.bill_manage_id = #{billManageId}
AND a.del_flag = 1
</select> </select>
</mapper> </mapper>
@@ -7,9 +7,16 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mhd.common.core.domain.dto.wlhy.TmsAddressMultiDTO;
import com.mhd.common.core.domain.dto.wlhy.TmsCargoInfoDTO;
import com.mhd.common.core.domain.dto.wlhy.TmsOrderAccount;
import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils; import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.businessDocumentAddressMulti.entity.BusinessDocumentAddressMulti;
import com.mhd.oms.domain.businessDocumentAddressMulti.repository.mapper.BusinessDocumentAddressMultiMapper;
import com.mhd.oms.domain.businessDocumentCargoMulti.entity.BusinessDocumentCargoMulti;
import com.mhd.oms.domain.businessDocumentCargoMulti.repository.mapper.BusinessDocumentCargoMultiMapper;
import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder;
import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper;
import com.mhd.oms.domain.businessDocumentOrderAdjust.entity.BusinessDocumentOrderAdjust; import com.mhd.oms.domain.businessDocumentOrderAdjust.entity.BusinessDocumentOrderAdjust;
@@ -20,11 +27,13 @@ import com.mhd.oms.domain.businessOrderAccount.BusinessOrderAccount;
import com.mhd.oms.domain.businessOrderAccount.repository.mapper.BusinessOrderAccountMapper; import com.mhd.oms.domain.businessOrderAccount.repository.mapper.BusinessOrderAccountMapper;
import com.mhd.oms.domain.executeOrder.entity.ExecuteOrder; import com.mhd.oms.domain.executeOrder.entity.ExecuteOrder;
import com.mhd.oms.domain.executeOrder.repository.mapper.ExecuteOrderMapper; import com.mhd.oms.domain.executeOrder.repository.mapper.ExecuteOrderMapper;
import com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO;
import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustAuditDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustAuditDTO;
import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustDTO;
import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustQueryDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustQueryDTO;
import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustRecordDTO; import com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust.BusinessDocumentOrderAdjustRecordDTO;
import com.mhd.system.api.WlhyServiceFeign; import com.mhd.system.api.WlhyServiceFeign;
import com.mhd.system.api.domain.TmsOrderAddDTO;
import com.mhd.system.api.model.LoginUser; import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +45,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -46,16 +56,23 @@ import java.util.stream.Collectors;
* 2. 费用数据源 = 前端回传的费用明细 business_order_account(feeDetailList) * 2. 费用数据源 = 前端回传的费用明细 business_order_account(feeDetailList)
* 主表金额 deliveryFreight 为其 amount 合计(冗余汇总后端自动算) * 主表金额 deliveryFreight 为其 amount 合计(冗余汇总后端自动算)
* 3. 是否需审核一旦任一金额发生变化 * 3. 是否需审核一旦任一金额发生变化
* = feeDetailList 明细 amount 变化或主表金额列变化 -> 走业务主管审核 * = feeDetailList 明细 amount 变化或主表金额/费用列变化 -> 走业务主管审核
* 否则(仅改非金额字段) -> 直通 * 否则(仅改非金额字段) -> 直通
* 金额/费用字段涵盖: deliveryFreight / collectedFreight / uncollectedFreight /
* collectLessFreight / transportationUnitPrice / infoFee / freightUnitPrice /
* cargoInsuranceAmount / freightCharges / freightFee / unloadingFee / customsFee /
* shortageFee / miscellaneousFee / otherFee / detentionFee以及 settlementCurrency /
* paymentAccountId / accountName / accountInformation(结算币种+收款账户任一变化即视为费用变更)
* 判定口径: 以后端兜底比对为准(主表金额/费用列 + 明细 amount 合计)
* 前端 amountChanged 仅作提示后端比对结果与前端 OR 运算避免前端误传 false 绕过审核
* 4. 涉及金额提交 -> 仅把业务单 review_status 置为调整待审核(3)主记录 AUDIT_STATUS=0(待审核) * 4. 涉及金额提交 -> 仅把业务单 review_status 置为调整待审核(3)主记录 AUDIT_STATUS=0(待审核)
* 不更新业务单数据不影响其它状态(order_status / execute_status 不动) * 不更新业务单数据不影响其它状态(order_status / execute_status 不动)
* 5. 审核通过 -> 覆盖业务单(金额) + 替换费用明细review_status 一律置为 1(已审核) * 5. 审核通过 -> 覆盖业务单(金额) + 替换费用明细review_status 一律置为 1(已审核)
* 不影响 order_status / execute_status * 不影响 order_status / execute_status
* 审核驳回 -> 不更新业务单数据review_status 还原为调整前值(主记录 before_review_status)可再次调整 * 审核驳回 -> 不更新业务单数据review_status 置为调整驳回(4)不影响 order_status/execute_status
* 可再次调整提交审核
* 6. 直通(未改金额) -> 覆盖业务单可编辑字段 + deliveryFreight(明细合计)并替换 business_order_account * 6. 直通(未改金额) -> 覆盖业务单可编辑字段 + deliveryFreight(明细合计)并替换 business_order_account
* (逻辑删旧 is_delete=1 + 插新 is_delete=0)不改动任何审核/执行状态 * (逻辑删旧 is_delete=1 + 插新 is_delete=0)不改动任何审核/执行状态
* 7. 前端以 amountChanged 告知是否改金额(默认前端判定)未传时后端兜底比对
* *
* 说明review_status 原枚举 0未审/1通过/2驳回新增 3=调整待审核不改变原有用例 * 说明review_status 原枚举 0未审/1通过/2驳回新增 3=调整待审核不改变原有用例
* *
@@ -70,12 +87,22 @@ public class BusinessDocumentOrderAdjustService {
private static final Integer AUDIT_PASS = 1; // 调整记录审核通过 private static final Integer AUDIT_PASS = 1; // 调整记录审核通过
private static final Integer AUDIT_REJECT = 2; // 调整记录驳回 private static final Integer AUDIT_REJECT = 2; // 调整记录驳回
/** 主表金额(费用)字段,任一变化触发审核 */ /** 业务单 review_status:调整待审核(提交涉及金额时置) */
private static final Long REVIEW_ADJUST_WAIT = 3L;
/** 业务单 review_status:调整驳回(审核驳回时置,与普通驳回 2 区分) */
private static final Long REVIEW_ADJUST_REJECT = 4L;
/** 主表金额(费用)字段任一变化触发审核
* : 运费相关 8 + 其他费用 8 + 结算币种 + 收款账户(3 字段)
* 任意一项变化即需要审核(对应前端"费用合计 / 运费 / 装卸费 / 仓租及柜租(走明细) /
* 保险 / 压车(走明细) / 运输处理费(走明细) / 报关费 / 其他 / 费用合计 / 结算币种 / 收款账户") */
private static final List<String> FEE_FIELDS = Arrays.asList( private static final List<String> FEE_FIELDS = Arrays.asList(
"deliveryFreight", "collectedFreight", "uncollectedFreight", "collectLessFreight", "deliveryFreight", "collectedFreight", "uncollectedFreight", "collectLessFreight",
"transportationUnitPrice", "infoFee", "freightUnitPrice", "cargoInsuranceAmount", "transportationUnitPrice", "infoFee", "freightUnitPrice", "cargoInsuranceAmount",
"freightCharges", "freightFee", "unloadingFee", "customsFee", "shortageFee", "freightCharges", "freightFee", "unloadingFee", "customsFee", "shortageFee",
"miscellaneousFee", "otherFee", "detentionFee"); "miscellaneousFee", "otherFee", "detentionFee",
// 结算币种 + 收款账户 任一变化也视为费用变更需审核
"settlementCurrency", "paymentAccountId", "accountName", "accountInformation");
/** 不允许被前端调整覆盖的系统字段 */ /** 不允许被前端调整覆盖的系统字段 */
private static final List<String> PROTECTED_FIELDS = Arrays.asList( private static final List<String> PROTECTED_FIELDS = Arrays.asList(
@@ -83,7 +110,7 @@ public class BusinessDocumentOrderAdjustService {
"orderStatus", "reviewStatus", "reviewId", "review", "reviewTime", "reviewOpinion", "orderStatus", "reviewStatus", "reviewId", "review", "reviewTime", "reviewOpinion",
"salesManager", "auditStatus", "auditBy", "auditTime", "salesManager", "auditStatus", "auditBy", "auditTime",
"executeStatus", "executeId", "executeTime", "executor", "executeStatus", "executeId", "executeTime", "executor",
"executeOrderId", "executeOrderNumber", "adjustStatus", "executeOrderId", "executeOrderNumber",
"isDelete", "delFlag", "createBy", "createByName", "createTime", "isDelete", "delFlag", "createBy", "createByName", "createTime",
"updateBy", "updateByName", "updateTime", "updateBy", "updateByName", "updateTime",
"pushStatus", "pushTime", "pushBy", "pushByName", "pushStatus", "pushTime", "pushBy", "pushByName",
@@ -112,6 +139,12 @@ public class BusinessDocumentOrderAdjustService {
@Autowired @Autowired
private ExecuteOrderMapper executeOrderMapper; private ExecuteOrderMapper executeOrderMapper;
@Autowired
private BusinessDocumentCargoMultiMapper businessDocumentCargoMultiMapper;
@Autowired
private BusinessDocumentAddressMultiMapper businessDocumentAddressMultiMapper;
@Autowired @Autowired
private WlhyServiceFeign wlhyServiceFeign; private WlhyServiceFeign wlhyServiceFeign;
@@ -136,12 +169,20 @@ public class BusinessDocumentOrderAdjustService {
.eq(BusinessOrderAccount::getOrderId, dbOrder.getId()) .eq(BusinessOrderAccount::getOrderId, dbOrder.getId())
.eq(BusinessOrderAccount::getIsDelete, 0)); .eq(BusinessOrderAccount::getIsDelete, 0));
// 2. 调整后的费用明细(前端) null 则视为保持库中不变 // 2. 调整后的费用明细(前端) null 则视为保持库中不变
// 兼容前端两种传法顶层 feeDetailList或整单回传 order.businessOrderAccountList
List<BusinessOrderAccount> newFeeList = dto.getFeeDetailList(); List<BusinessOrderAccount> newFeeList = dto.getFeeDetailList();
if ((newFeeList == null || newFeeList.isEmpty()) && front.getBusinessOrderAccountList() != null) {
newFeeList = front.getBusinessOrderAccountList();
}
// 3. 生成"调整后"业务单对象DB原值 + 前端可编辑字段覆盖(忽略null) // 3. 生成"调整后"业务单对象DB原值 + 前端可编辑字段覆盖(忽略null)
BusinessDocumentOrder afterOrder = buildAfterOrder(dbOrder, front); BusinessDocumentOrder afterOrder = buildAfterOrder(dbOrder, front);
// 3.1 地址兼容前端把地址放在 shipment/receipt loadingAddressList/unloadAddressList
// 映射到 loading*/unload* 扁平字段(与下单主流程 BusinessDocumentOrderDomainService 一致口径)
applyAddressMapping(afterOrder, front);
// 4. 若提供了费用明细 deliveryFreight(合计)=明细 amount 之和并联动到 afterOrder // 4. 若提供了费用明细 deliveryFreight(合计)=明细 amount 之和并联动到 afterOrder
boolean hasFeeDetail = newFeeList != null && !newFeeList.isEmpty(); boolean hasFeeDetail = newFeeList != null && !newFeeList.isEmpty();
if (hasFeeDetail) { if (hasFeeDetail) {
@@ -149,14 +190,10 @@ public class BusinessDocumentOrderAdjustService {
afterOrder.setDeliveryFreight(sum); afterOrder.setDeliveryFreight(sum);
} }
// 5. 判定是否修改了金额前端 amountChanged 为准(前端整单回传已自行判定) // 5. 判定是否修改了金额后端兜底比对为准避免前端误传 false 绕过审核
// 前端未传则后端兜底比对(主表金额列 明细 amount 变化) // 前端 true 也尊重后端比对结果与前端 OR 运算任一为真则需审核
boolean amountChanged; boolean backendChanged = isAmountChanged(dbOrder, front, hasFeeDetail, dbFeeList, newFeeList);
if (dto.getAmountChanged() != null) { boolean amountChanged = backendChanged || Boolean.TRUE.equals(dto.getAmountChanged());
amountChanged = dto.getAmountChanged();
} else {
amountChanged = isAmountChanged(dbOrder, front, hasFeeDetail, dbFeeList, newFeeList);
}
// 6. 写主记录 // 6. 写主记录
LoginUser loginUser = SecurityUtils.getLoginUser(); LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -188,7 +225,7 @@ public class BusinessDocumentOrderAdjustService {
// 8b. 涉及金额仅把业务单 review_status 置为"调整待审核(3)"其余状态(exec/orderStatus)不动不更新业务单数据 // 8b. 涉及金额仅把业务单 review_status 置为"调整待审核(3)"其余状态(exec/orderStatus)不动不更新业务单数据
BusinessDocumentOrder statusOnly = new BusinessDocumentOrder(); BusinessDocumentOrder statusOnly = new BusinessDocumentOrder();
statusOnly.setId(dbOrder.getId()); statusOnly.setId(dbOrder.getId());
statusOnly.setReviewStatus(3L); // 调整待审核 statusOnly.setReviewStatus(REVIEW_ADJUST_WAIT); // 调整待审核
businessDocumentOrderMapper.updateById(statusOnly); businessDocumentOrderMapper.updateById(statusOnly);
} }
@@ -250,11 +287,27 @@ public class BusinessDocumentOrderAdjustService {
/** /**
* 按业务单查询调整记录(供订单详情页"调整记录"Tab用) * 按业务单查询调整记录(供订单详情页"调整记录"Tab用)
* 每条记录同时带出调整后明细快照(detail)前端可自包含展示无需再单独调详情接口
*/ */
public List<BusinessDocumentOrderAdjustRecordDTO> listAdjustRecordByOrder(Long orderId) { public List<BusinessDocumentOrderAdjustRecordDTO> listAdjustRecordByOrder(Long orderId) {
BusinessDocumentOrderAdjustQueryDTO query = new BusinessDocumentOrderAdjustQueryDTO(); BusinessDocumentOrderAdjustQueryDTO query = new BusinessDocumentOrderAdjustQueryDTO();
query.setOrderId(orderId); query.setOrderId(orderId);
return listAdjustRecord(query); List<BusinessDocumentOrderAdjustRecordDTO> list = listAdjustRecord(query);
if (list == null || list.isEmpty()) {
return list;
}
// 批量取明细快照按 adjust_id 一次性拼上避免 N+1
List<Long> adjustIds = list.stream()
.map(BusinessDocumentOrderAdjustRecordDTO::getId)
.collect(Collectors.toList());
List<BusinessDocumentOrderAdjustDetail> details = adjustDetailMapper.selectList(
new LambdaQueryWrapper<BusinessDocumentOrderAdjustDetail>()
.in(BusinessDocumentOrderAdjustDetail::getAdjustId, adjustIds)
.eq(BusinessDocumentOrderAdjustDetail::getDelFlag, 1));
Map<Long, BusinessDocumentOrderAdjustDetail> detailMap = details.stream()
.collect(Collectors.toMap(BusinessDocumentOrderAdjustDetail::getAdjustId, d -> d, (a, b) -> a));
list.forEach(vo -> vo.setDetail(detailMap.get(vo.getId())));
return list;
} }
/** /**
@@ -353,6 +406,7 @@ public class BusinessDocumentOrderAdjustService {
syncTmsAsync(order.getGoodsNumber(), toSave); syncTmsAsync(order.getGoodsNumber(), toSave);
} else { } else {
adjust.setAuditStatus(AUDIT_REJECT); adjust.setAuditStatus(AUDIT_REJECT);
adjust.setIsAudit(1); // 走到审核即说明该调整需要审核保持 is_audit audit_status 语义一致
adjust.setAuditBy(auditBy); adjust.setAuditBy(auditBy);
adjust.setAuditByName(auditByName); adjust.setAuditByName(auditByName);
adjust.setAuditTime(now); adjust.setAuditTime(now);
@@ -361,10 +415,11 @@ public class BusinessDocumentOrderAdjustService {
adjust.setUpdateTime(now); adjust.setUpdateTime(now);
adjustMapper.updateById(adjust); adjustMapper.updateById(adjust);
// 驳回不更新业务单数据仅把 review_status 还原为调整前值(不影响其它状态) // 驳回不更新业务单数据仅把 review_status 置为调整驳回(4)
// 不影响 order_status / execute_status 等其它单据状态可再次调整提交审核
BusinessDocumentOrder statusOnly = new BusinessDocumentOrder(); BusinessDocumentOrder statusOnly = new BusinessDocumentOrder();
statusOnly.setId(adjust.getOrderId()); statusOnly.setId(adjust.getOrderId());
statusOnly.setReviewStatus(adjust.getBeforeReviewStatus() == null ? 0L : adjust.getBeforeReviewStatus()); statusOnly.setReviewStatus(REVIEW_ADJUST_REJECT);
businessDocumentOrderMapper.updateById(statusOnly); businessDocumentOrderMapper.updateById(statusOnly);
} }
return AjaxResult.success(); return AjaxResult.success();
@@ -383,6 +438,50 @@ public class BusinessDocumentOrderAdjustService {
return after; return after;
} }
/**
* 地址兼容映射前端整单回传时地址在 shipment/receipt loadingAddressList/unloadAddressList
* 这里统一映射到 business_document_order loading unload 系列扁平字段
* 口径与 BusinessDocumentOrderDomainService 下单主流程保持一致
* 装货取第一条地址卸货取最后一条地址
*/
private void applyAddressMapping(BusinessDocumentOrder after, BusinessDocumentOrder front) {
BusinessDocumentAddressMultiDTO loading = null;
BusinessDocumentAddressMultiDTO unloading = null;
// 优先取 shipment/receipt 单对象其次取 loadingAddressList/unloadAddressList 集合
if (front.getShipment() != null) {
loading = front.getShipment();
} else if (front.getLoadingAddressList() != null && !front.getLoadingAddressList().isEmpty()) {
loading = front.getLoadingAddressList().get(0);
}
if (front.getReceipt() != null) {
unloading = front.getReceipt();
} else if (front.getUnloadAddressList() != null && !front.getUnloadAddressList().isEmpty()) {
unloading = front.getUnloadAddressList().get(front.getUnloadAddressList().size() - 1);
}
if (loading != null) {
after.setLoadingAreaId(loading.getAreaCode());
after.setLoadingName(loading.getAreaName() != null ? loading.getAreaName() : loading.getAreaCode());
after.setLoadingAddress(loading.getAddress());
after.setLoadingLongitude(loading.getLongitude());
after.setLoadingLatitude(loading.getLatitude());
after.setFreighterName(loading.getContactName());
after.setLoadingPhone(loading.getContactPhone());
after.setLoadingDate(loading.getLayDate());
}
if (unloading != null) {
after.setUnloadAreaId(unloading.getAreaCode());
after.setUnloadName(unloading.getAreaName() != null ? unloading.getAreaName() : unloading.getAreaCode());
after.setUnloadAddress(unloading.getAddress());
after.setUnloadLongitude(unloading.getLongitude());
after.setUnloadLatitude(unloading.getLatitude());
after.setDischargerName(unloading.getContactName());
after.setUnloadPhone(unloading.getContactPhone());
after.setUnloadingData(unloading.getLayDate());
}
}
private BusinessDocumentOrderAdjust buildAdjust(BusinessDocumentOrder dbOrder, LoginUser u, Date now, private BusinessDocumentOrderAdjust buildAdjust(BusinessDocumentOrder dbOrder, LoginUser u, Date now,
boolean amountChanged, String reason) { boolean amountChanged, String reason) {
BusinessDocumentOrderAdjust adjust = new BusinessDocumentOrderAdjust(); BusinessDocumentOrderAdjust adjust = new BusinessDocumentOrderAdjust();
@@ -421,21 +520,25 @@ public class BusinessDocumentOrderAdjustService {
} }
/** /**
* 是否修改了金额主表金额列变化 明细 amount 变化 * 是否修改了金额主表金额/费用列变化 明细 amount 变化
*/ */
private boolean isAmountChanged(BusinessDocumentOrder dbOrder, BusinessDocumentOrder front, private boolean isAmountChanged(BusinessDocumentOrder dbOrder, BusinessDocumentOrder front,
boolean hasFeeDetail, List<BusinessOrderAccount> dbFeeList, boolean hasFeeDetail, List<BusinessOrderAccount> dbFeeList,
List<BusinessOrderAccount> newFeeList) { List<BusinessOrderAccount> newFeeList) {
// a) 主表金额列比对 // a) 主表金额/费用列比对金额列用 BigDecimal 比对字符串列用 equals 比对
boolean mainChanged = FEE_FIELDS.stream().anyMatch(field -> { boolean mainChanged = FEE_FIELDS.stream().anyMatch(field -> {
Object newVal = BeanUtil.getFieldValue(front, field); Object newVal = BeanUtil.getFieldValue(front, field);
if (newVal == null) { if (newVal == null) {
return false; return false;
} }
Object oldVal = BeanUtil.getFieldValue(dbOrder, field); Object oldVal = BeanUtil.getFieldValue(dbOrder, field);
BigDecimal old = oldVal == null ? BigDecimal.ZERO : (BigDecimal) oldVal; if (newVal instanceof BigDecimal || oldVal instanceof BigDecimal) {
BigDecimal now = (BigDecimal) newVal; BigDecimal old = oldVal == null ? BigDecimal.ZERO : new BigDecimal(oldVal.toString());
BigDecimal now = new BigDecimal(newVal.toString());
return old.compareTo(now) != 0; return old.compareTo(now) != 0;
}
// 字符串字段(结算币种/收款账户等)
return !newVal.toString().equals(oldVal == null ? "" : oldVal.toString());
}); });
if (mainChanged) { if (mainChanged) {
return true; return true;
@@ -505,6 +608,74 @@ public class BusinessDocumentOrderAdjustService {
businessOrderAccountMapper.insert(acc); businessOrderAccountMapper.insert(acc);
} }
} }
// 同步地址明细表(business_document_address_multi)逻辑删旧 + 按调整后扁平字段插新
syncAddressDetail(orderId, toSave, loginUser, now);
}
/**
* 同步地址明细表调整后业务单的装/卸货扁平字段写回 business_document_address_multi
* applyAddressMapping 口径一致(装货取第一条卸货取最后一条)此处各保留一条
*/
private void syncAddressDetail(Long orderId, BusinessDocumentOrder toSave, LoginUser loginUser, Date now) {
// 逻辑删旧
List<BusinessDocumentAddressMulti> oldList = businessDocumentAddressMultiMapper.selectList(
new LambdaQueryWrapper<BusinessDocumentAddressMulti>()
.eq(BusinessDocumentAddressMulti::getOrderId, String.valueOf(orderId))
.eq(BusinessDocumentAddressMulti::getDelFlag, 1));
if (oldList != null) {
for (BusinessDocumentAddressMulti old : oldList) {
old.setDelFlag(0);
old.setUpdateBy(loginUser != null ? loginUser.getUserid() : null);
old.setUpdateTime(now);
businessDocumentAddressMultiMapper.updateById(old);
}
}
Long userId = loginUser != null ? loginUser.getUserid() : null;
// 装货
BusinessDocumentAddressMulti loading = new BusinessDocumentAddressMulti();
loading.setOrderId(String.valueOf(orderId));
loading.setAreaCode(toSave.getLoadingAreaId());
loading.setAreaName(toSave.getLoadingName());
loading.setAddress(toSave.getLoadingAddress());
loading.setLongitude(toSave.getLoadingLongitude());
loading.setLatitude(toSave.getLoadingLatitude());
loading.setContactName(toSave.getFreighterName());
loading.setContactPhone(toSave.getLoadingPhone());
loading.setLayDate(toSave.getLoadingDate());
loading.setLayType(1L);
loading.setDelFlag(1);
loading.setOrganizationId(toSave.getOrganizationId());
loading.setOrganizationName(toSave.getOrganizationName());
loading.setTopOrganizationId(toSave.getTopOrganizationId());
loading.setCreateBy(userId);
loading.setCreateTime(now);
loading.setUpdateBy(userId);
loading.setUpdateTime(now);
businessDocumentAddressMultiMapper.insert(loading);
// 卸货
BusinessDocumentAddressMulti unload = new BusinessDocumentAddressMulti();
unload.setOrderId(String.valueOf(orderId));
unload.setAreaCode(toSave.getUnloadAreaId());
unload.setAreaName(toSave.getUnloadName());
unload.setAddress(toSave.getUnloadAddress());
unload.setLongitude(toSave.getUnloadLongitude());
unload.setLatitude(toSave.getUnloadLatitude());
unload.setContactName(toSave.getDischargerName());
unload.setContactPhone(toSave.getUnloadPhone());
unload.setLayDate(toSave.getUnloadingData());
unload.setLayType(2L);
unload.setDelFlag(1);
unload.setOrganizationId(toSave.getOrganizationId());
unload.setOrganizationName(toSave.getOrganizationName());
unload.setTopOrganizationId(toSave.getTopOrganizationId());
unload.setCreateBy(userId);
unload.setCreateTime(now);
unload.setUpdateBy(userId);
unload.setUpdateTime(now);
businessDocumentAddressMultiMapper.insert(unload);
} }
private void copySnapshot(BusinessDocumentOrder order, BusinessDocumentOrderAdjustDetail detail) { private void copySnapshot(BusinessDocumentOrder order, BusinessDocumentOrderAdjustDetail detail) {
@@ -545,10 +716,111 @@ public class BusinessDocumentOrderAdjustService {
if (executeOrders == null || executeOrders.isEmpty()) { if (executeOrders == null || executeOrders.isEmpty()) {
return; return;
} }
log.info("业务单[{}]调整完成,关联执行单[{}]。如需回写TMS请接入TMS改费Feign。", goodsNumber, for (ExecuteOrder executeOrder : executeOrders) {
executeOrders.stream().map(ExecuteOrder::getGoodsNumber).collect(Collectors.toList())); // 仅已下发 TMS(存在 TMS 单号)的执行单需要同步修改
if (StrUtil.isBlank(executeOrder.getTmsOrderNumber())) {
continue;
}
syncTmsOrder(executeOrder, after);
}
} catch (Exception e) { } catch (Exception e) {
log.error("同步TMS失败,不影响主流程", e); log.error("同步TMS失败,不影响主流程", e);
} }
} }
/**
* 同步修改单个 TMS 订单按调整后业务单重新组装 TmsOrderAddDTO
* executeOrderNumber 定位 TMS 订单调用 TMS /feign/order/update 接口
*/
private void syncTmsOrder(ExecuteOrder executeOrder, BusinessDocumentOrder after) {
TmsOrderAddDTO tmsOrderAddDTO = new TmsOrderAddDTO();
BeanUtil.copyProperties(after, tmsOrderAddDTO);
// id OMS 业务单主键TMS 侧用作 tms_order_account.order_id 口径
// TMS update 在覆盖前会保留 tms_order 真实主键不会被污染
tmsOrderAddDTO.setId(String.valueOf(after.getId()));
// TMS 侧按执行单号定位订单
tmsOrderAddDTO.setExecuteOrderId(String.valueOf(executeOrder.getId()));
tmsOrderAddDTO.setExecuteOrderNumber(executeOrder.getGoodsNumber());
tmsOrderAddDTO.setGoodsNumber(after.getGoodsNumber());
tmsOrderAddDTO.setOrderSource("0");
// TMS update appointShipperId(业务单货主) 定位货主需显式带上口径与下单一致
if (StrUtil.isNotBlank(after.getAppointShipperId())) {
tmsOrderAddDTO.setAppointShipperId(after.getAppointShipperId());
}
if (after.getAppointShipper() != null) {
tmsOrderAddDTO.setAppointShipper(after.getAppointShipper());
}
if (after.getSzwlUserId() != null) {
tmsOrderAddDTO.setSzwlUserId(after.getSzwlUserId());
}
// 货物信息
List<BusinessDocumentCargoMulti> cargoList = businessDocumentCargoMultiMapper.selectList(
new LambdaQueryWrapper<BusinessDocumentCargoMulti>()
.eq(BusinessDocumentCargoMulti::getOrderId, String.valueOf(after.getId()))
.eq(BusinessDocumentCargoMulti::getDelFlag, 1));
List<TmsCargoInfoDTO> cargoInfoList = new ArrayList<>();
if (cargoList != null) {
for (BusinessDocumentCargoMulti cargo : cargoList) {
TmsCargoInfoDTO dto = new TmsCargoInfoDTO();
BeanUtil.copyProperties(cargo, dto);
cargoInfoList.add(dto);
}
}
tmsOrderAddDTO.setCargoInfoList(cargoInfoList);
// 装货地址统一以调整后业务单的扁平字段为准避免明细表(business_document_address_multi)旧值覆盖
TmsAddressMultiDTO loadingDto = new TmsAddressMultiDTO();
loadingDto.setAreaCode(after.getLoadingAreaId());
loadingDto.setAreaName(after.getLoadingName());
loadingDto.setAddress(after.getLoadingAddress());
loadingDto.setLongitude(after.getLoadingLongitude());
loadingDto.setLatitude(after.getLoadingLatitude());
loadingDto.setContactName(after.getFreighterName());
loadingDto.setContactPhone(after.getLoadingPhone());
loadingDto.setLayDate(after.getLoadingDate());
loadingDto.setLayType(1);
List<TmsAddressMultiDTO> loadingAddressList = new ArrayList<>();
loadingAddressList.add(loadingDto);
tmsOrderAddDTO.setLoadingAddressList(loadingAddressList);
// 卸货地址同样以调整后业务单的扁平字段为准
TmsAddressMultiDTO unloadDto = new TmsAddressMultiDTO();
unloadDto.setAreaCode(after.getUnloadAreaId());
unloadDto.setAreaName(after.getUnloadName());
unloadDto.setAddress(after.getUnloadAddress());
unloadDto.setLongitude(after.getUnloadLongitude());
unloadDto.setLatitude(after.getUnloadLatitude());
unloadDto.setContactName(after.getDischargerName());
unloadDto.setContactPhone(after.getUnloadPhone());
unloadDto.setLayDate(after.getUnloadingData());
unloadDto.setLayType(2);
List<TmsAddressMultiDTO> unloadAddressList = new ArrayList<>();
unloadAddressList.add(unloadDto);
tmsOrderAddDTO.setUnloadAddressList(unloadAddressList);
// 费用明细
List<BusinessOrderAccount> accountList = businessOrderAccountMapper.selectList(
new LambdaQueryWrapper<BusinessOrderAccount>()
.eq(BusinessOrderAccount::getOrderId, after.getId())
.eq(BusinessOrderAccount::getIsDelete, 0));
List<TmsOrderAccount> tmsOrderAccountList = new ArrayList<>();
if (accountList != null) {
for (BusinessOrderAccount acc : accountList) {
TmsOrderAccount dto = new TmsOrderAccount();
BeanUtil.copyProperties(acc, dto);
tmsOrderAccountList.add(dto);
}
}
tmsOrderAddDTO.setTmsOrderAccountList(tmsOrderAccountList);
AjaxResult result = wlhyServiceFeign.update(tmsOrderAddDTO);
if (result != null && "200".equals(String.valueOf(result.get("code")))) {
log.info("调整后同步修改TMS订单成功,执行单[{}],业务单[{}]", executeOrder.getGoodsNumber(), after.getGoodsNumber());
} else {
log.error("调整后同步修改TMS订单失败,执行单[{}],返回: {}", executeOrder.getGoodsNumber(),
result == null ? "null" : result.get("msg"));
}
}
} }
@@ -8,6 +8,7 @@ import com.mhd.common.core.web.domain.BaseVOEntity;
import java.math.BigDecimal; import java.math.BigDecimal;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@@ -659,7 +660,7 @@ public class BusinessDocumentOrder extends BaseVOEntity{
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private Date documentDate; private Date documentDate;
@ApiModelProperty( "审核状态 0-未审核 1-审核通过 2-已驳回 3-调整待审核") @ApiModelProperty( "审核状态 0-未审核 1-审核通过 2-已驳回 3-调整待审核 4-调整驳回")
private Long reviewStatus; private Long reviewStatus;
@ApiModelProperty("审核时间") @ApiModelProperty("审核时间")
@@ -826,6 +827,34 @@ public class BusinessDocumentOrder extends BaseVOEntity{
@Excel(name = "车次") @Excel(name = "车次")
private String shuttleNo; private String shuttleNo;
@ApiModelProperty("业务单调整状态 0-无 1-调整待审核 2-调整驳回 3-调整已通过") /**
private Integer adjustStatus; * 前端整单回传时携带的费用明细(business_order_account)非表字段仅用于订单调整入参接收
* 与顶层 feeDetailList 二选一后端在 adjust() 中做回退兼容
*/
@com.baomidou.mybatisplus.annotation.TableField(exist = false)
private List<com.mhd.oms.domain.businessOrderAccount.BusinessOrderAccount> businessOrderAccountList;
/**
* 前端整单回传时的装货地址(单个)非表字段仅用于订单调整入参接收与映射到 loading* 扁平字段
*/
@com.baomidou.mybatisplus.annotation.TableField(exist = false)
private com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO shipment;
/**
* 前端整单回传时的卸货地址(单个)非表字段仅用于订单调整入参接收与映射到 unload* 扁平字段
*/
@com.baomidou.mybatisplus.annotation.TableField(exist = false)
private com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO receipt;
/**
* 前端整单回传时的装货地址集合非表字段仅用于订单调整入参接收与映射
*/
@com.baomidou.mybatisplus.annotation.TableField(exist = false)
private List<com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO> loadingAddressList;
/**
* 前端整单回传时的卸货地址集合非表字段仅用于订单调整入参接收与映射
*/
@com.baomidou.mybatisplus.annotation.TableField(exist = false)
private List<com.mhd.oms.interfaces.dto.businessDocumentAddressMulti.BusinessDocumentAddressMultiDTO> unloadAddressList;
} }
@@ -3,8 +3,10 @@ package com.mhd.oms.domain.businessDocumentOrderAdjust.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@@ -38,6 +40,8 @@ public class BusinessDocumentOrderAdjust implements Serializable {
private String adjustByName; private String adjustByName;
@ApiModelProperty("调整时间") @ApiModelProperty("调整时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date adjustTime; private Date adjustTime;
@ApiModelProperty("调整原因") @ApiModelProperty("调整原因")
@@ -59,6 +63,8 @@ public class BusinessDocumentOrderAdjust implements Serializable {
private String auditByName; private String auditByName;
@ApiModelProperty("审核时间") @ApiModelProperty("审核时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date auditTime; private Date auditTime;
@ApiModelProperty("审核/驳回意见") @ApiModelProperty("审核/驳回意见")
@@ -77,6 +83,8 @@ public class BusinessDocumentOrderAdjust implements Serializable {
private String createName; private String createName;
@ApiModelProperty("创建时间") @ApiModelProperty("创建时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
@ApiModelProperty("更新人") @ApiModelProperty("更新人")
@@ -86,6 +94,8 @@ public class BusinessDocumentOrderAdjust implements Serializable {
private String updateName; private String updateName;
@ApiModelProperty("更新时间") @ApiModelProperty("更新时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime; private Date updateTime;
@ApiModelProperty("删除标记 1-正常 0-删除") @ApiModelProperty("删除标记 1-正常 0-删除")
@@ -3,8 +3,12 @@ package com.mhd.oms.domain.businessDocumentOrderAdjustDetail.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -24,9 +28,11 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable {
@ApiModelProperty("主键") @ApiModelProperty("主键")
@TableId(type = IdType.ASSIGN_ID) @TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
@ApiModelProperty("关联调整主记录ID") @ApiModelProperty("关联调整主记录ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long adjustId; private Long adjustId;
@ApiModelProperty("业务单ID") @ApiModelProperty("业务单ID")
@@ -51,6 +57,8 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable {
private String loadingAddress; private String loadingAddress;
@ApiModelProperty("装货时间") @ApiModelProperty("装货时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date loadingDate; private Date loadingDate;
@ApiModelProperty("卸货地") @ApiModelProperty("卸货地")
@@ -60,6 +68,8 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable {
private String unloadAddress; private String unloadAddress;
@ApiModelProperty("卸货时间") @ApiModelProperty("卸货时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date unloadingData; private Date unloadingData;
@ApiModelProperty("发货人") @ApiModelProperty("发货人")
@@ -81,6 +91,8 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable {
private String route; private String route;
@ApiModelProperty("单据日期") @ApiModelProperty("单据日期")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date documentDate; private Date documentDate;
@ApiModelProperty("组织ID") @ApiModelProperty("组织ID")
@@ -154,12 +166,16 @@ public class BusinessDocumentOrderAdjustDetail implements Serializable {
private String createName; private String createName;
@ApiModelProperty("创建时间") @ApiModelProperty("创建时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
@ApiModelProperty("更新人") @ApiModelProperty("更新人")
private String updateBy; private String updateBy;
@ApiModelProperty("更新时间") @ApiModelProperty("更新时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime; private Date updateTime;
@ApiModelProperty("删除标记 1-正常 0-删除") @ApiModelProperty("删除标记 1-正常 0-删除")
@@ -610,6 +610,12 @@ public class OmsAddressMultiService implements IOmsAddressMultiService {
List<OmsOrderAccount> tmsOrderAccountList = tmsOrderAddDTO.getTmsOrderAccountList(); List<OmsOrderAccount> tmsOrderAccountList = tmsOrderAddDTO.getTmsOrderAccountList();
if (ObjectUtil.isNotNull(tmsOrderAccountList) && tmsOrderAccountList.size() > 0) { if (ObjectUtil.isNotNull(tmsOrderAccountList) && tmsOrderAccountList.size() > 0) {
for (OmsOrderAccount tmsOrderAccount : tmsOrderAccountList) { for (OmsOrderAccount tmsOrderAccount : tmsOrderAccountList) {
// 防御account_id 为空或<=0 时跳过避免唯一约束撞库 + 插入脏数据
if (tmsOrderAccount.getAccountId() == null || tmsOrderAccount.getAccountId() <= 0) {
log.warn("订单费用科目 accountId 为空,已跳过该条, orderId={}, subjectName={}",
resevationOrder.getId(), tmsOrderAccount.getSubjectName());
continue;
}
tmsOrderAccount.setIsDelete(0); tmsOrderAccount.setIsDelete(0);
tmsOrderAccount.setOrderId(String.valueOf(resevationOrder.getId())); tmsOrderAccount.setOrderId(String.valueOf(resevationOrder.getId()));
tmsOrderAccount.setCreateBy(String.valueOf(userPo.getUserId())); tmsOrderAccount.setCreateBy(String.valueOf(userPo.getUserId()));
@@ -1119,6 +1125,12 @@ public class OmsAddressMultiService implements IOmsAddressMultiService {
// 插入新的费用科目信息 // 插入新的费用科目信息
for (OmsOrderAccount tmsOrderAccount : tmsOrderAccountList) { for (OmsOrderAccount tmsOrderAccount : tmsOrderAccountList) {
// 防御account_id 为空或<=0 时跳过
if (tmsOrderAccount.getAccountId() == null || tmsOrderAccount.getAccountId() <= 0) {
log.warn("订单费用科目 accountId 为空,已跳过该条, orderId={}, subjectName={}",
resevationOrder.getId(), tmsOrderAccount.getSubjectName());
continue;
}
tmsOrderAccount.setIsDelete(0); tmsOrderAccount.setIsDelete(0);
tmsOrderAccount.setOrderId(String.valueOf(resevationOrder.getId())); tmsOrderAccount.setOrderId(String.valueOf(resevationOrder.getId()));
tmsOrderAccount.setCreateBy(String.valueOf(userPo.getUserId())); tmsOrderAccount.setCreateBy(String.valueOf(userPo.getUserId()));
@@ -1,8 +1,12 @@
package com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust; package com.mhd.oms.interfaces.dto.businessDocumentOrderAdjust;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.mhd.oms.domain.businessDocumentOrderAdjustDetail.entity.BusinessDocumentOrderAdjustDetail; import com.mhd.oms.domain.businessDocumentOrderAdjustDetail.entity.BusinessDocumentOrderAdjustDetail;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@@ -16,6 +20,7 @@ public class BusinessDocumentOrderAdjustRecordDTO implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ApiModelProperty("主记录ID") @ApiModelProperty("主记录ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
@ApiModelProperty("业务单ID") @ApiModelProperty("业务单ID")
@@ -31,6 +36,8 @@ public class BusinessDocumentOrderAdjustRecordDTO implements Serializable {
private String adjustByName; private String adjustByName;
@ApiModelProperty("调整时间") @ApiModelProperty("调整时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date adjustTime; private Date adjustTime;
@ApiModelProperty("调整原因") @ApiModelProperty("调整原因")
@@ -49,6 +56,8 @@ public class BusinessDocumentOrderAdjustRecordDTO implements Serializable {
private String auditByName; private String auditByName;
@ApiModelProperty("审核时间") @ApiModelProperty("审核时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date auditTime; private Date auditTime;
@ApiModelProperty("审核/驳回意见") @ApiModelProperty("审核/驳回意见")
+2 -2
View File
@@ -19,14 +19,14 @@ spring:
# server-addr: 127.0.0.1:8848 # server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号 # 线上测试环境配置 容器名+端口号
# server-addr: 10.33.0.129:6010 # server-addr: 10.33.0.129:6010
server-addr: 10.102.192.31:6848 server-addr: 10.102.192.30:6848
username: nacos username: nacos
password: manhuoda@2023 password: manhuoda@2023
config: config:
# server-addr: 127.0.0.1:8848 # server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号 # 线上测试环境配置 容器名+端口号
# server-addr: 10.33.0.129:6010 # server-addr: 10.33.0.129:6010
server-addr: 10.102.192.31:6848 server-addr: 10.102.192.30:6848
username: nacos username: nacos
password: manhuoda@2023 password: manhuoda@2023
#线上正式环境 #线上正式环境
@@ -208,9 +208,9 @@ public class HandoverTaskOrderApplicationService {
public Boolean completeHandover(HandoverTaskOrderDO handoverTaskOrderDO){ public Boolean completeHandover(HandoverTaskOrderDO handoverTaskOrderDO){
Boolean result = handoverTaskOrderDomainService.completeHandover(handoverTaskOrderDO); Boolean result = handoverTaskOrderDomainService.completeHandover(handoverTaskOrderDO);
List<MaterialInventoryParamDO> clearoutParamDOs = handoverTaskOrderDomainService.getLastClearoutParamDOs(); List<MaterialInventoryParamDO> clearoutParamDOs = handoverTaskOrderDomainService.getLastClearoutParamDOs();
// for (MaterialInventoryParamDO paramDO : clearoutParamDOs) { for (MaterialInventoryParamDO paramDO : clearoutParamDOs) {
// materialInventoryApplicationService.pushBillingRecordClearout(paramDO.getMaterialInventoryId(), paramDO.getQuantity()); materialInventoryApplicationService.pushBillingRecordClearout(paramDO.getMaterialInventoryId(), paramDO.getQuantity());
// } }
return result; return result;
} }
@@ -9,46 +9,46 @@ import org.springframework.context.annotation.Configuration;
/** /**
* XXL-JOB 配置类 * XXL-JOB 配置类
*/ */
//@Configuration @Configuration
public class XxlJobConfig { public class XxlJobConfig {
// private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
//
// @Value("${xxl.job.admin.addresses}") @Value("${xxl.job.admin.addresses}")
// private String adminAddresses; private String adminAddresses;
//
// @Value("${xxl.job.accessToken}") @Value("${xxl.job.accessToken}")
// private String accessToken; private String accessToken;
//
// @Value("${xxl.job.executor.appname}") @Value("${xxl.job.executor.appname}")
// private String appname; private String appname;
//
// @Value("${xxl.job.executor.address}") @Value("${xxl.job.executor.address}")
// private String address; private String address;
//
// @Value("${xxl.job.executor.ip}") @Value("${xxl.job.executor.ip}")
// private String ip; private String ip;
//
// @Value("${xxl.job.executor.port}") @Value("${xxl.job.executor.port}")
// private int port; private int port;
//
// @Value("${xxl.job.executor.logpath}") @Value("${xxl.job.executor.logpath}")
// private String logPath; private String logPath;
//
// @Value("${xxl.job.executor.logretentiondays}") @Value("${xxl.job.executor.logretentiondays}")
// private int logRetentionDays; private int logRetentionDays;
//
// @Bean @Bean
// public XxlJobSpringExecutor xxlJobExecutor() { public XxlJobSpringExecutor xxlJobExecutor() {
// logger.info(">>>>>>>>>>> xxl-job config init."); logger.info(">>>>>>>>>>> xxl-job config init.");
// XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
// xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
// xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setAppname(appname);
// xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setAddress(address);
// xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setIp(ip);
// xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setPort(port);
// xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setAccessToken(accessToken);
// xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogPath(logPath);
// xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
// return xxlJobSpringExecutor; return xxlJobSpringExecutor;
// } }
} }
@@ -1864,7 +1864,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN NGWL_TEST_BMS.SETTLEMENT_CUSTOMERS bms ON sys.SETTLEMENT_CUSTOMERS_ID = bms.SETTLEMENT_CUSTOMERS_ID LEFT JOIN NGWL_TEST_BMS.SETTLEMENT_CUSTOMERS bms ON sys.SETTLEMENT_CUSTOMERS_ID = bms.SETTLEMENT_CUSTOMERS_ID
WHERE WHERE
1 = 1 1 = 1
AND CONTRACT_MANAGE_ID = #{contractManageId} AND DEL_FLAG = 1 AND sys.CONTRACT_MANAGE_ID = #{contractManageId} AND sys.DEL_FLAG = 1
</select> </select>