2 Commits
272 changed files with 1664 additions and 11894 deletions
BIN
View File
Binary file not shown.
@@ -18,7 +18,7 @@ import java.util.Set;
/** /**
* bms财务结算系统feign调用接口 * bms财务结算系统feign调用接口
*/ */
@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.109:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface BmsServiceFeign { public interface BmsServiceFeign {
@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE, url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface OmsServiceFeign { public interface OmsServiceFeign {
@@ -66,8 +66,4 @@ public interface OmsServiceFeign {
@ApiOperation("批量推送") @ApiOperation("批量推送")
@PostMapping("/reservationStockOutOrderApi/batchPushByNumber") @PostMapping("/reservationStockOutOrderApi/batchPushByNumber")
public AjaxResult batchPushByNumber(@RequestBody List<String> numberList); public AjaxResult batchPushByNumber(@RequestBody List<String> numberList);
@ApiOperation("保存电子签名记录")
@PostMapping("/electronicSignatureApi/saveSignature")
public AjaxResult saveSignature(@RequestBody ElectronicSignatureSyncDTO saveDTO);
} }
@@ -165,10 +165,6 @@ public interface UserServiceFeign {
@GetMapping("/userShipperApi/userShipperListAll") @GetMapping("/userShipperApi/userShipperListAll")
public AjaxResult<?> userShipperListAll(); public AjaxResult<?> userShipperListAll();
@ApiOperation("查询租户下全部托运人")
@GetMapping("/userShipperApi/userShipperListAllByOrg")
public AjaxResult<?> userShipperListAllByOrg(@RequestParam("orgCode") Long orgCode);
@ApiOperation("查询租户下全部承运人") @ApiOperation("查询租户下全部承运人")
@GetMapping("/userDriverApi/userDriverListAll") @GetMapping("/userDriverApi/userDriverListAll")
public AjaxResult<?> userDriverListAll(); public AjaxResult<?> userDriverListAll();
@@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.33.0.129:8014",configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.30:8014",configuration = FeignAutoConfiguration.class)
public interface WlhyServiceFeign { public interface WlhyServiceFeign {
/** /**
@@ -21,7 +21,7 @@ import java.util.Map;
* @description: TODO * @description: TODO
* @date 2024/5/10 8:58 * @date 2024/5/10 8:58
**/ **/
@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.33.0.109:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.3:8016", fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface WmsServiceFeign { public interface WmsServiceFeign {
/** /**
@@ -141,14 +141,4 @@ public interface WmsServiceFeign {
@ApiOperation("生成拣货单") @ApiOperation("生成拣货单")
@PostMapping("/stockOutOrderApi/genPickingOrderByOms") @PostMapping("/stockOutOrderApi/genPickingOrderByOms")
public AjaxResult genPickingOrderByOms(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO); public AjaxResult genPickingOrderByOms(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO);
/**
* OMS批量签名:更新WMS入/出库单签名字段
*
* <p>OMS端勾选记录批量签名后,通过此Feign调用WMS的 /stockSignatureApi/batchSign 接口,
* 同步更新WMS stock_in_order / stock_out_order 表的签名状态、签名时间、签名图片、签名备注。</p>
*/
@ApiOperation("OMS批量签名-同步WMS入/出库单签名字段")
@PostMapping("/stockSignatureApi/batchSign")
public AjaxResult batchSignWms(@RequestBody SignatureBatchFeignDTO dto);
} }
@@ -9,7 +9,7 @@ import com.mhd.system.api.feign.FeignAutoConfiguration;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,fallbackFactory = RemoteBmsFeignFallbackFactory.class,url = "http://10.102.192.4:8018", configuration = FeignAutoConfiguration.class)
public interface YmsServiceFeign { public interface YmsServiceFeign {
/** /**
@@ -1,108 +0,0 @@
package com.mhd.system.api.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 电子签名同步DTOWMS端通过Feign调用OMS
*/
@Data
public class ElectronicSignatureSyncDTO {
@ApiModelProperty("订单ID")
private Long orderId;
@ApiModelProperty("订单号")
private String orderNumber;
@ApiModelProperty("订单类型:IN-入库 OUT-出库")
private String orderType;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
private String warehouseName;
@ApiModelProperty("创建人")
private Long createBy;
@ApiModelProperty("创建人姓名")
private String createByName;
@ApiModelProperty("物料明细列表")
private List<MaterialDetailItem> materialDetailList;
@Data
public static class MaterialDetailItem {
@ApiModelProperty("物料基础信息ID")
private Long materialBaseInfoId;
@ApiModelProperty("物料编码")
private String materialCode;
@ApiModelProperty("物料名称")
private String materialName;
@ApiModelProperty("数量")
private BigDecimal quantity;
@ApiModelProperty("单位代码")
private String unitCode;
@ApiModelProperty("单位名称")
private String unitName;
@ApiModelProperty("批次号")
private String batchNumber;
@ApiModelProperty("LOT编号")
private String lotNumber;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
private String warehouseName;
@ApiModelProperty("库区ID")
private Long storageSectionId;
@ApiModelProperty("库区编码")
private String storageSectionCode;
@ApiModelProperty("库区名称")
private String storageSectionName;
@ApiModelProperty("库位ID")
private Long storageLocationId;
@ApiModelProperty("库位编码")
private String storageLocationCode;
@ApiModelProperty("库位名称")
private String storageLocationName;
@ApiModelProperty("业务唯一ID")
private Long uniqueId;
}
}
@@ -240,7 +240,9 @@ public class InMaterialDetail extends BaseVOEntity {
@ApiModelProperty("父级唯一Id") @ApiModelProperty("父级唯一Id")
private Long parentUniqueId; private Long parentUniqueId;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty("越库单id") @ApiModelProperty("越库单id")
private Long overStockId; private Long overStockId;
@@ -374,24 +376,4 @@ public class InMaterialDetail extends BaseVOEntity {
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd") @DateTimeFormat(pattern="yyyy-MM-dd")
private Date drinkDate; private Date drinkDate;
@ApiModelProperty("来货验收是否合格;1 合格,0 不合格")
@Excel(name = "来货验收是否合格;1 合格,0 不合格")
private String arrivalAcceptQualified;
@ApiModelProperty("包装是否破损;1 破损,0 完好")
@Excel(name = "包装是否破损;1 破损,0 完好")
private String packageDamaged;
@ApiModelProperty("是否解冻 / 水渍;1 是,0 否")
@Excel(name = "是否解冻 / 水渍;1 是,0 否")
private String isThawWaterstain;
@ApiModelProperty("问题货是否已通知客户;1 已通知,0 未通知")
@Excel(name = "问题货是否已通知客户;1 已通知,0 未通知")
private String notifyCustomerAbnormal;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
} }
@@ -244,10 +244,4 @@ public class MaterialBaseInfoFeign extends BaseVOEntity{
@ApiModelProperty(name = "单位") @ApiModelProperty(name = "单位")
private String unit; private String unit;
@ApiModelProperty(name = "组织(多个用,分开)")
private String orgId;
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
private Integer isNormalMaterial;
} }
@@ -1,42 +0,0 @@
package com.mhd.system.api.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
/**
* OMS→WMS 批量签名 Feign DTO
*
* <p>OMS端批量签名时,通过此DTO调用WMS的批量签名接口,
* 更新WMS stock_in_order / stock_out_order 表的签名字段。</p>
*/
@Data
public class SignatureBatchFeignDTO {
@ApiModelProperty("入库单ID列表")
private List<Long> inOrderIds;
@ApiModelProperty("出库单ID列表")
private List<Long> outOrderIds;
@ApiModelProperty("签名状态:2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64或URL,单张)")
private String signaturePic;
@ApiModelProperty("拍照取证图片(逗号分隔多张URL")
private String evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
}
@@ -50,8 +50,8 @@ public class StockOutOrder extends BaseVOEntity {
@Excel(name = "出库单号") @Excel(name = "出库单号")
private String outOrderNumber; private String outOrderNumber;
@ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核")
@Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核")
private Integer status; private Integer status;
@ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
@@ -124,20 +124,4 @@ public class WarehouseFeignPO extends BaseVOEntity{
@Excel(name = "作业模式") @Excel(name = "作业模式")
private String workMode; private String workMode;
@ApiModelProperty("订单号生成规则(0-日期累加 1-历史累加)")
@Excel(name = "单号生成规则")
private String orderNoGenerateRule;
@ApiModelProperty("入库单号首字母前缀")
@Excel(name = "入库单号首字母前缀")
private String inOrderNoPrefix;
@ApiModelProperty("出库单号首字母前缀")
@Excel(name = "出库单号首字母前缀")
private String outOrderNoPrefix;
@ApiModelProperty("样品出库单号首字母前缀")
@Excel(name = "样品出库单号首字母前缀")
private String sampleOutOrderNoPrefix;
} }
@@ -90,11 +90,6 @@ public class RemoteOmsFeignFallbackFactory implements FallbackFactory<OmsService
public AjaxResult batchPushByNumber(List<String> numberList) { public AjaxResult batchPushByNumber(List<String> numberList) {
return null; return null;
} }
@Override
public AjaxResult saveSignature(ElectronicSignatureSyncDTO saveDTO) {
return null;
}
}; };
} }
} }
@@ -140,11 +140,6 @@ public class RemoteUserFeignFallbackFactory implements FallbackFactory<UserServi
return AjaxResult.error("获取租户托运人失败"); return AjaxResult.error("获取租户托运人失败");
} }
@Override
public AjaxResult<?> userShipperListAllByOrg(Long orgCode) {
return null;
}
@Override @Override
public AjaxResult<?> userDriverListAll() { public AjaxResult<?> userDriverListAll() {
return AjaxResult.error("获取租户承运人失败"); return AjaxResult.error("获取租户承运人失败");
@@ -119,12 +119,6 @@ public class RemoteWmsFallbackFactory implements FallbackFactory<WmsServiceFeign
public AjaxResult genPickingOrderByOms(StockOutOrderDTO stockOutOrderDTO) { public AjaxResult genPickingOrderByOms(StockOutOrderDTO stockOutOrderDTO) {
return null; return null;
} }
@Override
public AjaxResult batchSignWms(SignatureBatchFeignDTO dto) {
log.error("WMS批量签名调用失败");
return AjaxResult.error("WMS批量签名调用失败:" + cause.getMessage());
}
}; };
} }
} }
@@ -79,7 +79,6 @@ public class SsoAuthorizeController {
// 5. 重定向到前端页面,token通过URL参数传递 // 5. 重定向到前端页面,token通过URL参数传递
// 前端页面需读取URL中的token参数并存入localStorage // 前端页面需读取URL中的token参数并存入localStorage
log.info("SSO单点登录成功, account={}", account); log.info("SSO单点登录成功, account={}", account);
log.info("SSO单点登录成功, account={}, token={} , redirectUrl={}", account, accessToken, redirectUrl);
response.sendRedirect(redirectUrl + "?token=" + URLEncoder.encode(accessToken, StandardCharsets.UTF_8.name())); response.sendRedirect(redirectUrl + "?token=" + URLEncoder.encode(accessToken, StandardCharsets.UTF_8.name()));
} catch (Exception e) { } catch (Exception e) {
@@ -50,7 +50,7 @@ public class SsoAuthorizeService {
@Value("${sso.public-key}") @Value("${sso.public-key}")
private String publicKeyStr; private String publicKeyStr;
@Value("${sso.redirect-url}") @Value("https://diglog.namkwong.com.mo/main_app/sso")
private String redirectUrl; private String redirectUrl;
@Resource @Resource
@@ -550,11 +550,11 @@ public class SysLoginService {
throw new ServiceException("请输入手机号和短信验证码"); throw new ServiceException("请输入手机号和短信验证码");
} }
// //调用工具类校验,校验手机号格式错误 //调用工具类校验,校验手机号格式错误
// if (!RegexUtil.isPhoneLegal(userPhone)) { if (!RegexUtil.isPhoneLegal(userPhone)) {
// recordLogininfor(userPhone, Constants.LOGIN_FAIL, UserError.USER_PHONE_REG_ERROR.errmsg(), 1); recordLogininfor(userPhone, Constants.LOGIN_FAIL, UserError.USER_PHONE_REG_ERROR.errmsg(), 1);
// throw new DigitalLogisticsException(UserError.USER_PHONE_REG_ERROR); throw new DigitalLogisticsException(UserError.USER_PHONE_REG_ERROR);
// } }
//根据域名获取一级组织ID //根据域名获取一级组织ID
AjaxResult topOrganizationIdR = organizationServiceFeign.getOrganizationByPath(path, SecurityConstants.INNER); AjaxResult topOrganizationIdR = organizationServiceFeign.getOrganizationByPath(path, SecurityConstants.INNER);
+3 -3
View File
@@ -15,7 +15,7 @@ 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
#线上正式环境 #线上正式环境
@@ -24,7 +24,7 @@ spring:
# 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.102.192.31:6848 server-addr: 10.102.192.30:6848
# 测试环境配置 容器名+端口号 # 测试环境配置 容器名+端口号
# server-addr: 10.33.0.129:6010 # server-addr: 10.33.0.129:6010
# 线上测试环境配置 容器名+端口号 # 线上测试环境配置 容器名+端口号
@@ -52,4 +52,4 @@ sso:
AwIDAQAB AwIDAQAB
-----END PUBLIC KEY----- -----END PUBLIC KEY-----
# SSO登录成功后跳转的前端页面地址 # SSO登录成功后跳转的前端页面地址
redirect-url: "https://diglog.namkwong.com.mo/main_app/sso" redirect-url: "/"
@@ -1,34 +0,0 @@
package com.mhd.bi.domain.biPlatformRealData.repository.mapper;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO;
import java.util.List;
/**
* 月台监测-真实数据 Mapper
* 数据来源:TEST_NGWL_YMS 库(达梦,跨库访问)
* 注:列名按达梦默认大写规则;若实际库中小写请反馈调整
*/
public interface BiPlatformRealDataMapper {
/** 作业车辆状态列表 */
List<RealPlatformVehiclePO> queryVehicles();
/** 月台实时概览(总数 / 当前作业中) */
RealPlatformOverviewPO queryPlatformOverview();
/** 今日作业任务数 */
Long countTodayTasks();
/** 车辆状态统计(今日) */
RealVehicleStatusPO queryVehicleStatusToday();
/** 本月任务量 */
Long countMonthTasks();
/** 任务负荷(今日 24 小时) */
List<RealTaskLoadPO> queryTaskLoadToday();
}
@@ -1,18 +0,0 @@
package com.mhd.bi.domain.biPlatformRealData.repository.po;
import lombok.Data;
import java.io.Serializable;
/**
* 月台实时概览(真实数据,来自 TEST_NGWL_YMS.QMS_WINDOW_INFO
*/
@Data
public class RealPlatformOverviewPO implements Serializable {
private static final long serialVersionUID = 1L;
/** 月台总数 */
private Long totalPlatforms;
/** 当前作业中(月台作业状态=占用) */
private Long operatingPlatforms;
}
@@ -1,30 +0,0 @@
package com.mhd.bi.domain.biPlatformRealData.repository.po;
import lombok.Data;
import java.io.Serializable;
/**
* 月台监测-作业车辆(真实数据,来自 TEST_NGWL_YMS.QMS_MAIN_BUSINESS 等)
*/
@Data
public class RealPlatformVehiclePO implements Serializable {
private static final long serialVersionUID = 1L;
/** 车牌号(qms_main_business.CARNO */
private String plateNumber;
/** 流程状态(qms_main_business.FLOWSTATUS */
private String status;
/** 叫号月台(qms_queue_list.WINDOWNAME */
private String platformId;
/** 月台作业时长,分钟(EXITTIME - ENTRYTIME */
private Long platformDuration;
/** 预约申请时间(qms_main_business.CREATE_TIME */
private String appointmentTime;
/** 作业楼层(qms_window_info.PLATFORMFLOOR */
private String workFloor;
}
@@ -1,18 +0,0 @@
package com.mhd.bi.domain.biPlatformRealData.repository.po;
import lombok.Data;
import java.io.Serializable;
/**
* 任务负荷统计(按小时,来自 TEST_NGWL_YMS.QMS_MAIN_BUSINESS
*/
@Data
public class RealTaskLoadPO implements Serializable {
private static final long serialVersionUID = 1L;
/** 0-23 小时 */
private Integer hourOfDay;
/** 该小时段任务数 */
private Long taskCount;
}
@@ -1,24 +0,0 @@
package com.mhd.bi.domain.biPlatformRealData.repository.po;
import lombok.Data;
import java.io.Serializable;
/**
* 作业车辆状态统计(真实数据,来自 TEST_NGWL_YMS.QMS_MAIN_BUSINESS
*/
@Data
public class RealVehicleStatusPO implements Serializable {
private static final long serialVersionUID = 1L;
/** 今日预约车辆 */
private Long todayReservedVehicles;
/** 当前未签到 */
private Long notCheckedIn;
/** 当前作业中 */
private Long operatingVehicles;
/** 作业完成 */
private Long completedVehicles;
}
@@ -1,214 +0,0 @@
package com.mhd.bi.domain.biPlatformRealData.service;
import com.mhd.bi.domain.biPlatformRealData.repository.mapper.BiPlatformRealDataMapper;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO;
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.PlatformVehicleItemVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskLoadItemVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* 月台监测-真实数据业务层(封装 YMS 跨库查询)
* 注:列名大小写、字段类型需以实际库为准;若 YMS 库无数据/无权限,相关方法应返回空/0,不影响写死字段写入快照
*/
@Slf4j
@Service
public class BiPlatformRealDataService {
@Resource
private BiPlatformRealDataMapper biPlatformRealDataMapper;
public List<RealPlatformVehiclePO> queryVehicles() {
try {
return biPlatformRealDataMapper.queryVehicles();
} catch (Exception e) {
log.error("【YMS】查询作业车辆列表失败: {}", e.getMessage(), e);
return java.util.Collections.emptyList();
}
}
public RealPlatformOverviewPO queryPlatformOverview() {
try {
RealPlatformOverviewPO po = biPlatformRealDataMapper.queryPlatformOverview();
if (po == null) {
po = new RealPlatformOverviewPO();
}
if (po.getTotalPlatforms() == null) po.setTotalPlatforms(0L);
if (po.getOperatingPlatforms() == null) po.setOperatingPlatforms(0L);
return po;
} catch (Exception e) {
log.error("【YMS】查询月台概览失败: {}", e.getMessage(), e);
RealPlatformOverviewPO po = new RealPlatformOverviewPO();
po.setTotalPlatforms(0L);
po.setOperatingPlatforms(0L);
return po;
}
}
public long countTodayTasks() {
try {
Long n = biPlatformRealDataMapper.countTodayTasks();
return n == null ? 0L : n;
} catch (Exception e) {
log.error("【YMS】统计今日作业任务失败: {}", e.getMessage(), e);
return 0L;
}
}
public RealVehicleStatusPO queryVehicleStatusToday() {
try {
RealVehicleStatusPO po = biPlatformRealDataMapper.queryVehicleStatusToday();
if (po == null) po = new RealVehicleStatusPO();
if (po.getTodayReservedVehicles() == null) po.setTodayReservedVehicles(0L);
if (po.getNotCheckedIn() == null) po.setNotCheckedIn(0L);
if (po.getOperatingVehicles() == null) po.setOperatingVehicles(0L);
if (po.getCompletedVehicles() == null) po.setCompletedVehicles(0L);
return po;
} catch (Exception e) {
log.error("【YMS】统计车辆状态失败: {}", e.getMessage(), e);
RealVehicleStatusPO po = new RealVehicleStatusPO();
po.setTodayReservedVehicles(0L);
po.setNotCheckedIn(0L);
po.setOperatingVehicles(0L);
po.setCompletedVehicles(0L);
return po;
}
}
public long countMonthTasks() {
try {
Long n = biPlatformRealDataMapper.countMonthTasks();
return n == null ? 0L : n;
} catch (Exception e) {
log.error("【YMS】统计本月任务量失败: {}", e.getMessage(), e);
return 0L;
}
}
public List<RealTaskLoadPO> queryTaskLoadToday() {
try {
return biPlatformRealDataMapper.queryTaskLoadToday();
} catch (Exception e) {
log.error("【YMS】统计任务负荷失败: {}", e.getMessage(), e);
return java.util.Collections.emptyList();
}
}
/**
* 实时组装月台监测数据:真实字段查 YMS 库,写死字段保留静态值。
* 每次调用实时查库,不经过快照表。
*/
public PlatformSurveillanceVO buildRealTimePlatformSurveillance() {
Random r = new Random();
PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r);
// 作业车辆列表
List<RealPlatformVehiclePO> realVehicles = queryVehicles();
List<PlatformVehicleItemVO> vehicleVos = new ArrayList<>();
for (RealPlatformVehiclePO rv : realVehicles) {
PlatformVehicleItemVO v = new PlatformVehicleItemVO();
v.setAppointmentTime(rv.getAppointmentTime());
v.setWorkFloor(rv.getWorkFloor());
v.setPlateNumber(rv.getPlateNumber());
v.setStatus(translateFlowStatus(rv.getStatus()));
v.setPlatformId(rv.getPlatformId());
v.setPlatformDuration(rv.getPlatformDuration() == null ? 0 : rv.getPlatformDuration().intValue());
vehicleVos.add(v);
}
if (!vehicleVos.isEmpty()) {
template.setVehicles(vehicleVos);
}
// 月台实时概览
RealPlatformOverviewPO ov = queryPlatformOverview();
if (template.getPlatformOverview() != null) {
template.getPlatformOverview().setTotalPlatforms(ov.getTotalPlatforms().intValue());
template.getPlatformOverview().setOperatingPlatforms(ov.getOperatingPlatforms().intValue());
int total = ov.getTotalPlatforms().intValue();
int occ = ov.getOperatingPlatforms().intValue();
double rate = total > 0 ? Math.round(((double) occ / total) * 100.0 * 100.0) / 100.0 : 0d;
template.getPlatformOverview().setCurrentOccupancyRate(rate);
}
long todayTasks = countTodayTasks();
if (template.getPlatformOverview() != null) {
template.getPlatformOverview().setTodayTasks((int) todayTasks);
}
// 作业车辆状态统计
RealVehicleStatusPO vs = queryVehicleStatusToday();
if (template.getVehicleStatus() != null) {
template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue());
template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue());
template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue());
template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue());
}
// 本月任务统计 taskTotal
long monthTasks = countMonthTasks();
if (template.getMonthlyTaskStatistics() != null) {
template.getMonthlyTaskStatistics().setTaskTotal((int) monthTasks);
}
// 任务负荷(今日 24 小时)
List<RealTaskLoadPO> loads = queryTaskLoadToday();
if (!loads.isEmpty() && template.getTaskLoadStatistics() != null) {
Map<Integer, Long> hourMap = new HashMap<>();
for (RealTaskLoadPO l : loads) {
hourMap.put(l.getHourOfDay(), l.getTaskCount());
}
for (TaskLoadItemVO item : template.getTaskLoadStatistics()) {
Integer hour = parseHourFromLabel(item.getTime());
if (hour != null) {
Long n = hourMap.get(hour);
if (n != null) item.setTaskCount(n.intValue());
}
}
}
return template;
}
private static Integer parseHourFromLabel(String label) {
if (label == null) return null;
try {
String s = label.replace("", "").trim();
return Integer.parseInt(s);
} catch (Exception e) {
return null;
}
}
/**
* FLOW_STATUS 数字转中文:1已预约 2已签到 3已叫号 4已过号 5已进场 6已称重 7已装车 8二次称重 9已结算 10已还卡 11已出场 12已取消
*/
private static String translateFlowStatus(String flowStatus) {
if (flowStatus == null) return null;
switch (flowStatus.trim()) {
case "1": return "已预约";
case "2": return "已签到";
case "3": return "已叫号";
case "4": return "已过号";
case "5": return "已进场";
case "6": return "已称重";
case "7": return "已装车";
case "8": return "二次称重";
case "9": return "已结算";
case "10": return "已还卡";
case "11": return "已出场";
case "12": return "已取消";
default: return flowStatus;
}
}
}
@@ -85,7 +85,7 @@ public final class BiReportSnapshotMapperSupport {
.entryOvertimeRate(0).overtimeCount(0).platformOnTimeRate(0) .entryOvertimeRate(0).overtimeCount(0).platformOnTimeRate(0)
.avgPlatformDuration(0d).yardOnTimeRate(0).avgYardDuration(0d).build()) .avgPlatformDuration(0d).yardOnTimeRate(0).avgYardDuration(0d).build())
.platformOverview(PlatformOverviewVO.builder() .platformOverview(PlatformOverviewVO.builder()
.totalPlatforms(0).currentOccupancyRate(0d).operatingPlatforms(0).todayTasks(0).build()) .totalPlatforms(0).currentOccupancyRate(0).operatingPlatforms(0).todayTasks(0).build())
.vehicleStatus(VehicleStatusVO.builder() .vehicleStatus(VehicleStatusVO.builder()
.todayReservedVehicles(0).notCheckedIn(0).operatingVehicles(0).completedVehicles(0).build()) .todayReservedVehicles(0).notCheckedIn(0).operatingVehicles(0).completedVehicles(0).build())
.avgOperationDurationTrend(Collections.emptyList()) .avgOperationDurationTrend(Collections.emptyList())
@@ -13,20 +13,10 @@ import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillance
import com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone.HkMacaoServiceZoneVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone.HkMacaoServiceZoneVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformVehicleItemVO;
import com.mhd.bi.domain.biPlatformRealData.service.BiPlatformRealDataService;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO;
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Random; import java.util.Random;
/** /**
@@ -44,7 +34,6 @@ public class BiReportSnapshotSyncService {
private final BiSnapshotWriteMapper biSnapshotWriteMapper; private final BiSnapshotWriteMapper biSnapshotWriteMapper;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final BiPlatformRealDataService biPlatformRealDataService;
/** /**
* 依次同步各快照表;单表失败不影响其它表,只记日志。 * 依次同步各快照表;单表失败不影响其它表,只记日志。
@@ -148,87 +137,9 @@ public class BiReportSnapshotSyncService {
return BiSnapshotWeeklyRandomDataBuilder.warehouseTransport(new Random()); return BiSnapshotWeeklyRandomDataBuilder.warehouseTransport(new Random());
} }
/** TODO 业务落地:部分字段改为真实数据,其余仍写死。 */ /** TODO 业务落地:改为查询真实数据。临时实现见 {@link BiSnapshotWeeklyRandomDataBuilder#platformSurveillance(Random)}。 */
protected PlatformSurveillanceVO buildPlatformSurveillanceSnapshot() { protected PlatformSurveillanceVO buildPlatformSurveillanceSnapshot() {
Random r = new Random(); return BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(new Random());
// 写死数据复用原 builder
PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r);
// ====== 真实数据:作业车辆列表 ======
List<RealPlatformVehiclePO> realVehicles = biPlatformRealDataService.queryVehicles();
List<PlatformVehicleItemVO> vehicleVos = new ArrayList<>();
for (RealPlatformVehiclePO rv : realVehicles) {
PlatformVehicleItemVO v = new PlatformVehicleItemVO();
v.setAppointmentTime(rv.getAppointmentTime());
v.setWorkFloor(rv.getWorkFloor());
v.setPlateNumber(rv.getPlateNumber());
v.setStatus(rv.getStatus());
v.setPlatformId(rv.getPlatformId());
v.setPlatformDuration(rv.getPlatformDuration() == null ? 0 : rv.getPlatformDuration().intValue());
vehicleVos.add(v);
}
if (!vehicleVos.isEmpty()) {
template.setVehicles(vehicleVos);
}
// ====== 真实数据:月台实时概览 ======
RealPlatformOverviewPO ov = biPlatformRealDataService.queryPlatformOverview();
if (template.getPlatformOverview() != null) {
template.getPlatformOverview().setTotalPlatforms(ov.getTotalPlatforms().intValue());
template.getPlatformOverview().setOperatingPlatforms(ov.getOperatingPlatforms().intValue());
int total = ov.getTotalPlatforms().intValue();
int occ = ov.getOperatingPlatforms().intValue();
double rate = total > 0 ? Math.round(((double) occ / total) * 100.0 * 100.0) / 100.0 : 0d;
template.getPlatformOverview().setCurrentOccupancyRate(rate);
}
long todayTasks = biPlatformRealDataService.countTodayTasks();
if (template.getPlatformOverview() != null) {
template.getPlatformOverview().setTodayTasks((int) todayTasks);
}
// ====== 真实数据:作业车辆状态统计 ======
RealVehicleStatusPO vs = biPlatformRealDataService.queryVehicleStatusToday();
if (template.getVehicleStatus() != null) {
template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue());
template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue());
template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue());
template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue());
}
// ====== 真实数据:本月任务统计 taskTotal ======
long monthTasks = biPlatformRealDataService.countMonthTasks();
if (template.getMonthlyTaskStatistics() != null) {
template.getMonthlyTaskStatistics().setTaskTotal((int) monthTasks);
}
// ====== 真实数据:任务负荷(今日 24 小时) ======
List<RealTaskLoadPO> loads = biPlatformRealDataService.queryTaskLoadToday();
if (!loads.isEmpty() && template.getTaskLoadStatistics() != null) {
Map<Integer, Long> hourMap = new HashMap<>();
for (RealTaskLoadPO l : loads) {
hourMap.put(l.getHourOfDay(), l.getTaskCount());
}
for (com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskLoadItemVO item : template.getTaskLoadStatistics()) {
Integer hour = parseHourFromLabel(item.getTime());
if (hour != null) {
Long n = hourMap.get(hour);
if (n != null) item.setTaskCount(n.intValue());
}
}
}
return template;
}
private static Integer parseHourFromLabel(String label) {
if (label == null) return null;
// "15时" -> 15
try {
String s = label.replace("", "").trim();
return Integer.parseInt(s);
} catch (Exception e) {
return null;
}
} }
/** /**
@@ -127,8 +127,6 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
for (String[] row : Baseline.P_PLATES) { for (String[] row : Baseline.P_PLATES) {
int dur = jitterInt(Integer.parseInt(row[3]), r); int dur = jitterInt(Integer.parseInt(row[3]), r);
vehicles.add(PlatformVehicleItemVO.builder() vehicles.add(PlatformVehicleItemVO.builder()
.appointmentTime(Baseline.P_APPOINTMENT_TIME)
.workFloor(Baseline.P_WORK_FLOOR)
.plateNumber(row[0]) .plateNumber(row[0])
.status(row[1]) .status(row[1])
.platformId(row[2]) .platformId(row[2])
@@ -147,7 +145,7 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
PlatformOverviewVO overview = PlatformOverviewVO.builder() PlatformOverviewVO overview = PlatformOverviewVO.builder()
.totalPlatforms(Math.max(1, jitterInt(Baseline.P_TOT_PL, r))) .totalPlatforms(Math.max(1, jitterInt(Baseline.P_TOT_PL, r)))
.currentOccupancyRate((double) jitterPercentInt(Baseline.P_OCC, r)) .currentOccupancyRate(jitterPercentInt(Baseline.P_OCC, r))
.operatingPlatforms(Math.max(0, jitterInt(Baseline.P_OP, r))) .operatingPlatforms(Math.max(0, jitterInt(Baseline.P_OP, r)))
.todayTasks(Math.max(0, jitterInt(Baseline.P_TASKS, r))) .todayTasks(Math.max(0, jitterInt(Baseline.P_TASKS, r)))
.build(); .build();
@@ -396,8 +394,6 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
static final String[] W_CUST_NAMES = {"华东冷链", "华南汽配", "西南快消", "华北家电", "跨境达"}; static final String[] W_CUST_NAMES = {"华东冷链", "华南汽配", "西南快消", "华北家电", "跨境达"};
static final int[] W_CUST_AMT = {198, 172, 205, 189, 221}; static final int[] W_CUST_AMT = {198, 172, 205, 189, 221};
static final String P_APPOINTMENT_TIME = "2026-08-03 09:30:00";
static final String P_WORK_FLOOR = "一楼";
static final String[][] P_PLATES = { static final String[][] P_PLATES = {
{"粤A12345", "待入场", "#12", "88"}, {"粤A12345", "待入场", "#12", "88"},
{"闽D99887", "作业中", "#07", "142"}, {"闽D99887", "作业中", "#07", "142"},
@@ -3,7 +3,6 @@ package com.mhd.bi.interfaces.facadeApi.biReport;
import com.mhd.bi.domain.biSnapshotSync.service.BiReportSnapshotSyncService; import com.mhd.bi.domain.biSnapshotSync.service.BiReportSnapshotSyncService;
import com.mhd.bi.domain.biComprehensive.service.BiComprehensiveReportService; import com.mhd.bi.domain.biComprehensive.service.BiComprehensiveReportService;
import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceReportService; import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceReportService;
import com.mhd.bi.domain.biPlatformRealData.service.BiPlatformRealDataService;
import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService; import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService;
import com.mhd.bi.domain.biHkMacaoServiceZone.service.BiHkMacaoServiceZoneReportService; import com.mhd.bi.domain.biHkMacaoServiceZone.service.BiHkMacaoServiceZoneReportService;
import com.mhd.bi.domain.biTransportOperationZone.service.BiTransportOperationZoneReportService; import com.mhd.bi.domain.biTransportOperationZone.service.BiTransportOperationZoneReportService;
@@ -49,9 +48,6 @@ public class BiReportApi extends BaseController {
@Autowired @Autowired
private BiPlatformSurveillanceReportService biPlatformSurveillanceReportService; private BiPlatformSurveillanceReportService biPlatformSurveillanceReportService;
@Autowired
private BiPlatformRealDataService biPlatformRealDataService;
@Autowired @Autowired
private BiOverallOperationReportService biOverallOperationReportService; private BiOverallOperationReportService biOverallOperationReportService;
@@ -96,12 +92,12 @@ public class BiReportApi extends BaseController {
} }
/** /**
* 月台监测指标查询(实时查 YMS 库,真实字段 + 写死字段 * 月台监测指标查询(按照 del_flag=1,按 create_time 最新一条
*/ */
@ApiOperation(value = "月台监测指标查询", notes = "每次调用实时查询 YMS 库组装;部分字段为真实业务数据,部分为写死数据") @ApiOperation(value = "月台监测指标查询", notes = "返回 DEL_FLAG=1 且 CREATE_TIME 最新的一条快照")
@GetMapping("/platformSurveillance") @GetMapping("/platformSurveillance")
public BiApiResult<PlatformSurveillanceVO> platformSurveillance() { public BiApiResult<PlatformSurveillanceVO> platformSurveillance() {
PlatformSurveillanceVO data = biPlatformRealDataService.buildRealTimePlatformSurveillance(); PlatformSurveillanceVO data = biPlatformSurveillanceReportService.loadLatestPlatformSurveillance();
return BiApiResult.ok(data); return BiApiResult.ok(data);
} }
//园区物流大屏接口---------------------------------------------------------------------- //园区物流大屏接口----------------------------------------------------------------------
@@ -18,7 +18,7 @@ public class PlatformOverviewVO {
private Integer totalPlatforms; private Integer totalPlatforms;
@ApiModelProperty("当前占用率,单位:%") @ApiModelProperty("当前占用率,单位:%")
private Double currentOccupancyRate; private Integer currentOccupancyRate;
@ApiModelProperty("当前作业中,单位:个") @ApiModelProperty("当前作业中,单位:个")
private Integer operatingPlatforms; private Integer operatingPlatforms;
@@ -14,12 +14,6 @@ import lombok.NoArgsConstructor;
@ApiModel("月台监测-作业车辆") @ApiModel("月台监测-作业车辆")
public class PlatformVehicleItemVO { public class PlatformVehicleItemVO {
@ApiModelProperty("预约申请时间")
private String appointmentTime;
@ApiModelProperty("作业楼层")
private String workFloor;
@ApiModelProperty("车牌号码") @ApiModelProperty("车牌号码")
private String plateNumber; private String plateNumber;
+5 -5
View File
@@ -16,17 +16,17 @@ spring:
# 线上测试环境配置 容器名+端口号 # 线上测试环境配置 容器名+端口号
# server-addr: 10.33.0.129:6010 # server-addr: 10.33.0.129:6010
# server-addr: 10.102.192.5:6848 # server-addr: 10.102.192.5:6848
username: nacos
password: manhuoda@2023
#线上正式环境
server-addr: 10.102.192.30:6848
# username: nacos # username: nacos
# password: manhuoda@2023 # password: manhuoda@2023
#线上正式环境
server-addr: 10.102.192.31:6848
username: nacos
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.30:6848 server-addr: 10.102.192.31:6848
username: nacos username: nacos
password: manhuoda@2023 password: manhuoda@2023
#线上正式环境 #线上正式环境
@@ -1,79 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mhd.bi.domain.biPlatformRealData.repository.mapper.BiPlatformRealDataMapper">
<!-- 作业车辆状态列表(vehicles):
plateNumber <- qms_main_business.CAR_NO
status <- qms_main_business.FLOW_STATUS
platformId <- qms_main_business.WINDOW_NAME(叫号月台,主业务表直接有)
platformDuration <- qms_main_business.EXIT_TIME - ENTRY_TIME(分钟)
appointmentTime <- qms_main_business.CREATE_TIME
workFloor <- qms_window_info.PLATFORM_FLOOR(按 WINDOW_NAME 关联)
-->
<select id="queryVehicles" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO">
SELECT
mb.CAR_NO AS plateNumber,
mb.FLOW_STATUS AS status,
mb.WINDOW_NAME AS platformId,
CASE
WHEN mb.EXIT_TIME IS NOT NULL AND mb.ENTRY_TIME IS NOT NULL
THEN CAST((mb.EXIT_TIME - mb.ENTRY_TIME) * 24 * 60 AS BIGINT)
ELSE 0
END AS platformDuration,
TO_CHAR(mb.CREATE_TIME, 'YYYY-MM-DD HH24:MI:SS') AS appointmentTime,
wi.PLATFORM_FLOOR AS workFloor
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS mb
LEFT JOIN NGWL_TEST_YMS.QMS_WINDOW_INFO wi
ON wi.WINDOW_NAME = mb.WINDOW_NAME
ORDER BY mb.CREATE_TIME DESC
</select>
<!-- 月台概览:totalPlatforms(总条数)、operatingPlatforms(作业状态=占用,JOB_STATUS: 0空闲 1占用) -->
<select id="queryPlatformOverview" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO">
SELECT
COUNT(1) AS totalPlatforms,
SUM(CASE WHEN JOB_STATUS = 1 THEN 1 ELSE 0 END) AS operatingPlatforms
FROM NGWL_TEST_YMS.QMS_WINDOW_INFO
</select>
<!-- 今日作业任务:实际进入时间是今日的 -->
<select id="countTodayTasks" resultType="java.lang.Long">
SELECT COUNT(1)
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
WHERE ENTRY_TIME IS NOT NULL
AND TRUNC(ENTRY_TIME) = TRUNC(SYSDATE)
</select>
<!-- 车辆状态统计:今日的统计(按创建时间 / 流程状态)
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
SUM(CASE WHEN TRUNC(CREATE_TIME) = 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 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
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
</select>
<!-- 本月任务量:实际进入时间是本月的 -->
<select id="countMonthTasks" resultType="java.lang.Long">
SELECT COUNT(1)
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
WHERE ENTRY_TIME IS NOT NULL
AND TO_CHAR(ENTRY_TIME, 'YYYY-MM') = TO_CHAR(SYSDATE, 'YYYY-MM')
</select>
<!-- 任务负荷(今日 24 小时时段):按 EXTRACT(HOUR FROM ENTRY_TIME) 统计 -->
<select id="queryTaskLoadToday" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO">
SELECT
EXTRACT(HOUR FROM ENTRY_TIME) AS hourOfDay,
COUNT(1) AS taskCount
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
WHERE ENTRY_TIME IS NOT NULL
AND TRUNC(ENTRY_TIME) = TRUNC(SYSDATE)
GROUP BY EXTRACT(HOUR FROM ENTRY_TIME)
ORDER BY EXTRACT(HOUR FROM ENTRY_TIME)
</select>
</mapper>
@@ -33,6 +33,4 @@ public class WarehousePO implements Serializable {
@Excel(name = "仓库名称") @Excel(name = "仓库名称")
private String warehouseName; private String warehouseName;
@Excel(name = "是否启用: 1-否 2-是")
private Integer isEnable;
} }
@@ -40,14 +40,6 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mhd.basic.interfaces.dto.shipperLeaseDetailsApi.WarehouseLeaseExportVO;
import com.mhd.common.core.utils.poi.ExcelUtil;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
@@ -285,8 +277,7 @@ public class LeaseApplicationService {
final Date yesterday = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -1)); final Date yesterday = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -1));
LeaseDO leaseDO = new LeaseDO(); LeaseDO leaseDO = new LeaseDO();
leaseDO.setTime(yesterday); // 设置查询时间 leaseDO.setTime(yesterday);
leaseDO.setStatus(1); // 只查询启用状态的租赁,停用的不参与出租率计算
//查询有效期内的租赁 //查询有效期内的租赁
List<LeasePO> leasePOS = queryList(leaseDO); List<LeasePO> leasePOS = queryList(leaseDO);
List<LeasePO> entireUnit = leasePOS.stream() List<LeasePO> entireUnit = leasePOS.stream()
@@ -503,103 +494,6 @@ public class LeaseApplicationService {
return warehouseOccupancyRatesList; return warehouseOccupancyRatesList;
} }
/**
* 导出仓库出租率及客户租赁明细(单 sheet,明细行带仓库当日汇总列)
* 参数与 /warehouseOccupancyRate、/list 一致
*/
public void exportOccupancyRate(HttpServletResponse response, ShipperLeaseDetailsDO shipperLeaseDetailsDO) throws IOException {
// 注意:本方法不调用 warehouseOccupancyRate(),因为该方法在不传 warehouseId 时
// totalArea 会算成全系统所有仓库库区面积之和(如 6168),导致导出面积/日租率错误。
// 这里自行按 (业务日期 + 仓库) 维度计算,保证多仓库导出时每个仓库的面积/日租率正确。
// ===== 1. 查全部明细(用副本 DO,避免影响外部)=====
ShipperLeaseDetailsDO detailDO = new ShipperLeaseDetailsDO();
BeanUtils.copyProperties(shipperLeaseDetailsDO, detailDO);
List<ShipperLeaseDetailsPO> detailList = shipperLeaseDetailsService.queryList(detailDO);
if (detailList == null) {
detailList = new ArrayList<>();
}
// ===== 2. 预算每个仓库的总面积(启用库区的 storageRegion 累加),建 warehouseId -> totalArea 映射 =====
Set<Long> warehouseIds = detailList.stream()
.map(ShipperLeaseDetailsPO::getWarehouseId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Map<Long, BigDecimal> warehouseTotalAreaMap = new HashMap<>();
for (Long wid : warehouseIds) {
StorageSectionDO storageSectionDO = new StorageSectionDO();
storageSectionDO.setWarehouseId(wid);
storageSectionDO.setOpeningUp(1);
List<StorageSectionPO> sections = storageSectionApplicationService.queryList(storageSectionDO);
BigDecimal area = BigDecimal.ZERO;
for (StorageSectionPO s : sections) {
area = area.add(s.getStorageRegion() == null ? BigDecimal.ZERO : s.getStorageRegion());
}
warehouseTotalAreaMap.put(wid, area);
}
// ===== 3. 按 (业务日期 + 仓库ID) 聚合,算每个仓库当天的整租/散租面积 =====
// summaryMap: key -> [整租面积, 散租面积]
SimpleDateFormat keySdf = new SimpleDateFormat("yyyy-MM-dd");
Map<String, BigDecimal[]> summaryMap = new HashMap<>();
for (ShipperLeaseDetailsPO d : detailList) {
String key = (d.getBusinessDate() == null ? "" : keySdf.format(d.getBusinessDate()))
+ "_" + d.getWarehouseId();
BigDecimal[] arr = summaryMap.computeIfAbsent(key, k -> new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO});
BigDecimal leaseArea = d.getLeaseArea() == null ? BigDecimal.ZERO : d.getLeaseArea();
if ("整租".equals(d.getLeaseType())) {
arr[0] = arr[0].add(leaseArea);
} else {
arr[1] = arr[1].add(leaseArea);
}
}
// ===== 4. 明细为主,每行拼上对应仓库当天的汇总(总面积/日租率按仓库单独算)=====
List<WarehouseLeaseExportVO> exportList = new ArrayList<>();
for (ShipperLeaseDetailsPO d : detailList) {
WarehouseLeaseExportVO vo = new WarehouseLeaseExportVO();
// 明细列
vo.setBusinessDate(d.getBusinessDate());
vo.setOrganizationName(d.getOrganizationName());
vo.setWarehouseName(d.getWarehouseName());
vo.setCargoOwnerName(d.getCargoOwnerName());
vo.setLeaseType(d.getLeaseType());
vo.setLeaseArea(d.getLeaseArea());
// 汇总列
String key = (d.getBusinessDate() == null ? "" : keySdf.format(d.getBusinessDate()))
+ "_" + d.getWarehouseId();
BigDecimal[] arr = summaryMap.get(key);
BigDecimal entireLeaseArea = (arr != null) ? arr[0] : BigDecimal.ZERO;
BigDecimal fractionalLeaseArea = (arr != null) ? arr[1] : BigDecimal.ZERO;
vo.setEntireLeaseArea(entireLeaseArea);
vo.setFractionalLeaseArea(fractionalLeaseArea);
// 该仓库的总面积(按仓库单独算,不再用全局总和)
BigDecimal widTotalArea = warehouseTotalAreaMap.getOrDefault(d.getWarehouseId(), BigDecimal.ZERO);
vo.setTotalArea(widTotalArea);
// 日租率 = (整租+散租) / 总面积 × 100,保留2位小数(直接输出百分比值,如 10.00)
BigDecimal leaseSum = entireLeaseArea.add(fractionalLeaseArea);
BigDecimal dailyRate = widTotalArea.compareTo(BigDecimal.ZERO) == 0
? BigDecimal.ZERO
: leaseSum.multiply(new BigDecimal("100")).divide(widTotalArea, 2, BigDecimal.ROUND_HALF_UP);
vo.setDailyRentalRate(dailyRate);
exportList.add(vo);
}
// ===== 5. 按业务日期降序、仓库名升序排序(null 排最后)=====
exportList.sort(Comparator
.comparing(WarehouseLeaseExportVO::getBusinessDate, Comparator.nullsLast(Comparator.reverseOrder()))
.thenComparing(WarehouseLeaseExportVO::getWarehouseName, Comparator.nullsLast(Comparator.naturalOrder())));
// ===== 6. 用 ExcelUtil 导出(项目通用做法,单 sheet)=====
String fileName = URLEncoder.encode("仓库出租率导出", "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
ExcelUtil<WarehouseLeaseExportVO> util = new ExcelUtil<>(WarehouseLeaseExportVO.class);
util.exportExcel(response, exportList, "仓库出租率");
}
/** /**
* 定时任务整租推送到bms * 定时任务整租推送到bms
@@ -643,7 +537,7 @@ public class LeaseApplicationService {
/** /**
* 定时任务散租推送到bms * 定时任务散租推送到bms
*/ */
// @Scheduled(cron = "0 0 0 * * ?") @Scheduled(cron = "0 0 0 * * ?")
public void ScatteredRentalSynchronization() { public void ScatteredRentalSynchronization() {
LeaseDO leaseDO = new LeaseDO(); LeaseDO leaseDO = new LeaseDO();
leaseDO.setTime(new Date()); leaseDO.setTime(new Date());
@@ -687,25 +581,6 @@ public class LeaseApplicationService {
} }
} }
/**
* 启用/停用租赁
* @param leaseIds 租赁ID列表
* @param status 目标状态:1=启用,0=停用
*/
public Boolean updateStatus(List<Long> leaseIds, Integer status) {
LoginUser loginUser = SecurityUtils.getLoginUser();
Long updateBy = loginUser != null ? loginUser.getUserid() : null;
String updateByName = loginUser != null ? loginUser.getUsername() : null;
if (leaseIds == null || leaseIds.isEmpty()) {
throw new ServiceException("租赁ID不能为空");
}
if (status == null || (status != 0 && status != 1)) {
throw new ServiceException("状态值无效:1=启用,0=停用");
}
log.info("启用/停用租赁--结束,leaseIds={},状态={},更新人id={},更新人名称={}",leaseIds,status==0?"停用":"启用",updateBy,updateByName);
return leaseDomainService.updateStatus(leaseIds, status, updateBy, updateByName);
}
// /** // /**
// * @description 设置数据字典键值 // * @description 设置数据字典键值
// * @author ZhouGY // * @author ZhouGY
@@ -1124,51 +1124,4 @@ public class ContractManageApplicationService {
public ContractManagePO getGeneralContract() { public ContractManagePO getGeneralContract() {
return contractManageDomainService.getGeneralContract(); return contractManageDomainService.getGeneralContract();
} }
/**
* 合同导出合同头字段 + 明细拍平成一行一条明细
*/
public List<ContractManageExportVO> buildExportList(ContractManageDO contractManageDO) {
List<ContractManagePO> contractList = this.queryList(contractManageDO);
List<ContractManageExportVO> exportList = new ArrayList<>();
if (contractList == null || contractList.isEmpty()) {
return exportList;
}
List<Long> contractManageIds = contractList.stream()
.map(ContractManagePO::getContractManageId)
.collect(Collectors.toList());
Map<Long, List<ContractManageDetailPO>> detailMap = contractManageDetailDomainService
.queryListByManageIds(contractManageIds).stream()
.collect(Collectors.groupingBy(ContractManageDetailPO::getContractManageId));
for (ContractManagePO contract : contractList) {
List<ContractManageDetailPO> details = detailMap.get(contract.getContractManageId());
if (details != null && !details.isEmpty()) {
for (ContractManageDetailPO detail : details) {
ContractManageExportVO vo = new ContractManageExportVO();
// 合同头字段整体复制
BeanUtils.copyProperties(contract, vo);
// 明细字段显式赋值合同头/明细存在同名字段避免互相覆盖
vo.setSubjectType(detail.getSubjectType());
vo.setFirstSubjectCode(detail.getFirstSubjectCode());
vo.setFirstSubjectName(detail.getFirstSubjectName());
vo.setSecondSubjectCode(detail.getSecondSubjectCode());
vo.setSecondSubjectName(detail.getSecondSubjectName());
vo.setAccountingStrategy(detail.getAccountingStrategy());
vo.setBillingAttributes(detail.getBillingAttributes());
vo.setSubjectEffectiveDate(detail.getSubjectEffectiveDate());
vo.setSubjectExpirationDate(detail.getSubjectExpirationDate());
vo.setDocumentType(detail.getDocumentType());
vo.setServiceItemsName(detail.getServiceItemsName());
exportList.add(vo);
}
} else {
// 无明细的合同也保留一行头字段
ContractManageExportVO vo = new ContractManageExportVO();
BeanUtils.copyProperties(contract, vo);
exportList.add(vo);
}
}
return exportList;
}
} }
@@ -30,7 +30,11 @@ import lombok.extern.slf4j.Slf4j;
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.*; import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -576,40 +580,6 @@ public class ExpenseAccountApplicationService {
return expenseAccountDomainService.getInfoByCode2(subjectCode,topOrganizationId); return expenseAccountDomainService.getInfoByCode2(subjectCode,topOrganizationId);
} }
/**
* 根据编码和组织ID查询
*/
public ExpenseAccountPO getInfoByOrgAndCode(String subjectCode, Long organizationId) {
if(!StringUtils.isNotEmpty(subjectCode)){
throw new ServiceException("费用科目编码不能为空");
}
if(organizationId == null){
throw new ServiceException("组织ID不能为空");
}
ExpenseAccountPO expenseAccountPO = expenseAccountDomainService.getInfoByOrgAndCode(subjectCode, organizationId);
// // 组装计费单位列表单位-单位英文
// List<String> unit = new ArrayList<>();
// if (expenseAccountPO != null) {
// unit.add(expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn());
// unit.add(expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2());
// expenseAccountPO.setUnit(unit);
// }
// 组装计费单位列表(数组)
List<Map<String, String>> unit = new ArrayList<>();
if (expenseAccountPO != null) {
Map<String, String> unit1 = new HashMap<>();
unit1.put("unit", expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn());
unit.add(unit1);
Map<String, String> unit2 = new HashMap<>();
unit2.put("unit", expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2());
unit.add(unit2);
expenseAccountPO.setUnit(unit);
}
return expenseAccountPO;
}
public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){ public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){
setDataPermissionForSearch(searchExpenseAccountDO); setDataPermissionForSearch(searchExpenseAccountDO);
return expenseAccountDomainService.selectExpenseAccount(searchExpenseAccountDO); return expenseAccountDomainService.selectExpenseAccount(searchExpenseAccountDO);
@@ -157,18 +157,15 @@ public class MaterialBaseInfoApplicationService {
* @param materialBaseInfoDO * @param materialBaseInfoDO
*/ */
private void shipperParam(MaterialBaseInfoDO materialBaseInfoDO){ private void shipperParam(MaterialBaseInfoDO materialBaseInfoDO){
Long shipperId = materialBaseInfoDO.getShipperId(); AjaxResult ajaxResult = userServiceFeign.getInfo(materialBaseInfoDO.getShipperId());
if (shipperId != null && shipperId != 0l) { if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
AjaxResult ajaxResult = userServiceFeign.getInfo(materialBaseInfoDO.getShipperId()); throw new ServiceException("获取货主信息失败");
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ }
throw new ServiceException("获取货主信息失败"); UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
} // 如果原始shipperName不为空保留原始值导入或手动输入时应该保留完整名称
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); // 只有在原始shipperName为空时才使用查询到的userName
// 如果原始shipperName不为空保留原始值导入或手动输入时应该保留完整名称 if (materialBaseInfoDO.getShipperName() == null || materialBaseInfoDO.getShipperName().trim().isEmpty()) {
// 只有在原始shipperName为空时才使用查询到的userName materialBaseInfoDO.setShipperName(userPo.getUserName());
if (materialBaseInfoDO.getShipperName() == null || materialBaseInfoDO.getShipperName().trim().isEmpty()) {
materialBaseInfoDO.setShipperName(userPo.getUserName());
}
} }
} }
@@ -185,4 +182,4 @@ public class MaterialBaseInfoApplicationService {
//return materialBaseInfoDomainService.getMaterialStockList(shipperName,materialName,machineCode,topOrganizationId,pageNum,pageSize);/**/ //return materialBaseInfoDomainService.getMaterialStockList(shipperName,materialName,machineCode,topOrganizationId,pageNum,pageSize);/**/
return null; return null;
} }
} }
@@ -98,10 +98,4 @@ public class ContractManageDetail extends BaseVOEntity{
@ApiModelProperty("单据类型") @ApiModelProperty("单据类型")
private String documentType; private String documentType;
@ApiModelProperty("费用类别编码")
private String serviceItemsCode;
@ApiModelProperty("费用类别名称")
private String serviceItemsName;
} }
@@ -97,10 +97,4 @@ public class ContractManageDetailPO extends BaseVOEntity{
@ApiModelProperty("单据类型") @ApiModelProperty("单据类型")
private String documentType; private String documentType;
@ApiModelProperty("费用类别编码")
private String serviceItemsCode;
@ApiModelProperty("费用类别名称")
private String serviceItemsName;
} }
@@ -102,10 +102,4 @@ public class ContractManageDetailDO extends BaseVOEntity{
@ApiModelProperty("单据类型") @ApiModelProperty("单据类型")
private String documentType; private String documentType;
@ApiModelProperty("费用类别编码")
private String serviceItemsCode;
@ApiModelProperty("费用类别名称")
private String serviceItemsName;
} }
@@ -11,7 +11,6 @@ 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.Collection;
import java.util.List; import java.util.List;
/** /**
* 合同管理详情 * 合同管理详情
@@ -96,29 +95,5 @@ public class ContractManageDetailDomainService {
return resultList; return resultList;
} }
/**
* 根据多个合同管理id批量查询合同科目详情一次SQL查询避免逐合同N+1
* @param contractManageIds 合同管理id集合
* @return 合同科目详情列表
*/
public List<ContractManageDetailPO> queryListByManageIds(Collection<Long> contractManageIds) {
List<ContractManageDetailPO> resultList = new ArrayList<>();
if (contractManageIds == null || contractManageIds.isEmpty()) {
return resultList;
}
LambdaQueryWrapper<ContractManageDetail> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(ContractManageDetail::getContractManageId, contractManageIds);
queryWrapper.eq(ContractManageDetail::getDelFlag, 1);
List<ContractManageDetail> contractManageDetails = contractManageDetailService.list(queryWrapper);
if (contractManageDetails != null && contractManageDetails.size() > 0) {
for (ContractManageDetail contractManageDetail : contractManageDetails) {
ContractManageDetailPO contractManageDetailPO = new ContractManageDetailPO();
BeanUtils.copyProperties(contractManageDetail, contractManageDetailPO);
resultList.add(contractManageDetailPO);
}
}
return resultList;
}
} }
@@ -58,11 +58,6 @@ public interface IExpenseAccountService extends IService<ExpenseAccount>
*/ */
ExpenseAccountPO getInfoByCode(ExpenseAccountDO expenseAccountDO); ExpenseAccountPO getInfoByCode(ExpenseAccountDO expenseAccountDO);
/**
* 根据费用科目code和组织ID查询费用信息
*/
ExpenseAccountPO getInfoByOrgAndCode(ExpenseAccountDO expenseAccountDO);
public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO); public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO);
public List<QueryExpenseAccountPO> selectOtherExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO); public List<QueryExpenseAccountPO> selectOtherExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO);
@@ -39,11 +39,6 @@ public interface ExpenseAccountMapper extends BaseMapper<ExpenseAccount>
*/ */
ExpenseAccountPO getInfoByCode(@Param("expenseAccountDO") ExpenseAccountDO expenseAccountDO); ExpenseAccountPO getInfoByCode(@Param("expenseAccountDO") ExpenseAccountDO expenseAccountDO);
/**
* 根据费用科目code和组织ID查询费用信息
*/
ExpenseAccountPO getInfoByOrgAndCode(@Param("expenseAccountDO") ExpenseAccountDO expenseAccountDO);
public List<QueryExpenseAccountPO> selectExpenseAccount(@Param("searchExpenseAccountDO") SearchExpenseAccountDO searchExpenseAccountDO); public List<QueryExpenseAccountPO> selectExpenseAccount(@Param("searchExpenseAccountDO") SearchExpenseAccountDO searchExpenseAccountDO);
public List<QueryExpenseAccountPO> selectOtherExpenseAccount(@Param("searchExpenseAccountDO") SearchExpenseAccountDO searchExpenseAccountDO); public List<QueryExpenseAccountPO> selectOtherExpenseAccount(@Param("searchExpenseAccountDO") SearchExpenseAccountDO searchExpenseAccountDO);
@@ -129,11 +129,6 @@ public class ExpenseAccountImpl extends ServiceImpl<ExpenseAccountMapper, Expens
return expenseAccountMapper.getInfoByCode(expenseAccountDO); return expenseAccountMapper.getInfoByCode(expenseAccountDO);
} }
@Override
public ExpenseAccountPO getInfoByOrgAndCode(ExpenseAccountDO expenseAccountDO) {
return expenseAccountMapper.getInfoByOrgAndCode(expenseAccountDO);
}
/** /**
* 系统科目查询 * 系统科目查询
* 社会车辆service_items_code='SHCL'upper_subject_code='shcl_clyf'society_status=1 * 社会车辆service_items_code='SHCL'upper_subject_code='shcl_clyf'society_status=1
@@ -9,7 +9,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map;
import com.mhd.common.core.web.domain.BaseVOEntity; import com.mhd.common.core.web.domain.BaseVOEntity;
@@ -160,8 +159,4 @@ public class ExpenseAccountPO extends BaseVOEntity{
@ApiModelProperty("nc科目编码") @ApiModelProperty("nc科目编码")
private String ncSubjectCode; private String ncSubjectCode;
@ApiModelProperty("计费单位列表(单位-单位英文)")
private List<Map<String, String>> unit;
} }
@@ -101,16 +101,6 @@ public class ExpenseAccountDomainService {
expenseAccountDO.setTopOrganizationId(topOrganizationId); expenseAccountDO.setTopOrganizationId(topOrganizationId);
return expenseAccountService.getInfoByCode(expenseAccountDO); return expenseAccountService.getInfoByCode(expenseAccountDO);
} }
/**
* 根据编码和组织ID查询费用科目信息
*/
public ExpenseAccountPO getInfoByOrgAndCode(String subjectCode, Long organizationId) {
ExpenseAccountDO expenseAccountDO = new ExpenseAccountDO();
expenseAccountDO.setSubjectCode(subjectCode);
expenseAccountDO.setOrganizationId(organizationId);
return expenseAccountService.getInfoByOrgAndCode(expenseAccountDO);
}
public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){ public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){
return expenseAccountService.selectExpenseAccount(searchExpenseAccountDO); return expenseAccountService.selectExpenseAccount(searchExpenseAccountDO);
} }
@@ -96,7 +96,4 @@ public class Lease extends BaseVOEntity{
@ApiModelProperty("业务员ID") @ApiModelProperty("业务员ID")
private String salesmanId; private String salesmanId;
@ApiModelProperty("状态:1=正常,0=停用")
private Integer status;
} }
@@ -97,7 +97,4 @@ public class LeasePO extends BaseVOEntity{
@ApiModelProperty("业务员ID") @ApiModelProperty("业务员ID")
private String salesmanId; private String salesmanId;
@ApiModelProperty("状态:1=正常,0=停用")
private Integer status;
} }
@@ -113,7 +113,4 @@ public class LeaseDO extends BaseVOEntity{
@ApiModelProperty("业务员ID") @ApiModelProperty("业务员ID")
private String salesmanId; private String salesmanId;
@ApiModelProperty("状态:1=正常,0=停用")
private Integer status;
} }
@@ -89,22 +89,4 @@ public class LeaseDomainService {
.in(Lease::getId, leaseIds) .in(Lease::getId, leaseIds)
.eq(Lease::getDelFlag, 1)); .eq(Lease::getDelFlag, 1));
} }
/**
* 启用/停用租赁
* @param leaseIds 租赁ID列表
* @param status 目标状态1=启用0=停用
* @param updateBy 操作人ID
* @param updateByName 操作人名称
*/
public Boolean updateStatus(List<Long> leaseIds, Integer status, Long updateBy, String updateByName) {
return leaseService.update(new UpdateWrapper<Lease>().lambda()
.set(Lease::getStatus, status)
.set(Lease::getUpdateBy, updateBy)
.set(Lease::getUpdateByName, updateByName)
.set(Lease::getUpdateTime, new Date())
.in(Lease::getId, leaseIds)
.eq(Lease::getDelFlag, 1));
}
} }
@@ -1,6 +1,5 @@
package com.mhd.basic.domain.materialBaseInfo.entity; package com.mhd.basic.domain.materialBaseInfo.entity;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
@@ -45,17 +44,14 @@ public class MaterialBaseInfo extends BaseVOEntity{
@ApiModelProperty("货主id") @ApiModelProperty("货主id")
@Excel(name = "货主id") @Excel(name = "货主id")
@TableField(updateStrategy = FieldStrategy.IGNORED)
private Long shipperId; private Long shipperId;
@ApiModelProperty("货主名称") @ApiModelProperty("货主名称")
@Excel(name = "货主名称") @Excel(name = "货主名称")
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String shipperName; private String shipperName;
@ApiModelProperty("物料编码") @ApiModelProperty("物料编码")
@Excel(name = "物料编码") @Excel(name = "物料编码")
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String materialCode; private String materialCode;
@ApiModelProperty("物料名称") @ApiModelProperty("物料名称")
@@ -408,9 +404,4 @@ public class MaterialBaseInfo extends BaseVOEntity{
@ApiModelProperty(name = "收费标准") @ApiModelProperty(name = "收费标准")
private BigDecimal chargeStandard; private BigDecimal chargeStandard;
@ApiModelProperty(name = "组织(多个用,分开)")
private String orgId;
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
private Integer isNormalMaterial;
} }
@@ -393,10 +393,4 @@ public class MaterialBaseInfoPO extends BaseVOEntity{
@ApiModelProperty(name = "收费标准") @ApiModelProperty(name = "收费标准")
private BigDecimal chargeStandard; private BigDecimal chargeStandard;
@ApiModelProperty(name = "组织(多个用,分开)")
private String orgId;
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
private Integer isNormalMaterial;
} }
@@ -399,10 +399,4 @@ public class MaterialBaseInfoDO extends BaseVOEntity{
@ApiModelProperty(name = "收费标准") @ApiModelProperty(name = "收费标准")
private BigDecimal chargeStandard; private BigDecimal chargeStandard;
@ApiModelProperty(name = "组织(多个用,分开)")
private String orgId;
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
private Integer isNormalMaterial;
} }
@@ -91,15 +91,31 @@ public class StorageSectionDomainService {
public Boolean update(StorageSectionDO storageSectionDO) { public Boolean update(StorageSectionDO storageSectionDO) {
LoginUser loginUser = SecurityUtils.getLoginUser(); LoginUser loginUser = SecurityUtils.getLoginUser();
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId == null || topOrganizationId == 0) { AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid());
throw new ServiceException("获取当前登陆人组织失败!"); if (topOrganizationId == null || topOrganizationId == 0 || associationWarehouseCacheDO == null) {
throw new ServiceException("获取当前登陆人组织与登陆仓库失败!");
} }
// 直接用记录自身的 warehouseId 做唯一校验不再依赖缓存仓库 checkStorageSectionDuplicate(topOrganizationId, associationWarehouseCacheDO.getWarehouseId(),
checkStorageSectionDuplicate(topOrganizationId, storageSectionDO.getWarehouseId(),
storageSectionDO.getStorageCode(), storageSectionDO.getStorageName(), storageSectionDO.getStorageCode(), storageSectionDO.getStorageName(),
storageSectionDO.getStorageSectionId()); storageSectionDO.getStorageSectionId());
//设置仓库 //设置仓库
setWarehouseInfo(storageSectionDO); setWarehouseInfo(storageSectionDO);
String storageCode = storageSectionDO.getStorageCode();
String storageName = storageSectionDO.getStorageName();
Long warehouseId = storageSectionDO.getWarehouseId();
List<StorageSection> codelist = storageSectionService.list(new QueryWrapper<StorageSection>().lambda()
.eq(StorageSection::getStorageCode, storageCode)
.eq(StorageSection::getWarehouseId, warehouseId)
.ne(StorageSection::getStorageSectionId, storageSectionDO.getStorageSectionId())
.eq(StorageSection::getDelFlag, 1));
List<StorageSection> namelist = storageSectionService.list(new QueryWrapper<StorageSection>().lambda()
.eq(StorageSection::getStorageName, storageName)
.eq(StorageSection::getWarehouseId, warehouseId)
.ne(StorageSection::getStorageSectionId, storageSectionDO.getStorageSectionId())
.eq(StorageSection::getDelFlag, 1));
if ((codelist != null && codelist.size() > 0) || (namelist != null && namelist.size() > 0)) {
throw new ServiceException("库区编码或名称已存在");
}
return storageSectionService.update(storageSectionDO); return storageSectionService.update(storageSectionDO);
} }
@@ -130,20 +130,4 @@ public class Warehouse extends BaseVOEntity{
@Excel(name = "作业模式") @Excel(name = "作业模式")
private String workMode; private String workMode;
@ApiModelProperty("订单号生成规则0日期累加1历史累加")
@Excel(name = "单号生成规则")
private String orderNoGenerateRule;
@ApiModelProperty("入库单号首字母前缀")
@Excel(name = "入库单号首字母前缀")
private String inOrderNoPrefix;
@ApiModelProperty("出库单号首字母前缀")
@Excel(name = "出库单号首字母前缀")
private String outOrderNoPrefix;
@ApiModelProperty("样品出库单号首字母前缀")
@Excel(name = "样品出库单号首字母前缀")
private String sampleOutOrderNoPrefix;
} }
@@ -131,21 +131,4 @@ public class WarehousePO extends BaseVOEntity{
@ApiModelProperty("作业模式") @ApiModelProperty("作业模式")
@Excel(name = "作业模式") @Excel(name = "作业模式")
private String workMode; private String workMode;
@ApiModelProperty("订单号生成规则")
@Excel(name = "单号生成规则")
private String orderNoGenerateRule;
@ApiModelProperty("入库单号首字母前缀")
@Excel(name = "入库单号首字母前缀")
private String inOrderNoPrefix;
@ApiModelProperty("出库单号首字母前缀")
@Excel(name = "出库单号首字母前缀")
private String outOrderNoPrefix;
@ApiModelProperty("样品出库单号首字母前缀")
@Excel(name = "样品出库单号首字母前缀")
private String sampleOutOrderNoPrefix;
} }
@@ -139,21 +139,4 @@ public class WarehouseDO extends BaseVOEntity{
@ApiModelProperty("作业模式") @ApiModelProperty("作业模式")
@Excel(name = "作业模式") @Excel(name = "作业模式")
private String workMode; private String workMode;
@ApiModelProperty("订单号生成规则")
@Excel(name = "单号生成规则")
private String orderNoGenerateRule;
@ApiModelProperty("入库单号首字母前缀")
@Excel(name = "入库单号首字母前缀")
private String inOrderNoPrefix;
@ApiModelProperty("出库单号首字母前缀")
@Excel(name = "出库单号首字母前缀")
private String outOrderNoPrefix;
@ApiModelProperty("样品出库单号首字母前缀")
@Excel(name = "样品出库单号首字母前缀")
private String sampleOutOrderNoPrefix;
} }
@@ -168,11 +168,9 @@ public class WarehouseDomainService {
warehouseLinkagePO.setName(warehousePO.getWarehouseName()); warehouseLinkagePO.setName(warehousePO.getWarehouseName());
StorageSectionDO storageSectionDO = new StorageSectionDO(); StorageSectionDO storageSectionDO = new StorageSectionDO();
storageSectionDO.setWarehouseId(warehousePO.getWarehouseId()); storageSectionDO.setWarehouseId(warehousePO.getWarehouseId());
storageSectionDO.setNullify(1);
List<StorageSectionPO> storageSectionPOList = storageSectionService.queryList(storageSectionDO); List<StorageSectionPO> storageSectionPOList = storageSectionService.queryList(storageSectionDO);
StorageLocationDO storageLocationDO = new StorageLocationDO(); StorageLocationDO storageLocationDO = new StorageLocationDO();
storageLocationDO.setWarehouseId(warehousePO.getWarehouseId()); storageLocationDO.setWarehouseId(warehousePO.getWarehouseId());
storageLocationDO.setNullify(1);
List<StorageLocationPO> storageLocationPOList = storageLocationService.queryList(storageLocationDO); List<StorageLocationPO> storageLocationPOList = storageLocationService.queryList(storageLocationDO);
//根据库区唯一标识进行分组 //根据库区唯一标识进行分组
Map<String, List<StorageLocationPO>> storageLocationListMap = storageLocationPOList.stream().collect(Collectors.groupingBy(StorageLocationPO::getStorageCode)); Map<String, List<StorageLocationPO>> storageLocationListMap = storageLocationPOList.stream().collect(Collectors.groupingBy(StorageLocationPO::getStorageCode));
@@ -1,102 +0,0 @@
package com.mhd.basic.interfaces.dto.contractManage;
import com.mhd.common.core.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 合同管理导出对象合同头字段 + 科目明细字段拍平为一行一条明细
*
* @author gen
* @date 2024-06-07
*/
@Data
@ApiModel(value = "合同管理导出对象", description = "合同管理导出对象(含明细)")
public class ContractManageExportVO {
/** ====== 合同头字段(与 ContractManagePO 的 @Excel 一致) ====== */
@Excel(name = "合同编号")
private String contractNumber;
@Excel(name = "合同名称")
private String contractName;
@Excel(name = "是否通用合同", readConverterExp = "1=是,2=否")
private Integer commonContractFlag;
@Excel(name = "合同类型", readConverterExp = "1=仓储,2=运输,3=其他")
private Integer contractType;
@Excel(name = "合同状态", readConverterExp = "1=未生效,2=使用中,3=已过期,4=已作废")
private Integer contractState;
@Excel(name = "签订单位")
private String signingUnit;
@Excel(name = "结算主体")
private String settlementCustomers;
@Excel(name = "我司身份", readConverterExp = "1=甲方,2=乙方")
private Integer ourIdentity;
@Excel(name = "账期", readConverterExp = "1=每月,2=双月,3=季度")
private Integer accountingPeriod;
@Excel(name = "合同签订日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date signingDate;
@Excel(name = "合同生效日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date effectiveDate;
@Excel(name = "合同到期日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date expirationDate;
@Excel(name = "组织名称")
private String organizationName;
@Excel(name = "客户类型")
private String customerType;
@Excel(name = "是否自动出账", readConverterExp = "1=是,2=否")
private Integer automaticFlag;
@Excel(name = "备注")
private String remark;
/** ====== 明细字段(来源于 contract_manage_detail ====== */
@Excel(name = "结算科目类型", readConverterExp = "1=通用,2=临时")
private Integer subjectType;
@Excel(name = "一级费用科目code")
private String firstSubjectCode;
@Excel(name = "一级费用科目")
private String firstSubjectName;
@Excel(name = "二级费用科目code")
private String secondSubjectCode;
@Excel(name = "二级费用科目")
private String secondSubjectName;
@Excel(name = "计费策略")
private String accountingStrategy;
@Excel(name = "计费周期")
private String billingAttributes;
@Excel(name = "科目生效日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date subjectEffectiveDate;
@Excel(name = "科目到期日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date subjectExpirationDate;
@Excel(name = "单据类型")
private String documentType;
@Excel(name = "费用类别")
private String serviceItemsName;
}
@@ -102,10 +102,4 @@ public class ContractManageDetailDTO extends BaseVOEntity{
@ApiModelProperty("单据类型") @ApiModelProperty("单据类型")
private String documentType; private String documentType;
@ApiModelProperty("费用类别编码")
private String serviceItemsCode;
@ApiModelProperty("费用类别名称")
private String serviceItemsName;
} }
@@ -110,7 +110,4 @@ public class LeaseDTO extends BaseVOEntity{
@ApiModelProperty("业务员ID") @ApiModelProperty("业务员ID")
private String salesmanId; private String salesmanId;
@ApiModelProperty("状态:1=正常,0=停用")
private Integer status;
} }
@@ -379,10 +379,4 @@ public class MaterialBaseInfoDTO extends BaseVOEntity{
@ApiModelProperty(name = "收费标准") @ApiModelProperty(name = "收费标准")
private BigDecimal chargeStandard; private BigDecimal chargeStandard;
@ApiModelProperty(name = "组织(多个用,分开)")
private String orgId;
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
private Integer isNormalMaterial;
} }
@@ -1,65 +0,0 @@
package com.mhd.basic.interfaces.dto.shipperLeaseDetailsApi;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* 仓库出租率及客户租赁明细 导出VO sheet
* 明细为主行附该仓库当日汇总列
*/
@Data
public class WarehouseLeaseExportVO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("仓库")
@Excel(name = "仓库")
private String warehouseName;
@ApiModelProperty("业务日期")
@Excel(name = "业务日期", width = 20, dateFormat = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date businessDate;
@ApiModelProperty("整租面积(m²)")
@Excel(name = "整租面积(m²)")
private BigDecimal entireLeaseArea;
@ApiModelProperty("散租面积(m²)")
@Excel(name = "散租面积(m²)")
private BigDecimal fractionalLeaseArea;
@ApiModelProperty("总面积(m²)")
@Excel(name = "总面积(m²)")
private BigDecimal totalArea;
@ApiModelProperty("日租率(%)")
@Excel(name = "日租率(%)")
private BigDecimal dailyRentalRate;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String cargoOwnerName;
@ApiModelProperty("租赁方式")
@Excel(name = "租赁方式")
private String leaseType;
@ApiModelProperty("租赁面积(m²)")
@Excel(name = "租赁面积(m²)")
private BigDecimal leaseArea;
// ===== 以下为仓库当日汇总列同一仓库同一天的多行会重复属正常=====
}
@@ -144,21 +144,4 @@ public class WarehouseDTO extends BaseVOEntity{
@ApiModelProperty("作业模式") @ApiModelProperty("作业模式")
@Excel(name = "作业模式") @Excel(name = "作业模式")
private String workMode; private String workMode;
@ApiModelProperty("订单号生成规则")
@Excel(name = "单号生成规则")
private String orderNoGenerateRule;
@ApiModelProperty("入库单号首字母前缀")
@Excel(name = "入库单号首字母前缀")
private String inOrderNoPrefix;
@ApiModelProperty("出库单号首字母前缀")
@Excel(name = "出库单号首字母前缀")
private String outOrderNoPrefix;
@ApiModelProperty("样品出库单号首字母前缀")
@Excel(name = "样品出库单号首字母前缀")
private String sampleOutOrderNoPrefix;
} }
@@ -1,11 +1,8 @@
package com.mhd.basic.interfaces.facade.contractManage; package com.mhd.basic.interfaces.facade.contractManage;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List; import java.util.List;
import com.mhd.basic.interfaces.assember.contractManage.ContractManageAssembler; import com.mhd.basic.interfaces.assember.contractManage.ContractManageAssembler;
import com.mhd.basic.interfaces.dto.contractManage.ContractManageExportVO;
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceDTO; import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceDTO;
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceReturn; import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceReturn;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@@ -17,11 +14,9 @@ import com.mhd.basic.domain.contractManage.repository.todo.ContractManageDO;
import com.mhd.basic.domain.contractManage.repository.po.ContractManagePO; import com.mhd.basic.domain.contractManage.repository.po.ContractManagePO;
import com.mhd.basic.application.service.contractManage.ContractManageApplicationService; import com.mhd.basic.application.service.contractManage.ContractManageApplicationService;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.core.web.page.TableDataInfo; import com.mhd.common.core.web.page.TableDataInfo;
import com.mhd.common.core.utils.poi.ExcelUtil;
/** /**
* 合同管理Api * 合同管理Api
@@ -210,24 +205,7 @@ public class ContractManageApi extends BaseController{
return AjaxResult.success(list); return AjaxResult.success(list);
} }
@ApiOperation("导出合同(含明细)")
@GetMapping(value = "/export", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
public void export(ContractManageDTO contractManageDTO, HttpServletResponse response) throws IOException
{
//转换实体
ContractManageDO contractManageDO = new ContractManageDO();
BeanUtils.copyProperties(contractManageDTO, contractManageDO);
//查询全量不分页并拍平明细
List<ContractManageExportVO> list = contractManageApplicationService.buildExportList(contractManageDO);
//设置下载头防止浏览器乱码
String fileName = URLEncoder.encode("合同导出", "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
ExcelUtil<ContractManageExportVO> util = new ExcelUtil<>(ContractManageExportVO.class);
util.exportExcel(response, list, "合同导出");
}
} }
@@ -328,13 +328,5 @@ public class ExpenseAccountApi extends BaseController{
return AjaxResult.success(expenseAccountPO); return AjaxResult.success(expenseAccountPO);
} }
@ApiOperation("根据code和组织ID获取数据")
@GetMapping(value = "/getInfoByOrgAndCode")
public AjaxResult getInfoByOrgAndCode(@RequestParam("subjectCode") String subjectCode,@RequestParam("organizationId") Long organizationId)
{
ExpenseAccountPO expenseAccountPO = expenseAccountApplicationService.getInfoByOrgAndCode(subjectCode, organizationId);
return AjaxResult.success(expenseAccountPO.getUnit());
}
} }
@@ -130,18 +130,4 @@ public class LeaseApi extends BaseController{
return AjaxResult.success(); return AjaxResult.success();
} }
/**
* 启用/停用租赁
* @param leaseIds 租赁ID集合
* @param status 目标状态启用/停用
* @return 操作结果
*/
@ApiOperation("启用/停用租赁")
@PutMapping("/updateStatus/{leaseIds}/{status}")
public AjaxResult updateStatus(@PathVariable("leaseIds") List<Long> leaseIds,
@PathVariable("status") Integer status)
{
return toAjax(leaseApplicationService.updateStatus(leaseIds, status));
}
} }
@@ -20,8 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -159,17 +157,5 @@ public class ShipperLeaseDetailsApi extends BaseController{
return getDataTable(warehouseOccupancyRates); return getDataTable(warehouseOccupancyRates);
} }
/**
* 导出仓库出租率及客户租赁明细
* 参数与 /warehouseOccupancyRate/list 一致
*/
@ApiOperation("导出仓库出租率及客户租赁明细")
@GetMapping(value = "/export", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
public void export(ShipperLeaseDetailsDTO shipperLeaseDetailsDTO, HttpServletResponse response) throws IOException
{
ShipperLeaseDetailsDO shipperLeaseDetailsDO = shipperLeaseDetailsAssembler.toDO(shipperLeaseDetailsDTO);
leaseApplicationService.exportOccupancyRate(response, shipperLeaseDetailsDO);
}
} }
@@ -14,16 +14,18 @@ spring:
nacos: nacos:
discovery: discovery:
# 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.30:6848 # 线上测试环境配置 容器名+端口号
server-addr: 10.102.192.31:6848
username: nacos username: nacos
password: manhuoda@2023 password: manhuoda@2023
#线上正式环境 #线上正式环境
# server-addr: 10.102.192.105:6848 # server-addr: 10.102.192.105:6848
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.30:6848 # 线上测试环境配置 容器名+端口号
server-addr: 10.102.192.31:6848
username: nacos username: nacos
password: manhuoda@2023 password: manhuoda@2023
#线上正式环境 #线上正式环境
@@ -148,25 +148,8 @@
AND a.top_organization_id = #{expenseAccountDO.topOrganizationId} AND a.top_organization_id = #{expenseAccountDO.topOrganizationId}
AND a.subject_code = #{expenseAccountDO.subjectCode} AND a.subject_code = #{expenseAccountDO.subjectCode}
AND a.status = 1 AND a.status = 1
LIMIT 1
</select> </select>
<select id="getInfoByOrgAndCode" resultType="com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO" parameterType="com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO">
SELECT
a.* ,
b.tax_rate,
b.service_items_name,
b.service_items_code
FROM
expense_account a
LEFT JOIN service_items_manage b ON a.service_items_manage_id = b.service_items_manage_id
WHERE
a.del_flag = 1
AND a.organization_id = #{expenseAccountDO.organizationId}
AND a.subject_code = #{expenseAccountDO.subjectCode}
AND a.status = 1
LIMIT 1
</select>
<sql id="common_where_two"> <sql id="common_where_two">
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 --> <!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
@@ -35,7 +35,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
<result property="updateByName" column="update_by_name" /> <result property="updateByName" column="update_by_name" />
<result property="delFlag" column="del_flag" /> <result property="delFlag" column="del_flag" />
<result property="status" column="status" />
</resultMap> </resultMap>
@@ -69,8 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.bill_time, a.bill_time,
a.salesman_name, a.salesman_name,
a.settlement_currency, a.settlement_currency,
a.salesman_id, a.salesman_id
a.status
from lease a from lease a
LEFT JOIN warehouse w ON a.warehouse_id = w.warehouse_id AND w.del_flag = 1 LEFT JOIN warehouse w ON a.warehouse_id = w.warehouse_id AND w.del_flag = 1
</sql> </sql>
@@ -138,10 +136,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND a.start_date &lt;= #{time} AND a.start_date &lt;= #{time}
AND a.end_date &gt;= #{time} AND a.end_date &gt;= #{time}
</if> </if>
<!-- 停用状态过滤:status 不为空时按状态过滤 -->
<if test="status != null">
AND a.status = #{status}
</if>
<!-- 删除标记 --> <!-- 删除标记 -->
<choose> <choose>
<when test="delFlag != null"> and a.del_flag = #{delFlag} </when> <when test="delFlag != null"> and a.del_flag = #{delFlag} </when>
@@ -185,8 +185,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="queryList" parameterType="com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO" resultMap="StorageLocationResult"> <select id="queryList" parameterType="com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO" resultMap="StorageLocationResult">
<include refid="selectStorageLocationPo"/> <include refid="selectStorageLocationPo"/>
<include refid="selectStorageLocationPo1"/> <include refid="selectStorageLocationPo1"/>
-- 按照库位名称正序排序,名称相同时按创建时间倒序 -- 按照创建时间倒序排序
order by a.storage_location_name asc, a.create_time desc order by a.create_time desc
</select> </select>
<select id="getStorageLocationCount" parameterType="com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO" resultType="java.lang.Long"> <select id="getStorageLocationCount" parameterType="com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO" resultType="java.lang.Long">
@@ -100,6 +100,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="queryList" parameterType="com.mhd.basic.domain.storageSection.repository.todo.StorageSectionDO" resultMap="StorageSectionResult"> <select id="queryList" parameterType="com.mhd.basic.domain.storageSection.repository.todo.StorageSectionDO" resultMap="StorageSectionResult">
<include refid="selectStorageSectionPo"/> <include refid="selectStorageSectionPo"/>
<include refid="selectStorageSectionPo1"/> <include refid="selectStorageSectionPo1"/>
order by a.storage_name asc, a.create_time desc order by a.create_time desc
</select> </select>
</mapper> </mapper>
@@ -39,10 +39,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="isEnable" column="IS_ENABLE" /> <result property="isEnable" column="IS_ENABLE" />
<result property="workMode" column="WORK_MODE" /> <result property="workMode" column="WORK_MODE" />
<result property="taskMode" column="TASK_MODE" /> <result property="taskMode" column="TASK_MODE" />
<result property="sampleOutOrderNoPrefix" column="SAMPLE_OUT_ORDER_NO_PREFIX" />
<result property="orderNoGenerateRule" column="ORDER_NO_GENERATE_RULE" />
<result property="inOrderNoPrefix" column="IN_ORDER_NO_PREFIX" />
<result property="outOrderNoPrefix" column="OUT_ORDER_NO_PREFIX" />
</resultMap> </resultMap>
@@ -51,8 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
warehouse_type, warehouse_type_name, warehouse_structure, warehouse_nature, warm_layer_code, warm_layer_name, warehouse_type, warehouse_type_name, warehouse_structure, warehouse_nature, warm_layer_code, warm_layer_name,
director_name, director_phone, region_code, region_name, detail_address, longitude, latitude, building_region, director_name, director_phone, region_code, region_name, detail_address, longitude, latitude, building_region,
usage_region, remark, opening_up, nullify, create_time, create_by, create_by_name, update_time, update_by, usage_region, remark, opening_up, nullify, create_time, create_by, create_by_name, update_time, update_by,
update_by_name, del_flag, IS_ENABLE ,WORK_MODE,TASK_MODE,SAMPLE_OUT_ORDER_NO_PREFIX,ORDER_NO_GENERATE_RULE,IN_ORDER_NO_PREFIX, update_by_name, del_flag, IS_ENABLE ,WORK_MODE,TASK_MODE
OUT_ORDER_NO_PREFIX
from warehouse from warehouse
</sql> </sql>
@@ -1,22 +1,12 @@
package com.mhd.user.application.service; package com.mhd.user.application.service;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.user.domain.userAggregate.entity.AgreementDetails; import com.mhd.user.domain.userAggregate.entity.AgreementDetails;
import com.mhd.user.domain.userAggregate.entity.UserShipperEntity;
import com.mhd.user.domain.userAggregate.repository.mapper.AgreementDetailsMapper; import com.mhd.user.domain.userAggregate.repository.mapper.AgreementDetailsMapper;
import com.mhd.user.domain.userAggregate.repository.mapper.UserShipperMapper;
import com.mhd.user.domain.userAggregate.repository.po.AgreementDetailsPo;
import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
@@ -29,87 +19,18 @@ public class AgreementDetailsApplicationService {
@Resource @Resource
private AgreementDetailsMapper agreementDetailsMapper; private AgreementDetailsMapper agreementDetailsMapper;
@Resource
private UserShipperMapper userShipperMapper;
/** /**
* 根据货主ID查询当前登录用户组织下的协议明细 * 根据货主ID查询所有协议明细
* 从user_shipper表的orgCode字段解析JSON匹配当前登录用户组织code
* 返回该组织下的agreedaydatas列表
* *
* @param shipperId 货主ID * @param shipperId 货主ID
* @return 协议明细列表 * @return 协议明细列表
*/ */
public List<AgreementDetailsPo> listByShipperId(Long shipperId) { public List<AgreementDetails> listByShipperId(Long shipperId) {
// 1. 获取当前登录用户组织ID return agreementDetailsMapper.selectList(
LoginUser loginUser = SecurityUtils.getLoginUser(); new LambdaQueryWrapper<AgreementDetails>()
if (ObjectUtil.isNull(loginUser) || ObjectUtil.isNull(loginUser.getUserPo())) { .eq(AgreementDetails::getShipperId, shipperId)
log.warn("未获取到登录用户信息"); .orderByDesc(AgreementDetails::getCreateTime)
return Collections.emptyList(); );
}
Long organizationId = loginUser.getUserPo().getOrganizationId();
if (ObjectUtil.isNull(organizationId)) {
log.warn("当前登录用户无组织信息");
return Collections.emptyList();
}
// 2. 根据shipperId查询货主信息获取orgCode字段
UserShipperEntity shipperEntity = userShipperMapper.selectById(shipperId);
if (ObjectUtil.isNull(shipperEntity)) {
log.warn("未找到货主信息,shipperId={}", shipperId);
return Collections.emptyList();
}
String orgCodeJson = shipperEntity.getOrgCode();
if (ObjectUtil.isNull(orgCodeJson) || orgCodeJson.isEmpty()) {
log.warn("货主orgCode为空,shipperId={}", shipperId);
return Collections.emptyList();
}
// 3. 解析orgCode JSON数组匹配当前登录用户组织code
JSONArray orgCodeArray = JSONArray.parseArray(orgCodeJson);
if (orgCodeArray == null || orgCodeArray.isEmpty()) {
return Collections.emptyList();
}
JSONObject matchedOrg = null;
for (int i = 0; i < orgCodeArray.size(); i++) {
JSONObject orgItem = orgCodeArray.getJSONObject(i);
Long code = orgItem.getLong("code");
if (organizationId.equals(code)) {
matchedOrg = orgItem;
break;
}
}
if (matchedOrg == null) {
log.info("未匹配到当前组织的协议信息,shipperId={}organizationId={}", shipperId, organizationId);
return Collections.emptyList();
}
// 4. 获取匹配组织的agreedaydatas
JSONArray agreedaydatas = matchedOrg.getJSONArray("agreedaydatas");
if (agreedaydatas == null || agreedaydatas.isEmpty()) {
log.info("当前组织下无协议天数数据,shipperId={}organizationId={}", shipperId, organizationId);
return Collections.emptyList();
}
// 5. 转换为AgreementDetailsPo列表
List<AgreementDetailsPo> result = new ArrayList<>();
for (int i = 0; i < agreedaydatas.size(); i++) {
JSONObject item = agreedaydatas.getJSONObject(i);
AgreementDetailsPo po = new AgreementDetailsPo();
po.setCode(item.getString("code"));
po.setOrgcode(item.getString("orgcode"));
po.setPtypename(item.getString("ptypename"));
po.setPtype(item.getString("ptype"));
po.setPcode(item.getString("pcode"));
po.setPname(item.getString("pname"));
po.setPday(item.getString("pday"));
result.add(po);
}
log.info("查询协议明细成功,shipperId={}organizationId={},共{}条", shipperId, organizationId, result.size());
return result;
} }
/** /**
@@ -23,10 +23,7 @@ import com.mhd.common.core.enums.MessageTypeEnum;
import com.mhd.common.core.enums.WebsocketTypeEnum; import com.mhd.common.core.enums.WebsocketTypeEnum;
import com.mhd.common.core.feign.ThirdPartyServiceFeign; import com.mhd.common.core.feign.ThirdPartyServiceFeign;
import com.mhd.common.core.service.jPush.AsyncJPushApplicationService; import com.mhd.common.core.service.jPush.AsyncJPushApplicationService;
import com.mhd.common.core.utils.AESUtil;
import com.mhd.common.core.utils.OConvertUtils;
import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.security.utils.password.PasswordUtil;
import com.mhd.system.api.FinanceServiceFeign; import com.mhd.system.api.FinanceServiceFeign;
import com.mhd.system.api.WlhyServiceFeign; import com.mhd.system.api.WlhyServiceFeign;
import com.mhd.system.api.domain.UserShipperEntityFeign; import com.mhd.system.api.domain.UserShipperEntityFeign;
@@ -161,22 +158,11 @@ public class UserShipperApplicationService {
// 先保存前端传递的 organizationId如果存在 // 先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = userShipperDO.getOrganizationId(); Long frontendOrganizationId = userShipperDO.getOrganizationId();
// 获取当前登录用户的组织信息 // 获取当前登录用户的组织信息
Long loginUserOrganizationId = userPo.getOrganizationId(); Long loginUserOrganizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId(); Long topOrganizationId = userPo.getTopOrganizationId();
// 如果前端传了 orgCode组织ID直接按 org_code 过滤查询委托方不覆盖组织条件
// orgCode 匹配 user_shipper.org_code JSON 数组中的 code 字段用于精确查询委托方
if (StringUtils.isNotBlank(userShipperDO.getOrgCode())) {
// 清空 organizationId / topOrganizationId避免被数据权限覆盖逻辑拦截 orgCode 已授权的委托方
userShipperDO.setOrganizationId(null);
userShipperDO.setTopOrganizationId(null);
log.info("托运人列表查询 - 按 orgCode 查询:orgCode={}", userShipperDO.getOrgCode());
List<UserShipperPo> userShipperList = userShipperDomainService.userShipperList(userShipperDO);
return processShipperList(userShipperList);
}
// 数据权限根据 organizationId 来设置查询权限 // 数据权限根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己 // 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
@@ -195,13 +181,32 @@ public class UserShipperApplicationService {
log.info("托运人列表查询 - 南光组织查询所有组织:不设置组织过滤条件"); log.info("托运人列表查询 - 南光组织查询所有组织:不设置组织过滤条件");
} }
} else { } else {
// 其他组织设置 organizationId 为当前登录组织ID // 其他组织设置 organizationId只查询当前组织的数据
// 查询条件为a.organization_id = 本组织 OR b.org_code LIKE 本组织ID // 其他组织只能查询自己组织的数据不能查询其他组织的数据
// 即委托方初始绑定本组织 org_code 中包含本组织被授权给本组织均可查到 if (frontendOrganizationId != null) {
// 不设置 topOrganizationId避免跨顶级组织授权org_code 已包含本组织被顶级组织条件拦截 // 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
userShipperDO.setOrganizationId(loginUserOrganizationId); if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
userShipperDO.setTopOrganizationId(null); // 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.info("托运人列表查询 - 其他组织按本组织及 org_code 查询:organizationId={}", loginUserOrganizationId); log.warn("托运人列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
userShipperDO.setOrganizationId(loginUserOrganizationId);
if (frontendOrganizationId.equals(2827L)){
userShipperDO.setOrganizationId(null);
}
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
userShipperDO.setOrganizationId(frontendOrganizationId);
}
if (topOrganizationId != null) {
userShipperDO.setTopOrganizationId(topOrganizationId);
}
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
userShipperDO.setOrganizationId(loginUserOrganizationId);
if (topOrganizationId != null) {
userShipperDO.setTopOrganizationId(topOrganizationId);
}
}
} }
log.info("托运人列表查询 - 设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, userId={}", log.info("托运人列表查询 - 设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, userId={}",
@@ -356,7 +361,7 @@ public class UserShipperApplicationService {
/** /**
* Excel 导入委托方 * Excel 导入委托方
* 模版列登录账号公司名称联系人联系电话地址详细地址备注结算币种NC客户编码 * 模版列登录账号公司名称联系人联系电话地址详细地址备注结算币种
*/ */
public com.mhd.common.core.web.domain.AjaxResult importShipperFromExcel(org.springframework.web.multipart.MultipartFile file) { public com.mhd.common.core.web.domain.AjaxResult importShipperFromExcel(org.springframework.web.multipart.MultipartFile file) {
if (file == null || file.isEmpty()) { if (file == null || file.isEmpty()) {
@@ -367,12 +372,6 @@ public class UserShipperApplicationService {
org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0); org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0);
int total = 0, success = 0, failed = 0; int total = 0, success = 0, failed = 0;
java.util.List<String> errors = new java.util.ArrayList<>(); java.util.List<String> errors = new java.util.ArrayList<>();
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null || loginUser.getUserPo() == null) {
return com.mhd.common.core.web.domain.AjaxResult.error("登录信息失效");
}
Long currentOrgId = loginUser.getUserPo().getOrganizationId();
String currentOrgName = loginUser.getUserPo().getOrganizationName();
for (int i = 1; i <= sheet.getLastRowNum(); i++) { for (int i = 1; i <= sheet.getLastRowNum(); i++) {
org.apache.poi.ss.usermodel.Row row = sheet.getRow(i); org.apache.poi.ss.usermodel.Row row = sheet.getRow(i);
if (row == null) continue; if (row == null) continue;
@@ -381,21 +380,14 @@ public class UserShipperApplicationService {
if (org.springframework.util.StringUtils.isEmpty(companyName)) continue; if (org.springframework.util.StringUtils.isEmpty(companyName)) continue;
total++; total++;
try { try {
String contactName = getCellStr(row.getCell(2));
String contactPhone = getCellStr(row.getCell(3));
String address = getCellStr(row.getCell(4));
String detailedAddress = getCellStr(row.getCell(5));
String remark = getCellStr(row.getCell(6));
String settlementCurrency = getCellStr(row.getCell(7));
String ncCustomerCode = getCellStr(row.getCell(8));
// 先按公司名称查是否已存在委托方 // 先按公司名称查是否已存在委托方
UserShipperEntity existingShipper = findFirstByShipperEnterpriseNameAcrossOrgs(companyName); UserShipperEntity existingShipper = findFirstByShipperEnterpriseNameAcrossOrgs(companyName);
if (existingShipper != null && existingShipper.getShipperId() != null) { if (existingShipper != null && existingShipper.getShipperId() != null) {
// 已存在按模板更新指定字段 // 已存在只更新NC客户编码和org_code
updateShipperFromExcel(existingShipper, userAccount, companyName, appendOrganizationToExistingShipper(existingShipper,
contactName, contactPhone, address, detailedAddress, SecurityUtils.getLoginUser().getUserPo().getOrganizationId(),
remark, settlementCurrency, ncCustomerCode, loginUser, currentOrgId); SecurityUtils.getLoginUser().getUserPo().getOrganizationName(),
userAccount, SecurityUtils.getLoginUser());
success++; success++;
} else { } else {
UserShipperDO shipperDO = new UserShipperDO(); UserShipperDO shipperDO = new UserShipperDO();
@@ -403,39 +395,31 @@ public class UserShipperApplicationService {
shipperDO.setDataSource(2); shipperDO.setDataSource(2);
shipperDO.setUserAccount(userAccount); shipperDO.setUserAccount(userAccount);
shipperDO.setShipperEnterpriseName(companyName); shipperDO.setShipperEnterpriseName(companyName);
// NC客户编码使用模板中的独立字段不再复用登录账号 // 登录账号同时作为NC客户编码
shipperDO.setCustomerNcCode(ncCustomerCode); shipperDO.setCustomerNcCode(userAccount);
// 公司名称 -> user表 user_name + user_shipper表 user_name_shipper String contactName = getCellStr(row.getCell(2));
shipperDO.setUserName(companyName); String contactPhone = getCellStr(row.getCell(3));
// 联系人 -> user表 user_name + user_shipper表 user_name_shipper
shipperDO.setUserName(contactName);
shipperDO.setUserNameShipper(contactName); shipperDO.setUserNameShipper(contactName);
// 登录账号 -> user表 user_member_code // 联系电话 -> user表 user_phone
shipperDO.setUserMemberCode(userAccount);
// 联系人 -> user表 emergency_contact_name
shipperDO.setEmergencyContactName(contactName);
// 联系电话 -> user表 emergency_contact_phone
shipperDO.setEmergencyContactPhone(contactPhone);
shipperDO.setUserPhone(contactPhone); shipperDO.setUserPhone(contactPhone);
// 地址 -> user表 user_area_name详细地址 -> user表 user_area_address // 地址 -> user表 user_area_name详细地址 -> user表 user_area_address
shipperDO.setUserAreaName(address); shipperDO.setUserAreaName(getCellStr(row.getCell(4)));
shipperDO.setUserAreaAddress(detailedAddress); shipperDO.setUserAreaAddress(getCellStr(row.getCell(5)));
shipperDO.setRemark(remark); shipperDO.setRemark(getCellStr(row.getCell(6)));
shipperDO.setSettlementCurrency(settlementCurrency); shipperDO.setSettlementCurrency(getCellStr(row.getCell(7)));
// 新导入账号默认密码 Aa123456按前端加密约定先 AES 加密
shipperDO.setUserPassword(AESUtil.encrypt("Aa123456"));
// 初始化 orgCode记录当前组织信息和NC客户编码 // 初始化 orgCode记录当前组织信息和NC客户编码
com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray(); com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray();
com.alibaba.fastjson.JSONObject orgItem = new com.alibaba.fastjson.JSONObject(); com.alibaba.fastjson.JSONObject orgItem = new com.alibaba.fastjson.JSONObject();
orgItem.put("name", currentOrgName); LoginUser loginUser = SecurityUtils.getLoginUser();
orgItem.put("code", currentOrgId); orgItem.put("name", loginUser.getUserPo().getOrganizationName());
orgItem.put("ncCustomer", ncCustomerCode); orgItem.put("code", loginUser.getUserPo().getOrganizationId());
orgItem.put("names", currentOrgId); orgItem.put("ncCustomer", userAccount);
orgItem.put("names", loginUser.getUserPo().getOrganizationId());
orgCodeArray.add(orgItem); orgCodeArray.add(orgItem);
shipperDO.setOrgCode(orgCodeArray.toJSONString()); shipperDO.setOrgCode(orgCodeArray.toJSONString());
Map<String, Object> addResult = addShipper(shipperDO); addShipper(shipperDO);
Object newUserIdObj = addResult.get("userId");
if (newUserIdObj instanceof Long) {
assignCompanyRoleIfMissing((Long) newUserIdObj, currentOrgId);
}
success++; success++;
} }
} catch (Exception e) { } catch (Exception e) {
@@ -457,170 +441,6 @@ public class UserShipperApplicationService {
} }
} }
/**
* 导入委托方时确保账号仅绑定企业货主company角色
* 注意authShipper 会把当前登录管理员的所有角色都分配给导入用户
* 因此这里必须保证用户最终只绑定 company 角色若现有角色不是唯一的 company 角色
* 一律删除后重新分配避免残留 ownerCargo 等多条错误角色
*/
private void assignCompanyRoleIfMissing(Long userId, Long organizationId) {
if (userId == null || organizationId == null) {
return;
}
// 查询用户现有角色
List<UserRoleMenuPO> existingRoles = userRoleDomainService.selectRolesByUserId(userId);
// 只有恰好绑定了唯一的 company 角色时才认为正确无需处理
boolean onlyCompany = !CollUtil.isEmpty(existingRoles)
&& existingRoles.size() == 1
&& RoleEnum.COMPANY.getCode().equals(existingRoles.get(0).getRoleCode());
if (onlyCompany) {
return;
}
// 否则删除所有现有角色ownerCargo或多个角色重新分配 company
if (CollUtil.isNotEmpty(existingRoles)) {
log.info("导入委托方 - 用户{}角色不正确,删除原角色后重新分配company,原角色: {}",
userId, existingRoles.stream().map(UserRoleMenuPO::getRoleCode).collect(Collectors.toList()));
userRoleDomainService.deleteByUserId(userId);
}
// role_code + organization_id 精确匹配角色selectByOrganizationIdAndRoleCode common_where 不含 roleCode 过滤不适用
RolePO rolePO = roleDomainService.selectByRoleCodeAndOrganizationId(RoleEnum.COMPANY.getCode(), organizationId);
if (rolePO == null) {
log.warn("组织{}下未找到{}角色,无法为导入用户{}分配角色", organizationId, RoleEnum.COMPANY.getCode(), userId);
return;
}
// 1. 写入 user_role
UserRoleDo userRoleDo = new UserRoleDo();
userRoleDo.setUserId(userId);
userRoleDo.setRoleId(rolePO.getRoleId());
userRoleDomainService.addUserRole(userRoleDo);
// 2. 同步更新 user 表的 role_code / role_name
UserDO userDO = new UserDO();
userDO.setUserId(userId);
userDO.setRoleCode(RoleEnum.COMPANY.getCode());
userDO.setRoleName(RoleEnum.COMPANY.getName());
userDomainService.updateUser(userDO);
}
/**
* 按Excel模板更新已存在的委托方只更新模板中的字段
*/
private void updateShipperFromExcel(UserShipperEntity existingShipper, String userAccount,
String companyName, String contactName, String contactPhone,
String address, String detailedAddress, String remark,
String settlementCurrency, String ncCustomerCode,
LoginUser loginUser, Long currentOrgId) {
Long userId = existingShipper.getUserId();
// user 主表读取当前登录账号user_shipper 表无 user_account 字段
UserPo existingUser = null;
String existingUserAccount = null;
if (userId != null) {
existingUser = userDomainService.selectByUserId(userId);
if (existingUser != null) {
existingUserAccount = existingUser.getUserAccount();
}
}
if (StringUtils.isBlank(existingUserAccount) && StringUtils.isBlank(userAccount)) {
throw new ServiceException("登录账号不能为空");
}
// 登录账号变更时校验唯一性
if (StringUtils.isNotBlank(userAccount) && !userAccount.equals(existingUserAccount)) {
UserDO checkDO = new UserDO();
checkDO.setUserAccount(userAccount);
checkDO.setTopOrganizationId(existingShipper.getTopOrganizationId());
UserPo existedUser = userDomainService.findByTopOrganizationIdAndUserAccount(checkDO);
if (existedUser != null && !existedUser.getUserId().equals(userId)) {
throw new ServiceException("登录账号已存在:" + userAccount);
}
}
Date now = new Date();
Long updateBy = loginUser.getUserPo().getUserId();
String updateByName = loginUser.getUserPo().getUserName();
// 1. 更新 user_shipper 表指定字段
// 注意user_shipper 表没有 user_account 字段登录账号在 user 主表维护
UserShipperEntity shipperUpdate = new UserShipperEntity();
shipperUpdate.setShipperId(existingShipper.getShipperId());
shipperUpdate.setShipperEnterpriseName(companyName);
shipperUpdate.setUserNameShipper(contactName);
shipperUpdate.setUserAreaName(address);
shipperUpdate.setUserAreaAddress(detailedAddress);
shipperUpdate.setRemark(remark);
shipperUpdate.setSettlementCurrency(settlementCurrency);
shipperUpdate.setCustomerNcCode(ncCustomerCode);
shipperUpdate.setUpdateBy(updateBy);
shipperUpdate.setUpdateByName(updateByName);
shipperUpdate.setUpdateTime(now);
userShipperMapper.updateById(shipperUpdate);
// 2. 同步更新 user 表指定字段
if (userId != null) {
UserDO userDO = new UserDO();
userDO.setUserId(userId);
if (StringUtils.isNotBlank(userAccount)) {
userDO.setUserAccount(userAccount);
// 登录账号 -> user表 user_member_code
userDO.setUserMemberCode(userAccount);
}
// 公司名称 -> user表 user_name
userDO.setUserName(companyName);
// 联系人 -> user表 emergency_contact_name
userDO.setEmergencyContactName(contactName);
// 联系电话 -> user表 emergency_contact_phone
userDO.setEmergencyContactPhone(contactPhone);
userDO.setUserPhone(contactPhone);
userDO.setUserAreaName(address);
userDO.setUserAreaAddress(detailedAddress);
userDO.setUpdateBy(updateBy);
userDO.setUpdateByName(updateByName);
userDO.setUpdateTime(now);
// 如果现有账号没有密码设置默认密码 Aa123456 addUserInfoShipper 一致的加密流程
if (existingUser != null && StringUtils.isBlank(existingUser.getUserPassword())) {
String finalAccount = StringUtils.isNotBlank(userAccount) ? userAccount : existingUser.getUserAccount();
String salt = OConvertUtils.randomGen(8);
String passwordEncode = PasswordUtil.encrypt(finalAccount, "Aa123456", salt);
userDO.setUserPassword(passwordEncode);
userDO.setUserSalt(salt);
}
userDomainService.updateUser(userDO);
// 如果该账号没有企业货主(company)角色补分配当前导入组织下的 company 角色避免登录报账号未授权角色信息
assignCompanyRoleIfMissing(userId, currentOrgId);
}
// 3. 更新 orgCode 中当前组织的 ncCustomer
String existingOrgCode = existingShipper.getOrgCode();
com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray();
boolean hasOrg = false;
if (StringUtils.isNotEmpty(existingOrgCode)) {
try {
orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(existingOrgCode);
for (int i = 0; i < orgCodeArray.size(); i++) {
com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i);
if (currentOrgId != null && currentOrgId.equals(orgItem.getLong("code"))) {
orgItem.put("ncCustomer", ncCustomerCode);
hasOrg = true;
}
}
} catch (Exception e) {
log.error("解析orgCode失败,shipperId={}", existingShipper.getShipperId(), e);
}
}
if (!hasOrg) {
com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject();
newOrgItem.put("name", loginUser.getUserPo().getOrganizationName());
newOrgItem.put("code", currentOrgId);
newOrgItem.put("ncCustomer", ncCustomerCode);
newOrgItem.put("names", currentOrgId);
orgCodeArray.add(newOrgItem);
}
UserShipperEntity orgCodeUpdate = new UserShipperEntity();
orgCodeUpdate.setShipperId(existingShipper.getShipperId());
orgCodeUpdate.setOrgCode(orgCodeArray.toJSONString());
orgCodeUpdate.setUpdateBy(updateBy);
orgCodeUpdate.setUpdateByName(updateByName);
orgCodeUpdate.setUpdateTime(now);
userShipperMapper.updateById(orgCodeUpdate);
}
private String getCellStr(org.apache.poi.ss.usermodel.Cell cell) { private String getCellStr(org.apache.poi.ss.usermodel.Cell cell) {
if (cell == null) return null; if (cell == null) return null;
cell.setCellType(org.apache.poi.ss.usermodel.CellType.STRING); cell.setCellType(org.apache.poi.ss.usermodel.CellType.STRING);
@@ -1324,12 +1144,6 @@ public class UserShipperApplicationService {
return userShipperDomainService.userShipperList(userShipperDO); return userShipperDomainService.userShipperList(userShipperDO);
} }
public List<UserShipperPo> userShipperListAllByOrg(Long orgCode) {
UserShipperDO userShipperDO = new UserShipperDO();
userShipperDO.setOrganizationId(orgCode);
return userShipperDomainService.userShipperList(userShipperDO);
}
/** /**
* E签宝回调接口-认证授权完成 * E签宝回调接口-认证授权完成
* @param jsonObject 回调参数 * @param jsonObject 回调参数
@@ -1,32 +0,0 @@
package com.mhd.user.domain.userAggregate.repository.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 协议天数PO
*/
@Data
public class AgreementDetailsPo {
@ApiModelProperty("客户编码")
private String code;
@ApiModelProperty("协议组织编码")
private String orgcode;
@ApiModelProperty("协议类型名称")
private String ptypename;
@ApiModelProperty("协议类型:1-付款协议天数,2-收款协议天数")
private String ptype;
@ApiModelProperty("财务系统协议编码")
private String pcode;
@ApiModelProperty("协议天数名称")
private String pname;
@ApiModelProperty("协议天数")
private String pday;
}
@@ -47,7 +47,7 @@ public class UserShipperDomainService {
} }
} }
// @DataPermissions(cacheName = "master") // @DataPermissions(cacheName = "master")
public List<UserShipperPo> userShipperList(UserShipperDO userShipperDO) { public List<UserShipperPo> userShipperList(UserShipperDO userShipperDO) {
// 数据权限逻辑已在 UserShipperApplicationService.userShipperList 中处理 // 数据权限逻辑已在 UserShipperApplicationService.userShipperList 中处理
// 这里不再重复处理数据权限直接使用传入的参数进行查询 // 这里不再重复处理数据权限直接使用传入的参数进行查询
@@ -212,15 +212,6 @@ public class UserShipperAPI extends BaseController {
return AjaxResult.success("操作成功",list); return AjaxResult.success("操作成功",list);
} }
@Log(title = "托运人管理-查询租户下所有托运人", description ="查询租户下所有托运人",businessType = BusinessType.INQUIRE)
@ApiOperation("查询租户下所有托运人")
@GetMapping("/userShipperListAllByOrg")
public AjaxResult userShipperListAllByOrg(@RequestParam("orgCode") Long orgCode) {
//转换实体
List<UserShipperPo> list = userShipperApplicationService.userShipperListAllByOrg(orgCode);
return AjaxResult.success("操作成功",list);
}
@Log(title = "托运人管理-修改授权额度 结算天数 使用额度", description ="修改授权额度 结算天数 使用额度",businessType = BusinessType.INQUIRE) @Log(title = "托运人管理-修改授权额度 结算天数 使用额度", description ="修改授权额度 结算天数 使用额度",businessType = BusinessType.INQUIRE)
@ApiOperation("修改授权额度和结算天数") @ApiOperation("修改授权额度和结算天数")
@PutMapping("/settlementInfo") @PutMapping("/settlementInfo")
@@ -21,14 +21,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
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
@@ -781,11 +781,11 @@
/*组织ID - 数据隔离:南光组织(organizationId=2827)查询全部,其他组织查询自己组织的数据*/ /*组织ID - 数据隔离:南光组织(organizationId=2827)查询全部,其他组织查询自己组织的数据*/
<if test="organizationId !=null"> <if test="organizationId !=null">
AND ( AND (
u.organization_id = #{organizationId} u.organization_id = #{organizationId}
OR b.org_code LIKE concat('%"code":"', #{organizationId}, '"%') OR b.org_code LIKE concat('%"code":"', #{organizationId}, '"%')
OR b.org_code LIKE concat('%code:', #{organizationId}, '%') OR b.org_code LIKE concat('%code:', #{organizationId}, '%')
OR b.org_code LIKE concat('%code: ', #{organizationId}, '%') OR b.org_code LIKE concat('%code: ', #{organizationId}, '%')
OR b.org_code LIKE concat('%"code":', #{organizationId}, '%') OR b.org_code LIKE concat('%"code":', #{organizationId}, '%')
) )
AND u.organization_name IS NOT NULL AND u.organization_name IS NOT NULL
</if> </if>
@@ -378,23 +378,13 @@
and b.parent_shipper_id = #{parentShipperId} and b.parent_shipper_id = #{parentShipperId}
</if> </if>
/*用户组织ID*/ /*用户组织ID*/
/*用户组织ID*/ <if test="organizationId !=null">
<if test="organizationId !=null or (orgCode != null and orgCode != '')">
AND ( AND (
<if test="organizationId !=null">
a.organization_id = #{organizationId} a.organization_id = #{organizationId}
OR b.org_code LIKE concat('%"code":"', #{organizationId}, '"%') OR b.org_code LIKE concat('%"code":"', #{organizationId}, '"%')
OR b.org_code LIKE concat('%code:', #{organizationId}, '%') OR b.org_code LIKE concat('%code:', #{organizationId}, '%')
OR b.org_code LIKE concat('%code: ', #{organizationId}, '%') OR b.org_code LIKE concat('%code: ', #{organizationId}, '%')
OR b.org_code LIKE concat('%"code":', #{organizationId}, '%') OR b.org_code LIKE concat('%"code":', #{organizationId}, '%')
</if>
<if test="orgCode != null and orgCode != ''">
<if test="organizationId !=null"> OR </if>
b.org_code LIKE concat('%code:', #{orgCode}, '%')
OR b.org_code LIKE concat('%code: ', #{orgCode}, '%')
OR b.org_code LIKE concat('%"code":', #{orgCode}, '%')
OR b.org_code LIKE concat('%"code":"', #{orgCode}, '"%')
</if>
) )
</if> </if>
/*组织名称*/ /*组织名称*/
@@ -7,7 +7,6 @@ import com.mhd.bms.application.server.receiptManage.ReceiptManageApplicationServ
import com.mhd.bms.domain.billManage.entity.BillDetail; import com.mhd.bms.domain.billManage.entity.BillDetail;
import com.mhd.bms.domain.billManage.entity.BillManage; import com.mhd.bms.domain.billManage.entity.BillManage;
import com.mhd.bms.domain.billManage.repository.facade.IBillDetailService; import com.mhd.bms.domain.billManage.repository.facade.IBillDetailService;
import com.mhd.bms.domain.billManage.repository.facade.IBillManageService;
import com.mhd.bms.domain.billManage.repository.mapper.BillDetailMapper; import com.mhd.bms.domain.billManage.repository.mapper.BillDetailMapper;
import com.mhd.bms.domain.billManage.repository.po.BillDetailPO; import com.mhd.bms.domain.billManage.repository.po.BillDetailPO;
import com.mhd.bms.domain.billManage.repository.po.BillManagePO; import com.mhd.bms.domain.billManage.repository.po.BillManagePO;
@@ -79,8 +78,6 @@ public class BillManageApplicationService {
private BillDetailMapper billDetailMapper; private BillDetailMapper billDetailMapper;
@Autowired @Autowired
private NcLogMapper ncLogMapper; private NcLogMapper ncLogMapper;
@Autowired
private IBillManageService billManageService;
/** /**
@@ -136,12 +133,8 @@ public class BillManageApplicationService {
List<BillManagePO> billManagePOS = billManageDomainService.queryList(billManageDO); List<BillManagePO> billManagePOS = billManageDomainService.queryList(billManageDO);
for (BillManagePO billManagePO : billManagePOS) { for (BillManagePO billManagePO : billManagePOS) {
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));
billManagePO.setBillDetailList(billDetails); billManagePO.setBillDetailList(billDetails);
// 新增 - 导出用LEFT JOIN billing_statement 拿到费用科目
List<BillDetailPO> billDetailPOs = billDetailMapper.getDetailsByBillManageId(billManagePO.getBillManageId());
billManagePO.setBillDetailPOList(billDetailPOs);
} }
return billManagePOS; return billManagePOS;
} }
@@ -367,19 +360,6 @@ public class BillManageApplicationService {
billDetailDTO1.setFeeType(billDetailDTO1.getServiceItemsName()); billDetailDTO1.setFeeType(billDetailDTO1.getServiceItemsName());
}); });
} }
//同步更新已有计费流水调整账单时可修改已有费用
List<BillDetailDTO> billDetailDTOListHasBillingStatementId = billDetailDTOList.stream()
.filter(billDetailDTO -> billDetailDTO.getBillingStatementId() != null)
.collect(Collectors.toList());
for (BillDetailDTO billDetailDTO : billDetailDTOListHasBillingStatementId) {
BillingStatementDO billingStatementDO = new BillingStatementDO();
BeanUtils.copyProperties(billDetailDTO, billingStatementDO);
billingStatementDO.setBillingStatementId(billDetailDTO.getBillingStatementId());
billingStatementDO.setBillManageId(billManagePO.getBillManageId());
billingStatementDO.setBillingState(3);
billingStatementDO.setAccountExpenseType(billDetailDTO.getBillType());
billingStatementApplicationService.update(billingStatementDO);
}
//保存账单明细 //保存账单明细
Boolean flag = billDetailDomainService.saveBatch(billDetailDTOList); Boolean flag = billDetailDomainService.saveBatch(billDetailDTOList);
//更新账单金额 //更新账单金额
@@ -448,7 +428,6 @@ public class BillManageApplicationService {
billManageDO.setReconciliationStatus(1); billManageDO.setReconciliationStatus(1);
billManageDO.setCreateTime(new Date()); billManageDO.setCreateTime(new Date());
billManageDO.setCreateBy(loginUser.getUserid()); billManageDO.setCreateBy(loginUser.getUserid());
billManageDO.setSalesmanId(String.valueOf(loginUser.getUserid()));
billManageDO.setCreateByName(loginUser.getUserPo().getUserName()); billManageDO.setCreateByName(loginUser.getUserPo().getUserName());
billManageDO.setUpdateTime(new Date()); billManageDO.setUpdateTime(new Date());
billManageDO.setUpdateBy(loginUser.getUserid()); billManageDO.setUpdateBy(loginUser.getUserid());
@@ -470,16 +449,6 @@ public class BillManageApplicationService {
for (BillDetailDTO billDetailDTO : billDetailDTOListNoBillingStatementId) { for (BillDetailDTO billDetailDTO : billDetailDTOListNoBillingStatementId) {
BillingStatementDTO billingStatementDTO = new BillingStatementDTO(); BillingStatementDTO billingStatementDTO = new BillingStatementDTO();
BeanUtils.copyProperties(billDetailDTO, billingStatementDTO); BeanUtils.copyProperties(billDetailDTO, billingStatementDTO);
String firstSubjectCode = billDetailDTO.getFirstSubjectCode();
Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode);
BigDecimal amount = billingStatementDTO.getBillingAmount();
BigDecimal taxAmount = amount.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 = amount.subtract(taxAmount);
billingStatementDTO.setTaxAmount(taxAmount);
billingStatementDTO.setTaxFreeFee(taxFreeFee);
billingStatementDTO.setTaxRate(taxRate);
billingStatementDTO.setBillingAmount(amount);
billingStatementDTO.setAccountExpenseType(billDetailDTO.getBillType()); billingStatementDTO.setAccountExpenseType(billDetailDTO.getBillType());
billingStatementDTO.setBillManageId(billManageDO.getBillManageId()); billingStatementDTO.setBillManageId(billManageDO.getBillManageId());
billingStatementDTO.setBillingState(3); billingStatementDTO.setBillingState(3);
@@ -495,47 +464,7 @@ public class BillManageApplicationService {
item.setFeeType(item.getServiceItemsName()); item.setFeeType(item.getServiceItemsName());
}); });
} }
//同步更新已有计费流水新增账单时可修改已有费用
List<BillDetailDTO> billDetailDTOListHasBillingStatementId = billDetailDTOList.stream()
.filter(item -> item.getBillingStatementId() != null)
.collect(Collectors.toList());
for (BillDetailDTO billDetailDTO : billDetailDTOListHasBillingStatementId) {
BillingStatementDO billingStatementDO = new BillingStatementDO();
BeanUtils.copyProperties(billDetailDTO, billingStatementDO);
billingStatementDO.setBillingStatementId(billDetailDTO.getBillingStatementId());
billingStatementDO.setBillManageId(billManageDO.getBillManageId());
billingStatementDO.setBillingState(3);
billingStatementDO.setAccountExpenseType(billDetailDTO.getBillType());
billingStatementApplicationService.update(billingStatementDO);
}
//保存账单明细 //保存账单明细
double allTaxRate = 0.0d;
BigDecimal allTaxAmount = BigDecimal.ZERO;
BigDecimal allTaxFreeFee = BigDecimal.ZERO;
for (BillDetailDTO item : billDetailDTOList) {
String firstSubjectCode = item.getFirstSubjectCode();
Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode);
BigDecimal amount = item.getBillingAmount();
BigDecimal taxAmount = amount.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 = amount.subtract(taxAmount);
item.setTaxAmount(taxAmount);
item.setTaxFreeFee(taxFreeFee);
item.setTaxRate(taxRate);
item.setBillManageId(billManageDO.getBillManageId());
item.setBillNumber(billManageDO.getBillNumber());
allTaxRate += taxRate;
allTaxAmount = allTaxAmount.add(taxAmount);
allTaxFreeFee = allTaxFreeFee.add(taxFreeFee);
}
BillManage billManage = billManageService.getById(billManageDO.getBillManageId());
if (billManage != null) {
billManage.setTaxRate(allTaxRate);
billManage.setTaxAmount(allTaxAmount);
billManage.setTaxFreeFee(allTaxFreeFee);
billManage.setSalesmanId(String.valueOf(loginUser.getUserid()));
billManageService.updateById(billManage);
}
Boolean flagTwo = billDetailDomainService.saveBatch(billDetailDTOList); Boolean flagTwo = billDetailDomainService.saveBatch(billDetailDTOList);
//保存操作记录 //保存操作记录
BillOperationLogDO billOperationLogDO = new BillOperationLogDO(); BillOperationLogDO billOperationLogDO = new BillOperationLogDO();
@@ -547,51 +476,105 @@ public class BillManageApplicationService {
} }
/** /**
* 复制账单-获取原账单数据供前端回显 * 复制账单
* 前端拿到数据后跳转到类似修改/新增账单的页面用户修改后通过addBill接口提交新增
*/ */
public BillManagePO copyBill(BillManageDTO billManageDTO) { @Transactional
public Boolean copyBill(BillManageDTO billManageDTO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
if (billManageDTO.getBillManageId() == null) { if (billManageDTO.getBillManageId() == null) {
throw new ServiceException("原账单id不能为空"); throw new ServiceException("原账单id不能为空");
} }
// 获取原账单信息 // 1. 获取原账单信息
BillManagePO originalBill = billManageDomainService.getInfo(billManageDTO.getBillManageId()); BillManagePO originalBill = billManageDomainService.getInfo(billManageDTO.getBillManageId());
if (null == originalBill) { if (null == originalBill) {
throw new ServiceException("原账单信息未找到"); throw new ServiceException("原账单信息未找到");
} }
// 获取原账单明细 // 2. 获取原账单明细
List<BillDetailPO> originalDetails = billDetailDomainService.getDetailsByBillManageId(billManageDTO.getBillManageId()); List<BillDetailPO> originalDetails = billDetailDomainService.getDetailsByBillManageId(billManageDTO.getBillManageId());
if (originalDetails == null || originalDetails.isEmpty()) { if (originalDetails == null || originalDetails.isEmpty()) {
throw new ServiceException("原账单明细为空,无法复制"); throw new ServiceException("原账单明细为空,无法复制");
} }
// 重置关键字段为初始值清空id等方便前端回显后直接提交新增 // 3. 创建新账单除账单编号外完全复制原账单
originalBill.setBillManageId(null); String newBillNumber = OrderSequence.getOrderCode("ZD");
originalBill.setBillNumber(null); BillManage newBill = new BillManage();
originalBill.setBillState(1); BeanUtils.copyProperties(originalBill, newBill);
originalBill.setBillStep(1); newBill.setBillManageId(null);
originalBill.setReconciliationStatus(0); newBill.setBillNumber(newBillNumber);
originalBill.setIsInvoice(0); newBill.setCreateBy(loginUser.getUserPo().getUserId());
originalBill.setActualReceivedAmount(BigDecimal.ZERO); newBill.setCreateByName(loginUser.getUserPo().getUserName());
originalBill.setBillAmountUnsettled(originalBill.getBillAmount()); newBill.setCreateTime(new Date());
originalBill.setBillAmountSettlement(BigDecimal.ZERO); newBill.setUpdateBy(loginUser.getUserPo().getUserId());
originalBill.setSynchronousStatus(0); newBill.setUpdateByName(loginUser.getUserPo().getUserName());
originalBill.setSkSynchronousStatus(0); newBill.setUpdateTime(new Date());
originalBill.setApplyNumber(null); newBill.setDelFlag(1);
originalBill.setSettlementTime(null); // 复制后重置状态字段为初始值
originalBill.setSynchronousTime(null); // 账单状态对账状态发票状态重置
originalBill.setSkSynchronousTime(null); newBill.setBillState(1); // 1-未确认
originalBill.setInvoiceId(null); newBill.setBillStep(1); // 1-发起对账
originalBill.setInvoiceMakeTime(null); newBill.setReconciliationStatus(0); // 1-暂未确认
originalBill.setNcId(null); newBill.setIsInvoice(0); // 0-未索取
originalBill.setSkNcId(null); // 实收=0未收=账单金额
// 明细也清空id newBill.setActualReceivedAmount(BigDecimal.ZERO);
for (BillDetailPO detail : originalDetails) { newBill.setBillAmountUnsettled(newBill.getBillAmount());
detail.setBillDetailId(null); newBill.setBillAmountSettlement(BigDecimal.ZERO);
detail.setBillManageId(null); // NC同步状态重置
detail.setBillNumber(null); newBill.setSynchronousStatus(0); // 0-未同步
newBill.setSkSynchronousStatus(0); // 0-未同步
// 清空发票收款推送相关字段
newBill.setApplyNumber(null); // 发票申请单号
newBill.setSettlementTime(null); // 收款时间
newBill.setSynchronousTime(null); // 应收单推送时间
newBill.setSkSynchronousTime(null); // 收款单推送时间
newBill.setInvoiceId(null); // 发票表ID
newBill.setInvoiceMakeTime(null); // 开票时间
newBill.setNcId(null); // nc唯一标识应收
newBill.setSkNcId(null); // nc唯一标识收款
// 保存新账单
boolean flag = billManageDomainService.saveEntity(newBill);
if (!flag) {
throw new ServiceException("复制账单失败,请重试");
} }
originalBill.setBillDetailPOList(originalDetails); // 4. 复制账单明细
return originalBill; List<BillDetail> newDetailList = new ArrayList<>();
for (BillDetailPO originalDetail : originalDetails) {
BillDetail newDetail = new BillDetail();
BeanUtils.copyProperties(originalDetail, newDetail);
newDetail.setBillDetailId(null);
newDetail.setBillManageId(newBill.getBillManageId());
newDetail.setBillNumber(newBillNumber);
newDetail.setCreateBy(loginUser.getUserPo().getUserId());
newDetail.setCreateByName(loginUser.getUserPo().getUserName());
newDetail.setCreateTime(new Date());
newDetailList.add(newDetail);
}
Boolean flagTwo = billDetailDomainService.insertBatch(newDetailList);
// 5. 复制计费流水billing_statement
List<BillingStatementPO> originalStatements = billingStatementDomainService.getDetailsByManageId(billManageDTO.getBillManageId());
boolean flagThree = true;
if (originalStatements != null && !originalStatements.isEmpty()) {
List<BillingStatement> newStatementList = new ArrayList<>();
for (BillingStatementPO originalStatement : originalStatements) {
BillingStatement newStatement = new BillingStatement();
BeanUtils.copyProperties(originalStatement, newStatement);
newStatement.setBillingStatementId(null);
newStatement.setBillManageId(newBill.getBillManageId());
newStatement.setCreateBy(loginUser.getUserPo().getUserId());
newStatement.setCreateByName(loginUser.getUserPo().getUserName());
newStatement.setCreateTime(new Date());
newStatementList.add(newStatement);
}
flagThree = billingStatementDomainService.saveEntityBatch(newStatementList);
}
// 6. 保存操作日志
BillOperationLogDO billOperationLogDO = new BillOperationLogDO();
billOperationLogDO.setBillManageId(newBill.getBillManageId());
billOperationLogDO.setOperationInfo(StringUtils.format(BillLogsConstants.copy_bill_text, originalBill.getBillNumber(), newBillNumber));
billOperationLogDO.setOperationType(1);
boolean three = billOperationLogDomainService.saveBillOperationLog(billOperationLogDO);
return flag && flagTwo && flagThree && three;
} }
/** /**
@@ -585,8 +585,6 @@ public class BillingStatementApplicationService {
此方法只进行实体返回并不进行数据保存 此方法只进行实体返回并不进行数据保存
*/ */
LoginUser loginUser = SecurityUtils.getLoginUser(); LoginUser loginUser = SecurityUtils.getLoginUser();
billingStatementDO.setAccountExpenseType(billingStatementDO.getAccountExpenseType());
if (ObjectUtil.isNull(loginUser)) { if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT); throw new DigitalLogisticsException(UserError.TIMEOUT);
} }
@@ -596,10 +594,7 @@ public class BillingStatementApplicationService {
BeanUtils.copyProperties(billingStatementDO,billingStatementPO); BeanUtils.copyProperties(billingStatementDO,billingStatementPO);
billingStatementPO.setBillingTotalAmount(billingStatementDO.getBillingAmount()); billingStatementPO.setBillingTotalAmount(billingStatementDO.getBillingAmount());
billingStatementPO.setDataSources(2); billingStatementPO.setDataSources(2);
// 若传入了计费流水号则直接使用否则自动生成 billingStatementPO.setBillingFlow(OrderSequence.getOrderCode("JFLS"));
if (StringUtils.isEmpty(billingStatementPO.getBillingFlow())) {
billingStatementPO.setBillingFlow(OrderSequence.getOrderCode("JFLS"));
}
billingStatementPO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); billingStatementPO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
billingStatementPO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); billingStatementPO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
billingStatementPO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); billingStatementPO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
@@ -274,7 +274,7 @@ public class SettlementCustomersApplicationService {
SyncDictCache dictCache, SyncDictCache dictCache,
List<SettlementCustomers> toInsert, List<SettlementCustomers> toInsert,
List<SettlementCustomers> toUpdate) { List<SettlementCustomers> toUpdate) {
AjaxResult ajaxResult = userServiceFeign.userShipperListAllByOrg(loginUser.getUserPo().getOrganizationId()); AjaxResult ajaxResult = userServiceFeign.userShipperListAll();
List<UserShipperPo> userShipperPoList = parseFeignList(ajaxResult, UserShipperPo.class); List<UserShipperPo> userShipperPoList = parseFeignList(ajaxResult, UserShipperPo.class);
if (userShipperPoList.isEmpty()) { if (userShipperPoList.isEmpty()) {
return; return;
@@ -88,10 +88,4 @@ public class BillDetail extends BaseVOEntity{
private String invoiceItemName; private String invoiceItemName;
@ApiModelProperty(value = "费用类别") @ApiModelProperty(value = "费用类别")
private String feeType; private String feeType;
@ApiModelProperty(value = "计费单位")
private String billingUnit;
@ApiModelProperty(value = "计费数量")
private BigDecimal billingNum;
@ApiModelProperty(value = "计费单价")
private BigDecimal billingUnitPrice;
} }
@@ -38,6 +38,4 @@ public interface IBillDetailService extends IService<BillDetail>
public BillDetailPO getInfo(Long billDetailId); public BillDetailPO getInfo(Long billDetailId);
List<BillDetailPO> getDetailsByBillManageId(Long billManageId); List<BillDetailPO> getDetailsByBillManageId(Long billManageId);
}
List<BillDetail> getDetailsByBillManageIdAndGroup(Long billManageId);
}
@@ -5,7 +5,6 @@ import com.mhd.bms.domain.billManage.entity.BillDetail;
import com.mhd.bms.domain.billManage.repository.po.BillDetailPO; import com.mhd.bms.domain.billManage.repository.po.BillDetailPO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/** /**
@@ -18,8 +17,4 @@ public interface BillDetailMapper extends BaseMapper<BillDetail>
{ {
List<BillDetailPO> getDetailsByBillManageId(@Param("billManageId") Long billManageId); List<BillDetailPO> getDetailsByBillManageId(@Param("billManageId") Long billManageId);
}
List<BillDetail> getDetailsByBillManageIdAndGroup(@Param("billManageId") Long billManageId);
Double getTaxRate(@Param("code") String code);
}
@@ -44,6 +44,4 @@ public interface BillManageMapper extends BaseMapper<BillManage>
String getDeptName(@Param("dictCode") String dictCode); String getDeptName(@Param("dictCode") String dictCode);
String getOrgCodeNc(@Param("organizationId") Long organizationId); String getOrgCodeNc(@Param("organizationId") Long organizationId);
Long getShipperId(@Param("userId") Long userId, @Param("organizationId") Long organizationId);
} }
@@ -75,9 +75,4 @@ public class BillDetailImpl extends ServiceImpl<BillDetailMapper, BillDetail> im
public List<BillDetailPO> getDetailsByBillManageId(Long billManageId) { public List<BillDetailPO> getDetailsByBillManageId(Long billManageId) {
return billDetailMapper.getDetailsByBillManageId(billManageId); return billDetailMapper.getDetailsByBillManageId(billManageId);
} }
}
@Override
public List<BillDetail> getDetailsByBillManageIdAndGroup(Long billManageId) {
return billDetailMapper.getDetailsByBillManageIdAndGroup(billManageId);
}
}
@@ -134,11 +134,5 @@ public class BillDetailPO extends BaseVOEntity{
private String invoiceItemName; private String invoiceItemName;
@ApiModelProperty(value = "费用类别") @ApiModelProperty(value = "费用类别")
private String feeType; private String feeType;
@ApiModelProperty(value = "计费单位")
private String billingUnit;
@ApiModelProperty(value = "计费数量")
private BigDecimal billingNum;
@ApiModelProperty(value = "计费单价")
private BigDecimal billingUnitPrice;
} }
@@ -262,9 +262,4 @@ public class BillManagePO extends BaseVOEntity{
@ApiModelProperty("收款帐户名称") @ApiModelProperty("收款帐户名称")
private String paymentAccountName; private String paymentAccountName;
private List<BillDetail> billDetailList; private List<BillDetail> billDetailList;
@ApiModelProperty("最近收款时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@Excel(name = "最近收款时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date collectionTime;
} }
@@ -98,10 +98,4 @@ public class BillDetailDO extends BaseVOEntity{
private String invoiceItemName; private String invoiceItemName;
@ApiModelProperty(value = "费用类别") @ApiModelProperty(value = "费用类别")
private String feeType; private String feeType;
@ApiModelProperty(value = "计费单位")
private String billingUnit;
@ApiModelProperty(value = "计费数量")
private BigDecimal billingNum;
@ApiModelProperty(value = "计费单价")
private BigDecimal billingUnitPrice;
} }
@@ -264,6 +264,4 @@ public class BillManageDO extends BaseVOEntity{
private String paymentAccountId; private String paymentAccountId;
@ApiModelProperty("收款帐户名称") @ApiModelProperty("收款帐户名称")
private String paymentAccountName; private String paymentAccountName;
@ApiModelProperty("业务员ID")
private String salesmanId;
} }
@@ -100,10 +100,6 @@ public class BillingStatementPO extends BaseVOEntity{
@Excel(name = "收支类型", readConverterExp = "1=-应收,2-应付") @Excel(name = "收支类型", readConverterExp = "1=-应收,2-应付")
private Integer accountExpenseType; private Integer accountExpenseType;
@ApiModelProperty("收支类型(1-应收,2-应付)")
@Excel(name = "收支类型", readConverterExp = "1=-应收,2-应付")
private Integer billType;
@ApiModelProperty("流水备注") @ApiModelProperty("流水备注")
@Excel(name = "流水备注") @Excel(name = "流水备注")
private String billingRemark; private String billingRemark;
@@ -101,10 +101,6 @@ public class BillingStatementDO extends BaseVOEntity{
@Excel(name = "收支类型", readConverterExp = "1=-应收,2-应付") @Excel(name = "收支类型", readConverterExp = "1=-应收,2-应付")
private Integer accountExpenseType; private Integer accountExpenseType;
@ApiModelProperty("收支类型(1-应收,2-应付)")
@Excel(name = "收支类型", readConverterExp = "1=-应收,2-应付")
private Integer billType;
@ApiModelProperty("流水备注") @ApiModelProperty("流水备注")
@Excel(name = "流水备注") @Excel(name = "流水备注")
private String billingRemark; private String billingRemark;
@@ -180,9 +180,6 @@ public class ReceiptManageDomainService {
receiptManageDO.setCreateBy(loginUser.getUserPo().getUserId()); receiptManageDO.setCreateBy(loginUser.getUserPo().getUserId());
receiptManageDO.setCreateByName(loginUser.getUserPo().getUserName()); receiptManageDO.setCreateByName(loginUser.getUserPo().getUserName());
receiptManageDO.setCreateTime(new Date()); receiptManageDO.setCreateTime(new Date());
if (receiptManageDO.getCollectionTime() == null) {
receiptManageDO.setCollectionTime(new Date());
}
ReceiptManage receiptManage = new ReceiptManage(); ReceiptManage receiptManage = new ReceiptManage();
BeanUtils.copyProperties(receiptManageDO,receiptManage); BeanUtils.copyProperties(receiptManageDO,receiptManage);
Boolean flagTwo = receiptManageService.save(receiptManage); Boolean flagTwo = receiptManageService.save(receiptManage);

Some files were not shown because too many files have changed in this diff Show More