Author SHA1 Message Date
王奎兴 a2e3f23798 nc推送地址修改 2026-01-20 16:04:51 +08:00
王奎兴 7a45568be6 nc推送地址修改 2026-01-20 14:03:38 +08:00
王奎兴 8ba0c64b62 nc推送地址修改 2026-01-20 14:01:13 +08:00
hjx 22d5a1ea3f nc组装报文修改 2026-01-19 20:53:49 +08:00
hjx 258417cac7 nc改成测试环境 2026-01-19 18:59:52 +08:00
hjx a7b7e2c82d nc改成测试环境 2026-01-19 18:58:56 +08:00
hjx 88ac989ced 南歧nc推送税费金额修改 2026-01-19 16:55:50 +08:00
hjx 1837337488 南歧nc推送 2026-01-16 16:43:50 +08:00
hjx e342fa92a8 南歧nc推送 2026-01-16 15:54:28 +08:00
hjx ae76596503 南歧nc推送 2026-01-16 15:46:28 +08:00
hjx b25c795d4e 正式环境配置 2026-01-16 13:30:16 +08:00
hjx b6f5ed6dab 类别查询修改 2026-01-16 11:47:46 +08:00
hjx 90e6ec8086 测试环境配置 2026-01-16 10:47:22 +08:00
hjx ff334b155c 费用科目查询修改 2026-01-16 10:08:01 +08:00
hjx 2fa97d50e1 测试环境配置 2026-01-15 14:49:09 +08:00
hjx 9efd0426d4 nc南歧应收单推送修改 2026-01-15 14:47:54 +08:00
王奎兴 f6231256d5 配置文件; 2026-01-15 14:31:31 +08:00
王奎兴 e6d91c8d1d 打印去重; 2026-01-15 11:55:21 +08:00
王奎兴 7e50d8d5c6 打印去重; 2026-01-15 11:52:58 +08:00
王奎兴 ea771777bb Merge remote-tracking branch 'origin/master' 2026-01-15 11:45:58 +08:00
王奎兴 84e1767812 打印去重; 2026-01-15 11:45:33 +08:00
hjx 744cbc532b nc收款单推送修改 2026-01-15 11:41:51 +08:00
hjx 355953940a Merge remote-tracking branch 'origin/master' into master 2026-01-15 11:35:40 +08:00
hjx 70dd99d497 nc收款单推送修改 2026-01-15 11:35:30 +08:00
王奎兴 eb98e9e4bd 打印去重; 2026-01-15 11:29:08 +08:00
王奎兴 52f5b6e0d6 Merge branch 'refs/heads/test' 2026-01-15 07:56:41 +08:00
王奎兴 0b584352cb 配置文件 2026-01-15 07:54:26 +08:00
hjx dfd7b34172 nc判断科目金额是否大于0 2026-01-15 07:38:34 +08:00
hjx 015162d5c9 Merge branch 'dev' into master
# Conflicts:
#	mhd-auth/src/main/resources/bootstrap.yml
#	mhd-gateway/src/main/resources/bootstrap.yml
#	mhd-user-center/src/main/resources/bootstrap.yml
#	mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java
2026-01-15 03:36:33 +08:00
hjx e6b81b38ee 测试环境配置 2026-01-15 03:10:13 +08:00
hjx b3355cd1d0 测试环境配置 2026-01-15 02:47:42 +08:00
hjx 9da953619f nc通宇修改 2026-01-15 02:40:58 +08:00
hjx 781d530c21 NC推送修改 2026-01-15 01:54:11 +08:00
hjx 419cb53845 查询科目信息修改 2026-01-15 01:37:04 +08:00
hjx f73f74939f 通宇nc修改 2026-01-15 00:45:29 +08:00
hjx 8ea215c58c 通宇组装摘要修改 2026-01-14 23:45:54 +08:00
王奎兴 4bde2aee3d 配置文件 2026-01-14 23:30:43 +08:00
王奎兴 9996f59fe4 角色管理查询不过滤RoleGrade 2026-01-14 23:25:17 +08:00
王奎兴 e5f8ddd8b6 配置文件修改; 2026-01-14 22:31:02 +08:00
王奎兴 0533d1a941 Merge branch 'refs/heads/test' into dev 2026-01-14 22:28:59 +08:00
王奎兴 536079a024 发票打印修改; 2026-01-14 22:28:27 +08:00
hjx a648c4a50d 应收账单科目修改 2026-01-14 22:01:21 +08:00
hjx a484296ab8 应收账单查询科目信息 2026-01-14 19:03:28 +08:00
hjx 1708b4384c 应收账单保存科目信息和nc推送修改 2026-01-14 17:24:20 +08:00
王奎兴 8d89f5ec27 应收账单结算页面结算币种 2026-01-14 16:46:00 +08:00
王奎兴 84ab2c8bf9 Merge remote-tracking branch 'refs/remotes/origin/dev' into test
# Conflicts:
#	mhd-gateway/src/main/resources/bootstrap.yml
#	mhd-modules/mhd-system/src/main/resources/bootstrap.yml
2026-01-14 16:40:52 +08:00
hjx 14cfad6b50 修改科目创建订单默认显示设置 2026-01-14 15:20:06 +08:00
hjx abf2847475 科目信息修改 2026-01-14 14:56:25 +08:00
王奎兴 65552144eb Merge branch 'dev_wkx_yutong_20260106' into dev 2026-01-14 14:25:08 +08:00
王奎兴 2558e1ab2a 应收账单结算页面结算币种 2026-01-14 10:59:42 +08:00
高正杨 64d2a5e001 发单报found2; 2026-01-14 09:46:37 +08:00
高正杨 801a7c3b9c equals判空; 2026-01-14 08:33:56 +08:00
1745237360-cloud 932c432eff Merge remote-tracking branch 'origin/dev' into dev 2026-01-13 20:43:18 +08:00
1745237360-cloud 6606c65d73 数据权限的bug修改260113 2026-01-13 20:43:04 +08:00
王奎兴 89b5d544c6 Merge branch 'dev_wkx_yutong_20260106' into dev 2026-01-13 18:54:45 +08:00
王奎兴 8f0d4ed687 委托方查询结算币种 2026-01-13 18:54:18 +08:00
王奎兴 e77897c597 委托方查询结算币种 2026-01-13 18:48:00 +08:00
hjx 931d63a5da nc对接修改添加通宇 2026-01-13 17:26:59 +08:00
1745237360-cloud 8924757467 Merge remote-tracking branch 'origin/dev' into dev 2026-01-13 15:17:12 +08:00
1745237360-cloud 7476599ffd 数据权限的bug修改260113 2026-01-13 15:16:55 +08:00
hjx bb43850227 Merge remote-tracking branch 'origin/dev' into dev 2026-01-13 14:16:55 +08:00
hjx 32d638730d nc对接修改添加通宇 2026-01-13 14:16:24 +08:00
1745237360-cloud c4bd6d18d4 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	mhd-user-center/src/main/resources/mapper/UserMapper.xml
2026-01-13 11:34:46 +08:00
1745237360-cloud 035593b419 数据权限的bug修改260113 2026-01-13 11:32:57 +08:00
王奎兴 d7df2da828 委托方查询结算币种 2026-01-12 15:23:19 +08:00
1745237360-cloud 935c154136 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	mhd_finance/src/main/java/com/linke/finance/application/server/reconciliation/ReconciliationApplicationService.java
2026-01-12 14:32:37 +08:00
1745237360-cloud c8493dd658 数据权限的bug修改 2026-01-12 14:30:00 +08:00
赵辉 d2e8d6ab30 Merge branch 'refs/heads/dev_zh_ty_20260108' into dev 2026-01-12 13:54:15 +08:00
赵辉 540a687f7e 修改副驾绑定 2026-01-12 13:53:01 +08:00
王奎兴 c337a7ed49 委托方查询接口添加结算币种; 2026-01-10 20:39:53 +08:00
1745237360-cloud f7e6f70321 Merge branch 'refs/heads/dev_qinhongzhan' into dev
# Conflicts:
#	mhd-auth/src/main/resources/bootstrap.yml
#	mhd-gateway/src/main/resources/bootstrap.yml
#	mhd-modules/mhd-system/src/main/resources/bootstrap.yml
#	mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/entity/UserShipperEntity.java
#	mhd-user-center/src/main/resources/bootstrap.yml
#	mhd_finance/src/main/java/com/linke/finance/application/server/reconciliation/ReconciliationApplicationService.java
#	mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/CreateMaterialCommand.java
2026-01-10 16:45:38 +08:00
1745237360-cloud 4b427e1b2e 数据权限的修改 2026-01-10 16:39:33 +08:00
hjx 2e284f450d nc切换正式地址 2026-01-07 15:55:21 +08:00
hjx af7dda73de Merge branch 'dev' into master
# Conflicts:
#	mhd-auth/src/main/resources/bootstrap.yml
#	mhd-gateway/src/main/resources/bootstrap.yml
#	mhd-modules/mhd-system/src/main/resources/bootstrap.yml
#	mhd-user-center/src/main/resources/bootstrap.yml
2026-01-07 15:04:36 +08:00
王奎兴 3ec71c4a88 Merge remote-tracking branch 'origin/dev_wkx_yutong_20260106' into dev 2026-01-06 18:59:01 +08:00
王奎兴 0db01980b8 物料不选货主也可更新; 2026-01-06 17:48:12 +08:00
hjx 865610fda3 推送nc输出日志 2026-01-06 17:43:18 +08:00
王奎兴 8b98c54d11 Revert "回复大小写敏感;"
This reverts commit 6cb96410a2.
2026-01-05 15:50:23 +08:00
王奎兴 fd579a6f42 nacos配置; 2026-01-05 13:17:16 +08:00
王奎兴 f14547eb53 nacos配置; 2026-01-05 08:42:07 +08:00
王奎兴 e71c9d6e58 nacos配置; 2026-01-04 17:47:39 +08:00
王奎兴 6cb96410a2 回复大小写敏感; 2025-12-31 14:05:07 +08:00
王奎兴 2ddb557bcc nacos修改; 2025-12-30 14:41:03 +08:00
王奎兴 29b24e8450 nacos修改; 2025-12-30 13:50:37 +08:00
王奎兴 04d5ef1645 nacos修改; 2025-12-30 13:18:57 +08:00
王奎兴 dae359655a nacos修改; 2025-12-30 10:56:42 +08:00
王奎兴 40744bb5c1 开通钱包失败取消 2025-12-30 10:54:16 +08:00
王奎兴 d9113d0523 货主不为空取消 2025-12-29 19:02:13 +08:00
王奎兴 6f9b1a6026 nacos 2025-12-26 17:53:55 +08:00
王奎兴 be97110b3c 华为云obs; 2025-12-26 15:35:12 +08:00
王奎兴 3ea4bb8170 华为云obs; 2025-12-26 14:19:38 +08:00
王奎兴 4c560ef88c 华为云obs; 2025-12-26 13:28:46 +08:00
王奎兴 50069a27b0 华为云obs; 2025-12-26 12:28:14 +08:00
hjx 5aa70ed41b 正式环境配置 2025-12-25 16:03:30 +08:00
王奎兴 1259c189b0 华为云obs;结算货币; 2025-12-25 10:20:17 +08:00
王奎兴 a044117187 华为云obs; 2025-12-24 16:19:50 +08:00
王奎兴 dfcac0b5a5 Merge remote-tracking branch 'origin/dev' into dev 2025-12-24 15:41:26 +08:00
王奎兴 b29d0b1f3e 华为云obs; 2025-12-24 15:41:10 +08:00
hjx 5182db6528 Merge remote-tracking branch 'origin/dev' into dev 2025-12-24 10:09:02 +08:00
hjx c8fdea2c3a 测试环境配置 2025-12-24 10:08:43 +08:00
王奎兴 55196b1c14 华为云obs; 2025-12-23 19:55:09 +08:00
王奎兴 7e6b464432 华为云obs; 2025-12-23 16:59:16 +08:00
王奎兴 98af145acb 华为云obs; 2025-12-23 16:18:19 +08:00
王奎兴 1d9629127a 结算币种修改; 2025-12-23 13:38:56 +08:00
hjx b55a782473 测试环境配置 2025-12-19 10:39:08 +08:00
hjx b11a0be679 nc问题修改 2025-12-18 03:35:08 +08:00
hjx 88c3548129 nc问题修改 2025-12-18 03:34:06 +08:00
hjx 9bc90fe601 nc问题修改 2025-12-18 03:08:18 +08:00
hjx d805e2d642 nc问题修改 2025-12-18 01:35:35 +08:00
hjx d2da556697 nc问题修改 2025-12-18 01:30:31 +08:00
hjx 3ee81a06eb nc问题修改 2025-12-18 01:29:02 +08:00
hjx b8799a1ec7 nc问题修改 2025-12-18 00:29:03 +08:00
hjx b00308b729 Merge branch 'dev' into master
# Conflicts:
#	mhd-common/mhd-common-core/src/main/java/minio/MinIoUploadService.java
#	mhd_product/pom.xml
2025-12-17 23:27:46 +08:00
hjx 84a4ee1e76 问题修改 2025-12-17 23:16:58 +08:00
hjx 2c0882ae2d 问题修改 2025-12-17 19:03:43 +08:00
王奎兴 09880952cf 获取网络货运司机id 2025-12-17 18:49:27 +08:00
hjx e3f242f97b 问题修改 2025-12-17 18:41:12 +08:00
hjx bcabed521d 问题修改 2025-12-17 18:02:55 +08:00
王奎兴 2199c8c739 获取网络货运司机id 2025-12-17 17:45:54 +08:00
hjx 8bc07e8090 解决产品启动问题 2025-12-17 10:09:44 +08:00
王奎兴 7ed03628fa mqbug 2025-12-16 23:22:32 +08:00
赵辉 2b3fa73db1 Merge branch 'refs/heads/nanguangmall' into dev 2025-12-16 17:08:56 +08:00
赵辉 c78b9c325c userDriver类中添加车辆主体 2025-12-16 17:02:34 +08:00
王奎兴 6c2fb7c013 bug 2025-12-15 22:15:42 +08:00
赵辉 5cc3b9a62f Merge branch 'refs/heads/nanguangmall' into dev 2025-12-15 17:16:34 +08:00
王奎兴 c27e2b624d 漏扫问题修改; 2025-12-15 17:15:42 +08:00
赵辉 21157b70ed 添加根据用户id查询企业信息 2025-12-15 17:15:16 +08:00
hjx 89e68566bf Merge remote-tracking branch 'origin/dev' into dev 2025-12-14 18:21:47 +08:00
hjx 088460459b 漏洞修改 2025-12-14 18:21:34 +08:00
王奎兴 4a7d28350e Revert "恢复大小写"
This reverts commit 52cdfbe6d9.
2025-12-14 15:12:59 +08:00
hjx 04e26568ae Merge branch 'loudongsaomiao_20251213' into dev 2025-12-14 15:00:38 +08:00
王奎兴 52cdfbe6d9 恢复大小写 2025-12-14 14:29:16 +08:00
赵辉 2b385f45cd Merge branch 'refs/heads/nanguangmall' into dev 2025-12-13 23:07:56 +08:00
赵辉 51b5ae5d13 12.13修改 2025-12-13 23:06:31 +08:00
王奎兴 927b5a4411 Merge remote-tracking branch 'origin/dev_wkx_20251209' into dev 2025-12-13 22:59:55 +08:00
王奎兴 0beab25b52 bug修复; 2025-12-13 22:59:26 +08:00
王奎兴 c830009948 Merge remote-tracking branch 'origin/dev_wkx_20251209' into dev 2025-12-13 22:06:34 +08:00
王奎兴 4248a334ab bug修复; 2025-12-13 22:06:02 +08:00
王奎兴 97330de8ba bug修复; 2025-12-13 20:48:24 +08:00
hjx 133824fb53 漏洞修改 2025-12-13 19:52:26 +08:00
hjx f8399951b3 Merge branch 'dev_nc2k_20251213' into dev
# Conflicts:
#	mhd-auth/src/main/resources/bootstrap.yml
#	mhd-gateway/src/main/resources/bootstrap.yml
#	mhd-modules/mhd-system/src/main/resources/bootstrap.yml
#	mhd-user-center/src/main/resources/bootstrap.yml
#	mhd_finance/src/main/resources/bootstrap.yml
#	mhd_product/src/main/resources/bootstrap.yml
#	mhd_thrid_party/src/main/resources/bootstrap.yml
#	mhd_transport/src/main/resources/bootstrap.yml
2025-12-13 17:32:20 +08:00
hjx 3447d2f7bc nc上传添加字段传值 2025-12-13 17:26:17 +08:00
hjx 8affee1409 漏洞扫描修改 2025-12-13 15:06:42 +08:00
hjx a18fd9d59b 漏洞扫描修改 2025-12-13 15:04:36 +08:00
王奎兴 74e735353f 本地开发分支配置文件修改 2025-12-12 10:16:50 +08:00
王奎兴 afc49be45f 订单发货校验去除; 2025-12-12 10:16:18 +08:00
hjx 61e52aa744 配置文件修改 2025-12-11 14:42:10 +08:00
hjx f485b040e1 配置文件修改 2025-12-11 14:28:35 +08:00
hjx 3d4df0a154 Merge branch 'dev_minio_20251210' into master 2025-12-11 12:38:42 +08:00
hjx d58b948c3a 配置文件修改 2025-12-10 15:05:19 +08:00
hjx c6709936f9 配置文件修改 2025-12-10 14:24:02 +08:00
赵辉 df299a21ae Merge remote-tracking branch 'refs/remotes/origin/dev' into nanguangmall 2025-12-10 09:28:06 +08:00
赵辉 7b10ff2b25 12.9修改 2025-12-10 09:21:33 +08:00
赵辉 0b361ba2b7 12.6修改 2025-12-06 20:31:05 +08:00
赵辉 a950417939 12.5修改 2025-12-05 21:42:06 +08:00
209 changed files with 8732 additions and 1174 deletions
@@ -14,6 +14,7 @@ import com.mhd.common.core.domain.entity.RevenueExpensesRecord;
import com.mhd.common.core.domain.entity.SysConfigSwitch;
import com.mhd.common.core.domain.entity.TmsOrder;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.utils.sms.Result;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.system.api.domain.*;
import com.mhd.system.api.feign.FeignAutoConfiguration;
@@ -302,7 +303,13 @@ public interface WlhyServiceFeign {
@GetMapping(value = "/feign/transportNote/selectByOrderNum")
public R<TmsTransportNote> selectByOrderNum(@RequestParam(value = "orderNo") String orderNo);
/**
* 根据发票id查询发票信息
* @param id
* @return
*/
@GetMapping(value = "/feign/invoiceList/selectById")
public R<TmsInvoiceListDetailsVO> selectInvoiceListById(@RequestParam(value = "id") String id);
/**
* 运输单表-支付回调
* @param tmsPayCallbackList
@@ -509,4 +516,6 @@ public interface WlhyServiceFeign {
@PostMapping(value = "/feign/outBoundSummary/getOrderListByReconciliation")
public R<List<TmsOrder>> getOrderListByReconciliation(@RequestBody ReconciliationDTO reconciliationDTO);
@GetMapping(value = "/ntocc/tmsSettlementExchangeRate/queryById")
public Result<?> queryById(@RequestParam(name="id",required=true) String id);
}
@@ -0,0 +1,226 @@
package com.mhd.system.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description: 销项发票表
* @Author: lfs
* @Date: 2020-02-19 08:50:47
* @Version: V1.0
*/
@Data
@TableName("tms_invoice_list")
public class TmsInvoiceList implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ID_WORKER_STR)
private String id;
/**发票抬头*/
@ApiModelProperty(value = "发票抬头")
private String invoiceTitle;
/**发票金额*/
@ApiModelProperty(value = "发票金额")
private BigDecimal invoiceValue;
/**发票备注*/
@ApiModelProperty(value = "发票备注")
private String remark;
/**发票状态(0-未开票,1-已取消申请,2-已开票,3-已驳回,4-已寄出,5-已作废)*/
@ApiModelProperty(value = "发票状态(0-未开票,1-已取消申请,2-已开票,3-已驳回,4-已寄出,5-已作废)")
private Integer invoiceState;
/**发票申请时间*/
@ApiModelProperty(value = "发票申请时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date invoiceApplyTime;
/**申请人ID*/
@ApiModelProperty(value = "申请人ID")
private String applicantId;
/**发票申请单号*/
@ApiModelProperty(value = "发票申请单号")
private String applyNumber;
/**驳回原因*/
@ApiModelProperty(value = "驳回原因")
private String rejectReason;
/**运输单ids*/
@ApiModelProperty(value = "运输单ids")
private String transportationIds;
/**退票备注*/
@ApiModelProperty(value = "退票备注")
private String refundRemark;
/**处理人ID(取消申请/开票/驳回)*/
@ApiModelProperty(value = "处理人ID(取消申请/开票/驳回)")
private String managerId;
/**处理时间*/
@ApiModelProperty(value = "处理时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date managerTime;
/**寄出人ID*/
@ApiModelProperty(value = "寄出人ID")
private String sendById;
/**寄出时间*/
@ApiModelProperty(value = "寄出时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date sendTime;
/**寄出邮费*/
@ApiModelProperty(value = "寄出邮费")
private BigDecimal sendPostage;
/**快递公司*/
@ApiModelProperty(value = "快递公司")
private String courierServicesCompany;
/**收件地址id*/
@ApiModelProperty(value = "收件地址id")
private String receivingAddressId;
/**手机号*/
@ApiModelProperty(value = "手机号")
private String phone;
/**收件人姓名*/
@ApiModelProperty(value = "收件人姓名")
private String receivingName;
/**邮政编码*/
@ApiModelProperty(value = "邮政编码")
private String postalCode;
/**所在地区*/
@ApiModelProperty(value = "所在地区")
private String location;
/**创建人*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建日期*/
@ApiModelProperty(value = "创建日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新日期*/
@ApiModelProperty(value = "更新日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**是否删除(0-否,1-是)*/
@ApiModelProperty(value = "是否删除(0-否,1-是)")
private Integer isDelete;
/**所属部门*/
@ApiModelProperty(value = "所属部门")
private String sysOrgCode;
/**发票类型(0-增值税专用发票,1-普通发票)*/
@ApiModelProperty(value = "发票类型(0-增值税专用发票,1-普通发票)")
private Integer invoiceType;
/**发票性质(0-纸质发票,1-电子发票)*/
@ApiModelProperty(value = "发票性质(0-纸质发票,1-电子发票)")
private Integer invoiceNature;
/**发票号*/
@ApiModelProperty(value = "发票号")
private String invoiceNumber;
/**快递单号*/
@ApiModelProperty(value = "快递单号")
private String trackingNumber;
/**开票代码*/
@ApiModelProperty(value = "开票代码")
private String invoiceCode;
/**发票详情信息上报状态:0-未上报,1-已上报,2-上报失败*/
@ApiModelProperty(value = "发票详情信息上报状态:0-未上报,1-已上报,2-上报失败")
private Integer isReport;
/**发票详情信息上报失败原因*/
@ApiModelProperty(value = "发票详情信息上报失败原因")
private String errMsg;
/**发票详情信息上报时间*/
@ApiModelProperty(value = "发票详情信息上报时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reportTime;
@ApiModelProperty(value = "运单事实创建人ID(创建运单时的当前登录人USER-ID)")
private String realCreateBy;
@ApiModelProperty(value = "运单事实创建人名称(创建运单时的当前登录人REAL-NAME)")
private String realCreateName;
@ApiModelProperty(value = "开票时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date invoiceMakeTime;
/**货主信息id*/
@ApiModelProperty(value = "货主信息id")
private String shipperId;
/**货主信息id*/
@ApiModelProperty(value = "货主姓名")
private String shipperName;
/**货主信息id*/
@ApiModelProperty(value = "货主公司名称")
private String companyName;
/**税务登记证号*/
@ApiModelProperty(value = "税务登记证号")
private String taxRegAccount;
/**组织ID*/
@ApiModelProperty(value = "组织ID")
private Long organizationId;
/**组织名称*/
@ApiModelProperty(value = "组织名称")
private String organizationName;
/**一级组织ID*/
@ApiModelProperty(value = "一级组织ID")
private Long topOrganizationId;
}
@@ -0,0 +1,176 @@
package com.mhd.system.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @Description: 销项发票表
* @Author: lfs
* @Date: 2020-02-19 08:50:47
* @Version: V1.0
*/
@Data
public class TmsInvoiceListDetailsVO implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ID_WORKER_STR)
private String id;
/**发票抬头*/
@ApiModelProperty(value = "发票抬头")
private String invoiceTitle;
/**发票金额*/
@ApiModelProperty(value = "发票金额")
private BigDecimal invoiceValue;
/**发票备注*/
@ApiModelProperty(value = "发票备注")
private String remark;
/**发票状态(0-未开票,1-已取消申请,2-已开票,3-已驳回,4-已寄出,5-已作废)*/
@ApiModelProperty(value = "发票状态(0-未开票,1-已取消申请,2-已开票,3-已驳回,4-已寄出,5-已作废)")
private Integer invoiceState;
/**发票申请时间*/
@ApiModelProperty(value = "发票申请时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date invoiceApplyTime;
/**申请人ID*/
@ApiModelProperty(value = "申请人ID")
private String applicantId;
/**驳回原因*/
@ApiModelProperty(value = "驳回原因")
private String rejectReason;
/**退票备注*/
@ApiModelProperty(value = "退票备注")
private String refundRemark;
/**处理人ID(取消申请/开票/驳回)*/
@ApiModelProperty(value = "处理人ID(取消申请/开票/驳回)")
private String managerId;
/**处理时间*/
@ApiModelProperty(value = "处理时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date managerTime;
/**寄出人ID*/
@ApiModelProperty(value = "寄出人ID")
private String sendById;
/**寄出时间*/
@ApiModelProperty(value = "寄出时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date sendTime;
/**寄出邮费*/
@ApiModelProperty(value = "寄出邮费")
private BigDecimal sendPostage;
/**快递公司*/
@ApiModelProperty(value = "快递公司")
private String courierServicesCompany;
/**收件地址id*/
@ApiModelProperty(value = "收件地址id")
private String receivingAddressId;
/**收件姓名*/
@ApiModelProperty(value = "收件姓名")
private String receivingName;
/**收件地址*/
@ApiModelProperty(value = "收件地址")
private String location;
/**手机号*/
@ApiModelProperty(value = "手机号")
private String phone;
/**运输单ids*/
@ApiModelProperty(value = "运输单ids")
private String transportationIds;
/**创建日期*/
@ApiModelProperty(value = "创建日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**税务登记证号*/
@ApiModelProperty(value = "税务登记证号")
private String taxRegAccount;
/**运输单列表*/
/* @ApiModelProperty(value = "运输单列表")
private List<TmsOrderVO> tmsOrderVOList;*/
/**发票类型(0-增值税专用发票,1-普通发票)*/
@ApiModelProperty(value = "发票类型(0-增值税专用发票,1-普通发票)")
private String invoiceType;
/**发票性质(0-纸质发票,1-电子发票)*/
@ApiModelProperty(value = "发票性质(0-纸质发票,1-电子发票)")
private String invoiceNature;
/**发票号*/
@ApiModelProperty(value = "发票号")
private String invoiceNumber;
/**快递单号*/
@ApiModelProperty(value = "快递单号")
private String trackingNumber;
/**开票表集合*/
@ApiModelProperty(value = "开票表集合")
private List<TmsMakeOutInvoice> tmsMakeOutInvoices;
/**账单项目费用*/
@ApiModelProperty(value = "账单项目费用")
private List<Map<String, Object>> feeList;
/**货主信息id*/
@ApiModelProperty(value = "货主信息id")
private String shipperId;
/**货主信息id*/
@ApiModelProperty(value = "货主姓名")
private String shipperName;
/**货主电话*/
@ApiModelProperty(value = "货主电话")
private String shipperPhone;
/**货主信息id*/
@ApiModelProperty(value = "货主公司名称")
private String companyName;
@ApiModelProperty(value = "统一社会信用代码")
private String regAccount;
}
@@ -0,0 +1,130 @@
package com.mhd.system.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description: 销项发票表
* @Author: lfs
* @Date: 2020-02-19 08:50:47
* @Version: V1.0
*/
@Data
@TableName("tms_make_out_invoice")
public class TmsMakeOutInvoice implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ID_WORKER_STR)
private String id;
/**发票ID*/
@ApiModelProperty(value = "发票ID")
private String invoiceId;
/**发票抬头*/
@ApiModelProperty(value = "发票抬头")
private String invoiceTitle;
/**发票金额*/
@ApiModelProperty(value = "发票金额")
private BigDecimal invoiceValue;
/**发票备注*/
@ApiModelProperty(value = "发票备注")
private String remark;
/**发票状态(0-未开票,1-已取消申请,2-已开票,3-已驳回,4-已寄出,5-已作废)*/
@ApiModelProperty(value = "发票状态(0-未开票,1-已取消申请,2-已开票,3-已驳回,4-已寄出,5-已作废)")
private Integer invoiceState;
/**发票申请时间*/
@ApiModelProperty(value = "发票申请时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date invoiceApplyTime;
/**创建人*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建日期*/
@ApiModelProperty(value = "创建日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新日期*/
@ApiModelProperty(value = "更新日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**是否删除(0-否,1-是)*/
@ApiModelProperty(value = "是否删除(0-否,1-是)")
private Integer isDelete;
/**所属部门*/
@ApiModelProperty(value = "所属部门")
private String sysOrgCode;
/**开票号码*/
@ApiModelProperty(value = "开票号码")
private String invoiceNumber;
/**开票人ID*/
@ApiModelProperty(value = "开票人ID")
private String makeOutInvoiceId;
/**开票时间*/
@ApiModelProperty(value = "开票时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date makeOutInvoiceTime;
/**开票代码*/
@ApiModelProperty(value = "开票代码")
private String invoiceCode;
/**上报状态:0-未上报,1-已上报,2-上报失败*/
@ApiModelProperty(value = "上报状态:0-未上报,1-已上报,2-上报失败")
private Integer isReport;
/**上报时间*/
@ApiModelProperty(value = "上报时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reportTime;
/**失败原因*/
@ApiModelProperty(value = "失败原因")
private String errMsg;
@ApiModelProperty(value = "电子发票地址")
private String invoiceFileUrl;
@ApiModelProperty(value = "发票摘要")
private String invoiceAbstract;
@ApiModelProperty(value = "开票项目")
private String invoiceItem;
@ApiModelProperty(value = "实际开票客户id")
private String actualInvoiceCustomerId;
@ApiModelProperty(value = "实际开票客户名称")
private String actualInvoiceCustomerName;
}
@@ -0,0 +1,771 @@
/*
package com.mhd.system.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
*/
/**
* @Description: 货源表
* @Author: lfs
* @Date: 2020-02-14 09:49:27
* @Version: V1.0
*//*
@Data
public class TmsOrderVO implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ID_WORKER_STR)
private String id = "";
@ApiModelProperty(value = "创建人")
private String createBy = "";
@ApiModelProperty(value = "创建人")
private String createrAvatar = "";
@ApiModelProperty(value = "创建日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新人")
private String updateBy = "";
@ApiModelProperty(value = "更新日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@ApiModelProperty(value = "所属部门")
private String sysOrgCode = "";
@ApiModelProperty(value = "货源单号")
private String goodsNumber = "";
@ApiModelProperty(value = "线路名称ID")
private String lineNameId = "";
@ApiModelProperty(value = "线路名称")
private String lineName = "";
@ApiModelProperty(value = "运距(千米)")
private BigDecimal haulDistance = new BigDecimal("0");
@ApiModelProperty(value = "装货地名称")
private String loadingName = "";
@ApiModelProperty(value = "装货地县区编码")
private String loadingAreaId = "";
@ApiModelProperty(value = "装货地详细地址")
private String loadingAddress = "";
@ApiModelProperty(value = "装货地经度")
private String loadingLongitude = "";
@ApiModelProperty(value = "装货地纬度")
private String loadingLatitude = "";
@ApiModelProperty(value = "装货单位")
private String loadingUnit = "";
@ApiModelProperty(value = "发货人姓名")
private String freighterName = "";
@ApiModelProperty(value = "装货电话")
private String loadingPhone = "";
@ApiModelProperty(value = "装货时间日期(年月日)")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date loadingDate;
@ApiModelProperty(value = "装货时间(上午、下午、24小时)")
private String loadingTime = "";
@ApiModelProperty(value = "装货时间id")
private String loadingTimeId;
@ApiModelProperty(value = "卸货地名称")
private String unloadName = "";
@ApiModelProperty(value = "卸货地县区编码")
private String unloadAreaId = "";
@ApiModelProperty(value = "卸货地详细地址")
private String unloadAddress = "";
@ApiModelProperty(value = "卸货地经度")
private String unloadLongitude = "";
@ApiModelProperty(value = "卸货地纬度")
private String unloadLatitude = "";
@ApiModelProperty(value = "卸货单位")
private String unloadUnit = "";
@ApiModelProperty(value = "收货人姓名")
private String dischargerName = "";
@ApiModelProperty(value = "卸货电话")
private String unloadPhone = "";
@ApiModelProperty(value = "卸货时间日期(年月日)")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date unloadingData;
@ApiModelProperty(value = "卸货时间(上午、下午、24小时)")
private String unloadingTime = "";
@ApiModelProperty(value = "卸货时间Id")
private String unloadingTimeId = "";
@ApiModelProperty(value = "货物名称ID")
private String goodsNameId = "";
@ApiModelProperty(value = "货物大类型")
private String goodsType="";
@ApiModelProperty(value = "货物小类型")
private String goodsName="";
@ApiModelProperty(value = "重量小(吨)")
private BigDecimal weightMin = new BigDecimal("0");
@ApiModelProperty(value = "重量大(吨)")
private BigDecimal weightMax = new BigDecimal("0");
@ApiModelProperty(value = "货物数量单位(吨/方/件)")
private String goodsUntis = "";
@ApiModelProperty(value = "货物数量单位(吨/方/件)ID")
private String goodsUntisId = "";
@ApiModelProperty(value = "配载方式ID0-数量,1-车次)")
private Integer transportationModeId =0;
@ApiModelProperty(value = "是否接单(0-否,1-是)")
private Integer isOrder = 0;
@ApiModelProperty(value = "配载方式名称")
private String transportationName= "";
@ApiModelProperty(value = "现已承运车次")
private Integer realTrainNumber = 0;
@ApiModelProperty(value = "车型车长ID")
private String carType = "";
@ApiModelProperty(value = "车型车长名称")
private String carTypeName="";
@ApiModelProperty(value = "指定司机ID")
private String appointDriverId = "";
@ApiModelProperty(value = "指定司机姓名")
private String appointDriver = "";
@ApiModelProperty(value = "指定司机电话")
private String appointDriverPhone = "";
@ApiModelProperty(value = "指定司机车牌号")
private String appointDriverLicense = "";
@ApiModelProperty(value = "服务要求ID")
private String serviceRequireId = "";
@ApiModelProperty(value = "服务要求名称")
private String serviceRequire = "";
@ApiModelProperty(value = "备注")
private String remarks = "";
@ApiModelProperty(value = "上游客户ID")
private String upstreamCustomersId = "";
@ApiModelProperty(value = "上游客户姓名")
private String upstreamCustomersName = "";
@ApiModelProperty(value = "上游客户电话")
private String upstreamCustomersPhone = "";
@ApiModelProperty(value = "运单类型(0-企业普货、1-企业批量货、2-撮合货、3-客服运单、4-线下运单)")
private Integer waybillType ;
@ApiModelProperty(value = "运单类型(0-企业普货、1-企业批量货、2-撮合货、3-客服运单、4-线下运单)")
private String waybillTypeName = "";
@ApiModelProperty(value = "运单来源(0-后台发布、1-app发布、2-导入)")
private Integer waybillFrom;
@ApiModelProperty(value = "定金")
private BigDecimal earnestMoney = new BigDecimal("0");
@ApiModelProperty(value = "确认协议重量和")
private BigDecimal agreementWeights = new BigDecimal("0");
@ApiModelProperty(value = "装货重量和")
private BigDecimal loadingNumbers = new BigDecimal("0");
@ApiModelProperty(value = "货源是否关闭(0-否,1-是)")
private Integer isSource = 0;
@ApiModelProperty(value = "货源关闭时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date sourceCloseTime;
@ApiModelProperty(value = "货源关闭人用户ID")
private String executorId = "";
@ApiModelProperty(value = "是否删除(0-否,1-是)")
private Integer isDelete = 0;
@ApiModelProperty(value = "运输单号")
private String waybillNumber="";
@ApiModelProperty(value = "公司名称")
private String companyName="";
@ApiModelProperty(value = "姓名")
private String shipperName="";
@ApiModelProperty(value = "电话")
private String shipperPhone="";
@ApiModelProperty(value = "用户ID")
private String shipperId = "";
@ApiModelProperty(value = "运输司机ID")
private String transportationDriverId ="";
@ApiModelProperty(value = "运输司机姓名")
private String transportationDriver ="";
@ApiModelProperty(value = "运输司机电话")
private String transportationPhone ="";
@ApiModelProperty(value = "运输车辆ID")
private String transportationCarId ="";
@ApiModelProperty(value = "运输车辆车牌号")
private String transportationPlate = "";
@ApiModelProperty(value = "货源单创建企业ID")
private String createCompanyId = "";
@ApiModelProperty(value = "期望运费")
private BigDecimal freightHope = new BigDecimal("0");
@ApiModelProperty(value = "运输状态(0-待确认,1-运输中,2-已完成,3-待评价,4-已评价,5-已取消,6-已关闭)")
private Integer waybillStatus;
@ApiModelProperty(value = "承运货物数量")
private String loadingNumber ="";
@ApiModelProperty(value = "车队名称")
private String motorcadeName="";
@ApiModelProperty(value = "货物类型ID")
private String goodsTypeId="";
@ApiModelProperty(value = "创建人手机号")
private String phone="";
@ApiModelProperty(value = "创建人名称")
private String realname="";
@ApiModelProperty(value = "货运线路(装货市县)")
private String lineTitleLeft="";
@ApiModelProperty(value = "货运线路(卸货市县)")
private String lineTitleRight="";
@ApiModelProperty(value = "发货时间距当前时间差")
private String daysAgo="";
@ApiModelProperty(value = "交易量")
private String transportCount = "";
@ApiModelProperty(value = "好评率")
private String praiseNumber ="100%";
@ApiModelProperty(value = "装货时间日期(年月日)")
private String loadingDateDay="";
@ApiModelProperty(value = "装货时间日期(年-月-日)")
private String loadingDateTime="";
@ApiModelProperty(value = "卸货时间日期(年-月-日)")
private String unloadingDateTime="";
@ApiModelProperty(value = "卸货时间日期(年月日)")
private String unloadingDateDay="";
@ApiModelProperty(value = "是否为常发货源(0-否,1-是)")
private Integer isCommon = 0;
@ApiModelProperty(value = "审核状态")
private String auditStatus;
@ApiModelProperty(value = "审核状态中文")
private String auditStatusName ="";
@ApiModelProperty(value = "运输单号")
private String transportationNumber="";
@ApiModelProperty(value = "发货运费")
private BigDecimal deliveryFreight = new BigDecimal("0");
@ApiModelProperty(value = "审核人手机号")
private String auditByPhone="";
@ApiModelProperty(value = "审核人")
private String auditBy="";
@ApiModelProperty(value = "审核人名称")
private String auditByName="";
@ApiModelProperty(value = "审核人公司名称")
private String auditByCompanyName="";
@ApiModelProperty(value = "所属公司名称")
private String platformCompanyName;
@ApiModelProperty(value = "运费单价(元/吨)")
private BigDecimal transportationUnitPrice;
@ApiModelProperty(value = "赫达订单号")
private String orderNumber="";
@ApiModelProperty(value = "是否长期货源:0-否,1-是")
private Integer isLongOrder = 0;
@ApiModelProperty(value = "微信小程序图片地址")
private String wxaQrcode="";
@ApiModelProperty(value = "微信小程序AppID")
private String wxaAppID="";
@ApiModelProperty(value = "代运营人员用户ID")
private String orderAgentUserId="";
@ApiModelProperty(value = "代运营人员名称")
private String orderAgentUserName="";
@ApiModelProperty(value = "代运营人员手机")
private String orderAgentUserPhone="";
@ApiModelProperty(value = "公司经营模式(0-总公司,1-总+分公司)")
private Integer isTypeInsuranceUse = 0;
@ApiModelProperty(value = "指定平台公司")
private String appointCompanyId;
@ApiModelProperty(value = "指定平台公司名称")
private String appointCompanyName;
@ApiModelProperty(value = "服务费")
private String serviceRate;
@ApiModelProperty(value = "指定货主编号")
private String appointShipperId;
@ApiModelProperty(value = "指定货主")
private String appointShipper;
@ApiModelProperty(value = "结算方式:1-按趟结算,2-按数量结算")
private Integer radioValue;
@ApiModelProperty(value = "指定平台公司名称")
private String appointCompany;
@ApiModelProperty(value = "短驳装货地址")
private String shortLoadingAddress;
@ApiModelProperty(value = "短驳卸货地址")
private String shortUnloadAddress;
@ApiModelProperty(value = "指定设备号")
private String appointVehicleDevice;
@ApiModelProperty(value = "车牌号")
private String vehicleLicenseNumber;
@ApiModelProperty(value = "司机")
private String driverName;
@ApiModelProperty(value = "指定车辆")
private String appointVehicle;
@ApiModelProperty(value = "发布货源方式 0-未指定;1-企业货源;2-平台货源")
private Integer publishOrderType;
@ApiModelProperty(value = "剩余吨数")
private BigDecimal surplusTonnage;
*/
/**是否开启路耗(0-否 1-是)*//*
@ApiModelProperty(value = "是否开启路耗(0-否 1-是)")
@Excel(name = "是否开启路耗(0-否 1-是)", width = 15)
private Integer isRoadLoss;
*/
/**货物价值(元/吨)*//*
@ApiModelProperty(value = "货物价值(元/吨)")
@Excel(name = "货物价值(元/吨)", width = 15)
private BigDecimal goodsValue=BigDecimal.ZERO;
*/
/**路耗模式(0-按比例% 1-按数量(吨))*//*
@ApiModelProperty(value = "路耗模式(0-按比例% 1-按数量(吨)")
@Excel(name = "路耗模式(0-按比例% 1-按数量(吨)", width = 15)
private Integer roadLossMode;
*/
/**路耗结算方式(0-无 1-取装货重量 2-取卸货重量 3-装卸货取大 4-装卸货取小)*//*
@ApiModelProperty(value = "路耗结算方式(0-无 1-取装货重量 2-取卸货重量 3-装卸货取大 4-装卸货取小)")
@Excel(name = "路耗结算方式(0-无 1-取装货重量 2-取卸货重量 3-装卸货取大 4-装卸货取小)", width = 15)
private Integer roadLossSettlementMethod;
*/
/**允许货物亏损*//*
@ApiModelProperty(value = "允许货物亏损(吨或%")
@Excel(name = "允许货物亏损(吨或%", width = 15)
private BigDecimal allowableLoss=BigDecimal.ZERO;
*/
/**超出亏损扣除金额(元/吨)*//*
@ApiModelProperty(value = "超出亏损扣除金额(元/吨)")
@Excel(name = "超出亏损扣除金额(元/吨)", width = 15)
private BigDecimal lossDeductionAmount=BigDecimal.ZERO;
@ApiModelProperty(value = "上游客户id")
@Excel(name = "上游客户id", width = 15)
private String upClientId="";
@ApiModelProperty(value = "货单二维码图片地址")
private String qrCodeImgUrl;
*/
/**回单付金额*//*
@ApiModelProperty(value = "回单付金额")
@Excel(name = "回单付金额", width = 15)
private BigDecimal receiptPaymentAmount=BigDecimal.ZERO;
*/
/**预付运费金额*//*
@ApiModelProperty(value = "预付现金金额")
@Excel(name = "预付现金金额", width = 15)
private BigDecimal cashAdvance=BigDecimal.ZERO;
*/
/**到付运费金额*//*
@ApiModelProperty(value = "到付运费金额")
@Excel(name = "到付运费金额", width = 15)
private BigDecimal freightAmount=BigDecimal.ZERO;
*/
/**预付平台油卡金额*//*
@ApiModelProperty(value = "预付平台油卡金额")
@Excel(name = "预付平台油卡金额", width = 15)
private BigDecimal oilCardOnline=BigDecimal.ZERO;
@ApiModelProperty(value = "是否协议费用生成:0否 1是")
private Integer isAutoGenerateProtocol;
*/
/**单车重量*//*
@ApiModelProperty(value = "单车重量",required = true)
private BigDecimal singleVehicleWeight;
*/
/**单车总费用*//*
@ApiModelProperty(value = "单车总费用")
@Excel(name = "单车总费用", width = 15)
private BigDecimal freightGross=BigDecimal.ZERO;
@ApiModelProperty(value = "运费抹零 0-不抹零 ,1-抹零小数位,2-抹零个位,3-抹零十位")
private Integer isFreightNullification;
@ApiModelProperty(value = "运费抹零 0-不抹零 ,1-抹零小数位,2-抹零个位,3-抹零十位")
private String isFreightNullificationName;
@ApiModelProperty(value = "是否允许接多单:0否 1是")
private Integer isMultipleOrdersAllowed;
@ApiModelProperty(value = "发货备注")
private String shippingNote;
@ApiModelProperty(value = "绑卡状态 0-未绑卡 1-已绑卡未完成回填 2-已绑卡已完成回填")
private Integer strappedStatus=2;
@ApiModelProperty("应收结算类型:1-月结,2-现结")
private Integer receivableType;
@ApiModelProperty("项目表ID")
private Long projectManagementId;
@ApiModelProperty(value = "接单司机ID")
private String orderDriverId;
@ApiModelProperty(value = "货物数量")
private String goodsQuantity;
@ApiModelProperty(value = "货物数量单位code")
private String goodsQuantityUnitId;
@ApiModelProperty(value = "货物数量单位")
private String goodsQuantityUnit;
@ApiModelProperty(value = "运单数量")
private Integer transportNoteCount=0;
@ApiModelProperty(value = "常用货主id")
private String topOrder;
//=================批量货派单相关=============================
@ApiModelProperty(value = "需求车次")
private Integer demandTrainNumber;
@ApiModelProperty(value = "承运车次默认0")
private Integer carriageNumber;
@ApiModelProperty(value = "剩余需求车次")
private Integer remainingDemandTrainNumber;
*/
/**货物重量*//*
@ApiModelProperty(value = "货物重量")
private BigDecimal goodsWeight;
@ApiModelProperty(value = "货源剩余货物数量")
private BigDecimal residueGoodsWeight;
@ApiModelProperty(value = "承运货物数量")
private BigDecimal transportGoodsWeight;
//=================竞价相关=============================
@ApiModelProperty(value = "查看报价数量")
private Integer quotationQuantity = 0;
@ApiModelProperty(value = "运单模式(0-普通模式,1-竞价模式)")
private Integer waybillMode;
@ApiModelProperty(value = "竞价截止时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date latestBiddingTime;
@ApiModelProperty(value = "预设竞标价")
private BigDecimal presetPrice;
@ApiModelProperty(value = "竞价单位(元/车,元/吨)")
private String biddingUnit;
@ApiModelProperty(value = "最高心理价")
private BigDecimal highestPrice;
@ApiModelProperty(value = "订单状态(1-未审核,2-未通过,3-进行中,4-已完成,5-已关闭)")
private Integer orderStatus;
@ApiModelProperty(value = "货源对应运单数量")
private Integer transportNum = 0;
@ApiModelProperty(value = "货源对应货运单数量")
private Integer truckOrderCount = 0;
@ApiModelProperty(value = "订单模式(0-手动竞价,1-自动竞价,2-普通模式,其他-全部)")
private Integer orderMode;
@ApiModelProperty(value = "评标类型(0-自动评标,1-手动评标)")
private Integer bidEvaluationType;
@ApiModelProperty(value = "订单类型:0-自有订单,1-tms订单")
private Integer orderType;
@ApiModelProperty(value = "多装多卸类型")
private String layType;
@ApiModelProperty(value = "拼单类型(0-不拼单(主单),1-拼单-子单,2-拼单-合单)")
private Integer splicingOrderType;
@ApiModelProperty(value = "拼单发布状态(0-否,1-是)")
private Integer splicingStatus;
@ApiModelProperty(value = "拼单主单id")
private String mainOrderId;
@ApiModelProperty(value = "拼单主单号")
private String mainOrderNum;
@ApiModelProperty(value = "拼单合单id")
private String mergeOrderId;
@ApiModelProperty(value = "拼单合单号")
private String mergeOrderNum;
@ApiModelProperty(value = "来源系统")
private String orderSource;
@ApiModelProperty(value = "通知单号")
private String noticeNumber;
@ApiModelProperty(value = "司机税率")
private BigDecimal driverTaxRate;
@ApiModelProperty(value = "tms到付运费金额")
private BigDecimal tmsFreightAmount;
@ApiModelProperty(value = "订单其他信息")
private Map<String,String> otherOrderInfo;
@ApiModelProperty(value = "订单类型")
private Integer orderShippingType;
@ApiModelProperty(value = "订单类型")
private String orderShippingName;
@ApiModelProperty(value = "付款方")
private String payerTypeName;
@ApiModelProperty(value = "付款方类型(0-委托方,1-收货方)")
@Excel(name = "付款方类型(0-委托方,1-收货方)", width = 15)
private Integer payerType;
@ApiModelProperty(value = "整机编号")
private String machineNumber;
@ApiModelProperty(value = "收货方")
private String recipientName;
@ApiModelProperty(value = "委托方")
private String appointDriverEnterprise;
@ApiModelProperty(value = "收货方id")
private String recipientId;
@ApiModelProperty(value = "委托方id")
private String appointDriverEnterpriseId;
@ApiModelProperty(value = "数字物流平台用户Id")
private Long szwlUserId;
@ApiModelProperty("运费单价")
private BigDecimal freightUnitPrice;
@ApiModelProperty(value = "信息费")
private BigDecimal infoFee;
@ApiModelProperty(value = "信息费状态")
private BigDecimal infoFeeStatus;
@ApiModelProperty(value = "信息费应付单据号")
private String infoFeeDocumentNumber;
@ApiModelProperty(value = "车辆类型Id")
private String vehicleTypeId;
@ApiModelProperty(value = "承运人Id(订单为济南专线使用)")
private String carrier;
@ApiModelProperty(value = "第三方订单号")
private String thirdPartyOrderNumber;
@ApiModelProperty(value = "电子回单状态(0-无状态 1-未上传 2-已上传 3-已拒绝 4-已确认)")
private Integer receiptTotalStatus;
@ApiModelProperty(value = "已收运费")
private BigDecimal collectedFreight;
@ApiModelProperty(value = "未收运费")
private BigDecimal uncollectedFreight;
@ApiModelProperty(value = "订单结算状态:1未出账、2已出账、3部分结算、4已结算")
private Integer settlementStatus;
@ApiModelProperty(value = "订单运费结算时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date settlementTime;
@ApiModelProperty(value = "运单发票开具状态(0-未索取,1-已索取,2-已开票,3-部分索取)")
private Integer isInvoice;
@ApiModelProperty(value = "签收时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date signTime;
@ApiModelProperty(value = "创建人")
private String realCreateName;
@ApiModelProperty(value = "主运单单号")
private String mainOrderNumber;
@ApiModelProperty(value = "信息费账单号")
private String recordNumber;
@ApiModelProperty(value = "信息费收款方")
private String infoFeePayee;
@ApiModelProperty(value = "信息费收款方方式")
private Integer infoFeePayeeType;
@ApiModelProperty(value = "竞价状态 0-竞价中,1-已完成,2-已关闭")
private Integer biddingStatus;
@ApiModelProperty(value = "目的地")
private String destination;
@ApiModelProperty("运费")
private BigDecimal freightCharges;
@ApiModelProperty(value = "开票时间")
@Excel(name = "开票时间", width = 25, format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date invoiceMakeTime;
@ApiModelProperty("业务员ID")
private String salesmanId;
@ApiModelProperty("业务员ID")
private String salesmanName;
@ApiModelProperty(value = "组织id")
private String orgId;
@ApiModelProperty(value = "所属组织")
@Excel(name = "所属组织", width = 15)
private String orgName;
@ApiModelProperty("是否报关(0:否,1:是)")
private Integer isDeclare;
@ApiModelProperty("线路")
private String route;
@ApiModelProperty("柜类型")
private String containerType;
@ApiModelProperty("柜类型名称")
private String containerTypeName;
@ApiModelProperty("卡类型")
private String cardType;
@ApiModelProperty("卡类型名称")
private String cardTypeName;
@ApiModelProperty("外来柜号")
private String externalContainerNo;
@ApiModelProperty("中转地")
private String transitPlace;
@ApiModelProperty("托运人ID")
private String shipper;
@ApiModelProperty("托运人ID")
private String customsShipper;
@ApiModelProperty("托运人电话")
private String customsShipperTel;
@ApiModelProperty("卸货单位")
private String unloadingCompany;
@ApiModelProperty("合同编号")
private String contractNo;
@ApiModelProperty("运费")
private BigDecimal freightFee;
@ApiModelProperty("卸货费")
private BigDecimal unloadingFee;
@ApiModelProperty("报关费")
private BigDecimal customsFee;
@ApiModelProperty("差货费")
private BigDecimal shortageFee;
@ApiModelProperty("杂费")
private BigDecimal miscellaneousFee;
@ApiModelProperty("其他费用")
private BigDecimal otherFee;
@ApiModelProperty("滞车费")
private BigDecimal detentionFee;
@ApiModelProperty("税率")
private BigDecimal taxRate;
@ApiModelProperty("结算币种")
private String settlementCurrency;
@ApiModelProperty("体积")
private BigDecimal volume;
@ApiModelProperty("内容详情")
private String detailContent;
@ApiModelProperty("报关线路")
private String customsRoute;
@ApiModelProperty("报关关口")
private String customsPort;
@ApiModelProperty("报关联系人")
private String customsContact;
@ApiModelProperty("报关联系人电话")
private String customsContactPhone;
@ApiModelProperty("报关备注")
private String customsRemark;
@ApiModelProperty(value = "单据日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date documentDate;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@ApiModelProperty("上级组织ID")
private Long topOrganizationId;
//订单审核相关
@ApiModelProperty("审核业务员ID")
private String auditSalesmanId;
@ApiModelProperty("审核业务员")
private String auditSalesmanName;
@ApiModelProperty("业务确认状态")
private Integer businessConfirmStatus;
@ApiModelProperty("业务审核状态")
private Integer businessAuditStatus;
@ApiModelProperty("确认意见")
private String opinion;
@ApiModelProperty("业务主管id")
private String businessManagerId;
@ApiModelProperty("业务主管名称")
private String businessManagerName;
@ApiModelProperty("审核意见")
private String auditOpinion;
@ApiModelProperty("费用科目明细")
private String tmsOrderAccountListJsonStr;
}
*/
@@ -12,6 +12,7 @@ import com.mhd.common.core.domain.entity.R;
import com.mhd.common.core.domain.entity.SysConfigSwitch;
import com.mhd.common.core.domain.entity.TmsOrder;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.utils.sms.Result;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.system.api.WlhyServiceFeign;
import com.mhd.system.api.domain.*;
@@ -211,6 +212,14 @@ public class RemoteWlhyFallbackFactory implements FallbackFactory<WlhyServiceFei
return res;
}
@Override
public R<TmsInvoiceListDetailsVO> selectInvoiceListById(String id) {
R<TmsInvoiceListDetailsVO> res = new R<>();
res.setMsg("获取发票信息失败"+cause.getMessage());
res.setCode(R.FAIL);
return res;
}
@Override
public AjaxResult payCallback(List<TmsPayCallbackDTO> tmsPayCallbackList) {
return AjaxResult.error(cause.getMessage());
@@ -509,6 +518,11 @@ public class RemoteWlhyFallbackFactory implements FallbackFactory<WlhyServiceFei
res.setCode(R.FAIL);
return res;
}
@Override
public Result<?> queryById(String id) {
return null;
}
};
}
}
@@ -38,6 +38,10 @@ public class LoginUser implements Serializable
* 用户名
*/
private String username;
/**
* 用户名
*/
private String realname;
/**
* 登录时间
+9 -4
View File
@@ -14,15 +14,20 @@ spring:
discovery:
# server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号
server-addr: 10.33.0.129:6010
server-addr: 10.102.192.5:6848
username: nacos
password: manhuoda@2023
#线上正式环境
# server-addr: 10.102.192.105:6848
# server-addr: 10.102.192.5:6848
# username: nacos
# password: manhuoda@2023
config:
# server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号
server-addr: 10.33.0.129:6010
server-addr: 10.102.192.5:6848
username: nacos
password: manhuoda@2023
#线上正式环境
# server-addr: 10.102.192.105:6848
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
file-extension: yml #默认properties
# 共享配置
+1 -1
View File
@@ -156,7 +156,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<version>1.18.22</version>
</dependency>
<dependency>
@@ -0,0 +1,75 @@
package com.mhd.common.core.domain.dto;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 【请填写功能名称】对象 reconciliation_account
*
* @author gen
* @date 2026-01-14
*/
@Data
public class ReconciliationAccountDTO extends BaseVOEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty("$column.columnComment")
private Long id;
@ApiModelProperty("所属组织")
@Excel(name = "所属组织")
private String orgName;
@ApiModelProperty("组织ID")
@Excel(name = "组织ID")
private Long organizationId;
@ApiModelProperty("一级组织ID")
@Excel(name = "一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("应收账单id")
@Excel(name = "应收账单id")
private Long reconciliationId;
@ApiModelProperty("科目id")
@Excel(name = "科目id")
private Long accountId;
@ApiModelProperty("科目收支类型(1-应收,2-应付")
@Excel(name = "科目收支类型", readConverterExp = "科目收支类型(1-应收,2-应付")
private Long accountType;
@ApiModelProperty("科目编码")
@Excel(name = "科目编码")
private String subjectCode;
@ApiModelProperty("科目名称")
@Excel(name = "科目名称")
private String subjectName;
@ApiModelProperty("科目费率")
@Excel(name = "科目费率")
private BigDecimal rate;
@ApiModelProperty("金额")
@Excel(name = "金额")
private BigDecimal amount;
@ApiModelProperty(name = "组织ID集合")
private List<Long> organizationIdList;
@ApiModelProperty(name = "权限菜单ID")
private Long permissionMenuId;
}
@@ -233,4 +233,7 @@ public class ReconciliationDTO extends BaseVOEntity{
@ApiModelProperty("nc同步状态 0-未同步 1-已同步")
private Integer skSynchronousStatus;
@ApiModelProperty(value = "账单科目明细")
public List<ReconciliationAccountDTO> reconciliationAccountDTOList;
}
@@ -475,6 +475,7 @@ public class TmsOrder implements Serializable {
@ApiModelProperty(value = "已收运费")
private BigDecimal collectedFreight;
@ApiModelProperty(value = "未收运费")
private BigDecimal uncollectedFreight;
@ApiModelProperty(value = "少收运费")
@@ -522,4 +523,44 @@ public class TmsOrder implements Serializable {
@ApiModelProperty(value = "付款方名称")
private String payer;
@ApiModelProperty("制单人编码nc")
private String makerCodeNc;
@ApiModelProperty("业务员编码nc")
private String salesmanCodeNc;
@ApiModelProperty("税率")
private BigDecimal taxRate;
@ApiModelProperty("结算币种")
private String settlementCurrency;
@ApiModelProperty("合同编号")
private String contractNo;
@ApiModelProperty("客户编码nc")
private String customerCodeNc;
@ApiModelProperty(value = "组织ID")
private String orgId;
@ApiModelProperty(value = "所属组织")
private String orgName;
@ApiModelProperty(value = "组织ID")
private Long organizationId;
@ApiModelProperty(value = "组织名称")
private String organizationName;
@ApiModelProperty(value = "上级组织ID")
private Long topOrganizationId;
@ApiModelProperty(value = "单据日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private java.util.Date documentDate;
}
@@ -99,6 +99,8 @@ public class Verification extends BaseVOEntity implements Serializable,Cloneable
private Long topOrganizationId;
@ApiModelProperty("组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
// @ApiModelProperty("是否月结:1-是,2-否")
// private Integer receivableType;
@ApiModelProperty("部门id")
@@ -56,4 +56,7 @@ public class AddressBookPo extends BaseVOEntity implements Serializable
private String synthesize;
@ApiModelProperty(name = "单位名称")
private String unitName;
@ApiModelProperty(name = "组织ID(用于数据权限过滤,内部使用)", hidden = true)
private Long organizationId;
}
@@ -1,5 +1,6 @@
package com.mhd.common.core.domain.po;
import cn.hutool.core.util.ObjectUtil;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -24,6 +25,10 @@ public class RolePO extends BaseVOEntity implements Serializable {
private String roleTypeName = "";
@ApiModelProperty(name = "组织表ID")
private Long organizationId = 0L;
@ApiModelProperty(name = "组织名称")
private String organizationName = "";
@ApiModelProperty(name = "一级组织表ID")
private Long topOrganizationId = 0L;
@ApiModelProperty(name = "职务/角色权限字符,控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)")
private String roleCode = "";
@ApiModelProperty(name = "职务/角色名称")
@@ -42,6 +47,9 @@ public class RolePO extends BaseVOEntity implements Serializable {
@Override
public boolean equals(Object o) {
if (ObjectUtil.isNull(o)) {
return false;
}
RolePO rolePO = (RolePO) o;
return roleCode.equals(rolePO.getRoleCode());
}
@@ -28,6 +28,8 @@ public class UserDriverListPo {
private String driverEnterpriseName="";
@ApiModelProperty(name = "登录账号(2-20位)")
private String userAccount = "";
@ApiModelProperty(name = "组织表ID")
private Long organizationId;
@ApiModelProperty(name = "组织名称")
private String organizationName = "";
@ApiModelProperty(name = "身份证号")
@@ -301,4 +303,13 @@ public class UserDriverListPo {
@ApiModelProperty(value = "是否允许竞价(0-不允许竞价,1-允许参与竞价,2-允许查看竞价)")
private Integer isDriverBidding;
@ApiModelProperty(value = "用户身份")
private Integer userIdentity;
@ApiModelProperty(name = "车辆主体")
private String vehicleBody;
@ApiModelProperty(name = "")
private String wlhydriverId;
}
@@ -185,6 +185,9 @@ public class UserDriverPo {
@ApiModelProperty(name = "用户实名认证状态:0-无状态,1-已注册未认证,2-已认证待审核,3-审核通过,4-已驳回")
private Integer userAuthStatus;
@ApiModelProperty(name = "车辆主体")
private String vehicleBody;
//===================车队司机参数===============
@ApiModelProperty("车队队长userId")
@@ -99,6 +99,8 @@ public class VerificationPo extends BaseVOEntity implements Serializable
private Long topOrganizationId;
@ApiModelProperty("组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
// @ApiModelProperty("是否月结:1-是,2-否")
// private Integer receivableType;
@ApiModelProperty("部门id")
@@ -4,6 +4,7 @@ import com.aliyun.oss.ServiceException;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.UriUtils;
@@ -15,9 +16,11 @@ import java.util.Date;
import java.util.List;
import java.util.UUID;
@Service
public class MinIoUploadService {
@Autowired
private MinioClient minioClient;
private static String bucket="ngwl";
private static String host="http://10.102.192.5:6000";
private static String accessKey="minioadmin";
@@ -64,7 +67,7 @@ public class MinIoUploadService {
.stream(inputStream,inputStream.available(),-1).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
String url =host+ "/"+bucket + "/"+fileName;
String url =host+"/browser/"+bucket + "/"+fileName;
//
return url;
@@ -1,240 +0,0 @@
package minio;
import com.aliyun.oss.ServiceException;
import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.jeecg.modules.oss.dto.WaterMarkDTO;
import org.jeecg.modules.system.entity.SysDepartInterfaceInfo;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.UriUtils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @Description: minio oss 上传工具类
*/
@Slf4j
public class MinioBootUtil {
private static String bucket;
private static String host;
private static String accessKey;
private static String secretKey;
/**
* minio 工具客户端
*/
private static MinioClient minioClient = null;
private static String FILE_URL;
/**
* @Description 强制初始化minio
* @Author Alex
* @Date 2023/10/25 11:12
*/
public static MinioClient forceInitMinio(List<SysDepartInterfaceInfo> sysDepartInterfaceInfoList) throws InvalidPortException, InvalidEndpointException {
for (SysDepartInterfaceInfo sysDepartInterfaceInfo : sysDepartInterfaceInfoList) {
String interfaceTypeKey = sysDepartInterfaceInfo.getInterfaceTypeKey();//接口参数
String interfaceTypeValue = sysDepartInterfaceInfo.getInterfaceTypeValue();//接口参数值
switch (interfaceTypeKey) {
case "bucket":
bucket = interfaceTypeValue;
break;
case "host":
host = interfaceTypeValue;
break;
case "accessKey":
accessKey = interfaceTypeValue;
break;
case "secretKey":
secretKey = interfaceTypeValue;
break;
default:
break;
}
}
minioClient = new MinioClient(host, accessKey, secretKey);
return minioClient;
}
private static MinioClient initMinio() throws InvalidPortException, InvalidEndpointException {
if (minioClient == null) {
minioClient = new MinioClient(host, accessKey, secretKey);
}
return minioClient;
}
/**
* 上传文件
* 文件上传成功,返回文件完整访问路径
* 文件上传失败,返回 null
*
* @param multipartFile 待上传文件
* @param fileDir 文件保存目录
* @return oss 中的相对文件路径
*/
public static String upload(MultipartFile multipartFile, String fileDir, List<SysDepartInterfaceInfo> sysDepartInterfaceInfoList) {
for (SysDepartInterfaceInfo sysDepartInterfaceInfo : sysDepartInterfaceInfoList) {
String interfaceTypeKey = sysDepartInterfaceInfo.getInterfaceTypeKey();//接口参数
String interfaceTypeValue = sysDepartInterfaceInfo.getInterfaceTypeValue();//接口参数值
switch (interfaceTypeKey) {
case "bucket":
bucket = interfaceTypeValue;
break;
case "host":
host = interfaceTypeValue;
break;
case "accessKey":
accessKey = interfaceTypeValue;
break;
case "secretKey":
secretKey = interfaceTypeValue;
break;
default:
break;
}
}
try (InputStream inputStream = multipartFile.getInputStream()) {
//初始化minio
initMinio();
// bucket 不存在,创建
if (!minioClient.bucketExists(bucket)) {
minioClient.makeBucket(bucket);
}
// 上传文件的名称
String fileName = multipartFile.getOriginalFilename();
long timestamp = Calendar.getInstance().getTimeInMillis();
// PutObjectOptions,上传配置(文件大小,内存中文件分片大小)
// PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
// // 文件的ContentType
// putObjectOptions.setContentType(multipartFile.getContentType());
SimpleDateFormat sdYear = new SimpleDateFormat("yyyy");
SimpleDateFormat sdMonth = new SimpleDateFormat("MM");
SimpleDateFormat sdDay = new SimpleDateFormat("dd");
String year = sdYear.format(new Date());
String month = sdMonth.format(new Date());
String day = sdDay.format(new Date());
String filrDir = "wlhy/" + year + "/" + month + "/" + day + "/";
// minioClient.putObject(bucket, filrDir+timestamp+fileName, inputStream, putObjectOptions);
minioClient.putObject(bucket, filrDir+timestamp+fileName, inputStream, multipartFile.getContentType());
// 返回访问路径
String fileurl = host+ "/"+bucket + "/"+filrDir+timestamp+ UriUtils.encode(fileName, StandardCharsets.UTF_8);
System.out.println("fileurl===="+fileurl);
FILE_URL = fileurl;
return fileurl;
} catch (ServiceException e){
log.error(e.getErrorMessage());
} catch (Exception e){
log.error(e.getMessage());
}
return FILE_URL;
}
/**
* 上传文件 带时间水印
* 文件上传成功,返回文件完整访问路径
* 文件上传失败,返回 null
*
* @param multipartFile 待上传文件
* @param fileDir 文件保存目录
* @return oss 中的相对文件路径
*/
public static String uploadWaterMark(MultipartFile multipartFile, WaterMarkDTO waterMarkDTO, String fileDir, List<SysDepartInterfaceInfo> sysDepartInterfaceInfoList) {
for (SysDepartInterfaceInfo sysDepartInterfaceInfo : sysDepartInterfaceInfoList) {
String interfaceTypeKey = sysDepartInterfaceInfo.getInterfaceTypeKey();//接口参数
String interfaceTypeValue = sysDepartInterfaceInfo.getInterfaceTypeValue();//接口参数值
switch (interfaceTypeKey) {
case "bucket":
bucket = interfaceTypeValue;
break;
case "host":
host = interfaceTypeValue;
break;
case "accessKey":
accessKey = interfaceTypeValue;
break;
case "secretKey":
secretKey = interfaceTypeValue;
break;
default:
break;
}
}
// 压缩代码
InputStream inputStream = null;
try {
//初始化minio
initMinio();
// bucket 不存在,创建
if (!minioClient.bucketExists(bucket)) {
minioClient.makeBucket(bucket);
}
String OriginalFilename = multipartFile.getOriginalFilename();
inputStream = multipartFile.getInputStream();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//水印内容
String waterMarkContent = sdf.format(new Date());
//以下两种方法加水印
//方法1
if (OriginalFilename.indexOf(".pdf") < 0) {
ByteArrayOutputStream byteArrayOutputStreamut = new ByteArrayOutputStream();
Thumbnails.of(inputStream).width(1024).keepAspectRatio(true).outputQuality(0.9).toOutputStream(byteArrayOutputStreamut);
inputStream = new ByteArrayInputStream(byteArrayOutputStreamut.toByteArray());
//添加水印
inputStream = OssBootUtil.buildWatermarkOfText(inputStream, waterMarkDTO, OssBootUtil.WaterMarkLocation.SOUTH_WEST, null, 0.5f);
}
//方法2
/*if (ImageUtil.isImage(multipartFile.getOriginalFilename())) {
inputStream = ImageUtil.getInputStream(
ImageUtil.setWatermark(
ImageUtil.compress(
ImageIO.read(inputStream)),waterMarkContent),
ImageUtil.getFileExtention(multipartFile.getOriginalFilename()));
}*/
StringBuilder fileUrl = new StringBuilder();
String suffix = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf('.'));
// 上传文件的名称
String fileName = multipartFile.getOriginalFilename();
long timestamp = Calendar.getInstance().getTimeInMillis();
// PutObjectOptions,上传配置(文件大小,内存中文件分片大小)
// PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
// // 文件的ContentType
// putObjectOptions.setContentType(multipartFile.getContentType());
SimpleDateFormat sdYear = new SimpleDateFormat("yyyy");
SimpleDateFormat sdMonth = new SimpleDateFormat("MM");
SimpleDateFormat sdDay = new SimpleDateFormat("dd");
String year = sdYear.format(new Date());
String month = sdMonth.format(new Date());
String day = sdDay.format(new Date());
String filrDir = "wlhy/" + year + "/" + month + "/" + day + "/";
// minioClient.putObject(bucket, filrDir+timestamp+fileName, inputStream, putObjectOptions);
minioClient.putObject(bucket, filrDir+timestamp+fileName, inputStream, multipartFile.getContentType());
// 返回访问路径
String fileurl = host+ "/"+bucket + "/"+filrDir+timestamp+ UriUtils.encode(fileName, StandardCharsets.UTF_8);
System.out.println("fileurl===="+fileurl);
FILE_URL = fileurl;
return fileurl;
} catch (IOException e) {
log.error(e.getMessage());
} catch (Exception e) {
log.error(e.getMessage());
}
return FILE_URL;
}
}
@@ -129,6 +129,7 @@ public class TokenService
if (StringUtils.isNotEmpty(token))
{
String userkey = JwtUtils.getUserKey(token);
redisService.deleteObject(userkey);
redisService.deleteObject(getTokenKey(userkey));
}
}
+8 -5
View File
@@ -16,16 +16,19 @@ spring:
# server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号
# server-addr: 10.102.192.5:6848
server-addr: 10.33.0.129:6010
# server-addr: 10.33.0.129:6010
#线上正式环境
# server-addr: 10.102.192.105:6848
server-addr: 10.102.192.5:6848
username: nacos
password: manhuoda@2023
config:
# server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号
# server-addr: 10.102.192.5:6848
server-addr: 10.33.0.129:6010
# server-addr: 10.33.0.129:6010
#线上正式环境
# server-addr: 10.102.192.105:6848
server-addr: 10.102.192.5:6848
username: nacos
password: manhuoda@2023
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
file-extension: yml #默认properties
# 共享配置
@@ -69,9 +69,37 @@ public class AddressBookApplicationService
// 获取登录人id
Long userId = SecurityUtils.getLoginUser().getUserid();
addressBookPo.setUserId(userId);
// 添加组织数据权限过滤
applyOrganizationDataPermissionForAddressBook(addressBookPo);
return addressBookDomainService.selectAddressBookList(addressBookPo);
}
/**
* 应用组织数据权限过滤(地址簿)
* 通过用户表关联来过滤组织数据
*/
private void applyOrganizationDataPermissionForAddressBook(AddressBookPo addressBookPo) {
try {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
// 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据
// 其他组织只能查询自己组织的数据
if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) {
// 其他组织:需要通过用户表关联来过滤,只查询同一组织下用户创建的地址簿
// 由于AddressBook表只有userId字段,需要在XML中通过用户表关联来过滤
addressBookPo.setOrganizationId(loginUserOrganizationId);
}
// 如果是2827组织,不设置organizationId,可以查询全部
}
} catch (Exception e) {
// 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询
}
}
/**
* 新增地址簿
*
@@ -156,12 +184,39 @@ public class AddressBookApplicationService
*/
public List<CommonRoutePo> selectCommonRouteList(CommonRouteDo commonRouteDo){
// 获取登录人id
// Long userId = SecurityUtils.getUserId()==0 ? 4L:SecurityUtils.getLoginUser().getUserid();
Long userId = SecurityUtils.getLoginUser().getUserid();
commonRouteDo.setCreateBy(userId);
// 添加组织数据权限过滤
applyOrganizationDataPermissionForCommonRoute(commonRouteDo);
return commonRouteDomainService.selectCommonRouteList(commonRouteDo);
}
/**
* 应用组织数据权限过滤(常用路线)
* 通过用户表关联来过滤组织数据
*/
private void applyOrganizationDataPermissionForCommonRoute(CommonRouteDo commonRouteDo) {
try {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
// 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据
// 其他组织只能查询自己组织的数据
if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) {
// 其他组织:需要通过用户表关联来过滤,只查询同一组织下用户创建的常用路线
// 由于CommonRoute表只有userId字段,需要在XML中通过用户表关联来过滤
commonRouteDo.setOrganizationId(loginUserOrganizationId);
}
// 如果是2827组织,不设置organizationId,可以查询全部
}
} catch (Exception e) {
// 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询
}
}
/**
* 新增常用路线
*
@@ -38,10 +38,30 @@ public class ContainerApplicationService {
public List<ContainerPO> queryList(ContainerDO containerDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null){
if (loginUser != null && loginUser.getUserPo() != null){
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1){
containerDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
// 数据权限:根据organizationId来设置查询权限
// organizationId等于2827时查询全部,其他仅查询各自组织的信息
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织(organizationId=2827):可以查询所有组织的数据
// 如果前端传递了 organizationId,使用前端传递的值进行过滤
// 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据
if (containerDO.getOrganizationId() == null) {
containerDO.setOrganizationId(null);
containerDO.setTopOrganizationId(null);
}
} else {
// 其他组织:设置organizationId,只查询当前组织的数据
if (topOrganizationId != null && topOrganizationId != 1){
containerDO.setTopOrganizationId(topOrganizationId);
}
// 如果前端传递了organizationId,验证是否与当前登录用户的组织ID一致
if (containerDO.getOrganizationId() != null && !containerDO.getOrganizationId().equals(loginUserOrganizationId)) {
// 前端传递了其他组织的organizationId,强制使用当前登录用户的组织ID,防止越权查询
containerDO.setOrganizationId(loginUserOrganizationId);
}
}
}
return containerDomainService.queryList(containerDO);
@@ -52,6 +72,13 @@ public class ContainerApplicationService {
* 新增容器管理
*/
public Boolean insert(ContainerDO containerDO) {
// 设置当前登录用户的组织信息
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
containerDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
containerDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
containerDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
}
//翻译库区类型
setDataDict(containerDO);
return containerDomainService.insert(containerDO);
@@ -22,6 +22,7 @@ import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.model.LoginUser;
import com.mhd.common.core.domain.po.UserPo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -50,29 +51,131 @@ public class ExpenseAccountApplicationService {
/**
* 分页查询费用科目列表
*/
public List<ExpenseAccountPO> queryList(ExpenseAccountDO expenseAccountDO) {
setTopOrganizationIdLogin(expenseAccountDO);
return expenseAccountDomainService.queryList(expenseAccountDO);
try {
log.info("开始查询费用科目列表,参数:organizationId={}, topOrganizationId={}, expenseAccountDO={}",
expenseAccountDO.getOrganizationId(), expenseAccountDO.getTopOrganizationId(), expenseAccountDO);
setDataPermission(expenseAccountDO);
// 处理 createByName 和 updateByName 字段:
// 问题:ExpenseAccountAssembler 在查询场景下可能会自动设置 createByName 和 updateByName 为当前登录用户名
// 这会导致 SQL 中添加 create_by_name LIKE '%nanguang%' 和 update_by_name LIKE '%nanguang%' 条件
// 解决方案:
// 1. 如果查询所有组织(organizationId 和 topOrganizationId 都为 null),清空这些字段(除非前端明确传递了这些字段作为查询条件)
// 2. 如果查询指定组织(organizationId 不为 null),且是南光组织查询,如果 createByName 或 updateByName 等于当前登录用户名,清空它们
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
String currentUserName = loginUser.getUsername();
// 先保存前端传递的 createByName 和 updateByName(用于判断是否是前端传递的查询条件)
String frontendCreateByName = expenseAccountDO.getCreateByName();
String frontendUpdateByName = expenseAccountDO.getUpdateByName();
if (expenseAccountDO.getOrganizationId() == null && expenseAccountDO.getTopOrganizationId() == null) {
// 查询所有组织的数据时,不应该通过创建者或更新者来过滤,清空这些字段
// 除非前端明确传递了这些字段作为查询条件
if (frontendCreateByName == null || frontendCreateByName.isEmpty() ||
(currentUserName != null && frontendCreateByName.equals(currentUserName))) {
// 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空
log.info("查询所有组织数据,清空 createByName 过滤条件(前端未传递或由 Assembler 自动设置)");
expenseAccountDO.setCreateByName(null);
}
if (frontendUpdateByName == null || frontendUpdateByName.isEmpty() ||
(currentUserName != null && frontendUpdateByName.equals(currentUserName))) {
// 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空
log.info("查询所有组织数据,清空 updateByName 过滤条件(前端未传递或由 Assembler 自动设置)");
expenseAccountDO.setUpdateByName(null);
}
} else if (expenseAccountDO.getOrganizationId() != null && loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织查询指定组织时,如果 createByName 或 updateByName 等于当前登录用户名,说明可能是 Assembler 自动设置的
// 清空这些字段,避免限制查询结果(因为其他组织的数据可能不是当前登录用户创建的)
if (currentUserName != null) {
if (expenseAccountDO.getCreateByName() != null && expenseAccountDO.getCreateByName().equals(currentUserName)) {
log.info("南光组织查询指定组织数据(organizationId={}),清空 createByName 过滤条件(可能由 Assembler 自动设置)",
expenseAccountDO.getOrganizationId());
expenseAccountDO.setCreateByName(null);
}
if (expenseAccountDO.getUpdateByName() != null && expenseAccountDO.getUpdateByName().equals(currentUserName)) {
log.info("南光组织查询指定组织数据(organizationId={}),清空 updateByName 过滤条件(可能由 Assembler 自动设置)",
expenseAccountDO.getOrganizationId());
expenseAccountDO.setUpdateByName(null);
}
}
}
}
log.info("设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, createByName={}, updateByName={}",
expenseAccountDO.getOrganizationId(), expenseAccountDO.getTopOrganizationId(),
expenseAccountDO.getCreateByName(), expenseAccountDO.getUpdateByName());
List<ExpenseAccountPO> result = expenseAccountDomainService.queryList(expenseAccountDO);
log.info("查询费用科目列表成功,返回数据条数:{}", result != null ? result.size() : 0);
return result;
} catch (Exception e) {
log.error("查询费用科目列表异常", e);
throw e;
}
}
public List<ExpenseAccountPO> treeCostSubject(ExpenseAccountDO expenseAccountDO){
setTopOrganizationIdLogin(expenseAccountDO);
setDataPermission(expenseAccountDO);
return expenseAccountDomainService.treeCostSubject(expenseAccountDO);
}
public List<ExpenseAccountPO> subjectTreeCost(ExpenseAccountDO expenseAccountDO){
setTopOrganizationIdLogin(expenseAccountDO);
setDataPermission(expenseAccountDO);
return expenseAccountDomainService.treeCostSubject(expenseAccountDO);
}
private void setTopOrganizationIdLogin(ExpenseAccountDO expenseAccountDO){
/**
* 根据当前登录用户的组织信息实现数据隔离
* 当前登录用户为组织ID字段organization_id为2827时可查全部组织数据,其他组织只能查自己
*/
private void setDataPermission(ExpenseAccountDO expenseAccountDO){
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null){
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1){
expenseAccountDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
if (loginUser == null || loginUser.getUserPo() == null) {
log.warn("费用科目查询 - 未获取到登录用户信息,跳过数据权限过滤");
return;
}
UserPo userPo = loginUser.getUserPo();
Long loginUserOrganizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 先保存前端传递的 organizationId(如果存在)
Long frontendOrganizationId = expenseAccountDO.getOrganizationId();
// 数据权限:根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织(organizationId=2827):可以查询所有组织的数据
// 如果前端传递了 organizationId,使用前端传递的值进行过滤
// 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据
if (frontendOrganizationId != null) {
expenseAccountDO.setOrganizationId(frontendOrganizationId);
expenseAccountDO.setTopOrganizationId(null);
} else {
expenseAccountDO.setOrganizationId(null);
expenseAccountDO.setTopOrganizationId(null);
}
} else {
// 其他组织:设置 organizationId,只查询当前组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
log.warn("费用科目查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
expenseAccountDO.setOrganizationId(loginUserOrganizationId);
} else {
expenseAccountDO.setOrganizationId(frontendOrganizationId);
}
expenseAccountDO.setTopOrganizationId(topOrganizationId);
} else {
// 前端没有传递 organizationId,使用当前登录用户的组织ID
if (loginUserOrganizationId != null) {
expenseAccountDO.setOrganizationId(loginUserOrganizationId);
}
expenseAccountDO.setTopOrganizationId(topOrganizationId);
}
}
}
@@ -276,6 +379,35 @@ public class ExpenseAccountApplicationService {
expenseAccountDO.setUpdateByName(loginUser.getUsername());
return expenseAccountDomainService.update(expenseAccountDO);
}
/**
* 修改创建订单是否固定显示 0-否 1-是
* @param expenseAccountDTO
* @return
*/
public boolean changeFixedOrderDisplay(ExpenseAccountDTO expenseAccountDTO) {
//获取登录用户信息
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
//根据id修改启用状态停用状态
if(expenseAccountDTO.getExpenseAccountId() == null){
throw new ServiceException("费用科目id不能为空");
}
if(expenseAccountDTO.getFixedOrderDisplay() == null){
throw new ServiceException("状态不能为空");
}
if(expenseAccountDTO.getFixedOrderDisplay() != 0 && expenseAccountDTO.getFixedOrderDisplay()!=1){
throw new ServiceException("状态错误");
}
ExpenseAccountDO expenseAccountDO = new ExpenseAccountDO();
expenseAccountDO.setExpenseAccountId(expenseAccountDTO.getExpenseAccountId());
expenseAccountDO.setFixedOrderDisplay(expenseAccountDTO.getFixedOrderDisplay());
expenseAccountDO.setUpdateBy(loginUser.getUserid());
expenseAccountDO.setUpdateTime(new Date());
expenseAccountDO.setUpdateByName(loginUser.getUsername());
return expenseAccountDomainService.update(expenseAccountDO);
}
/**
* 根据编码查询费用科目信息
*/
@@ -287,13 +419,44 @@ public class ExpenseAccountApplicationService {
}
public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){
setDataPermissionForSearch(searchExpenseAccountDO);
return expenseAccountDomainService.selectExpenseAccount(searchExpenseAccountDO);
}
public List<QueryExpenseAccountPO> selectOtherExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){
setDataPermissionForSearch(searchExpenseAccountDO);
return expenseAccountDomainService.selectOtherExpenseAccount(searchExpenseAccountDO);
}
/**
* 为 SearchExpenseAccountDO 设置数据权限
*/
private void setDataPermissionForSearch(SearchExpenseAccountDO searchExpenseAccountDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null || loginUser.getUserPo() == null) {
log.warn("费用科目查询 - 未获取到登录用户信息,跳过数据权限过滤");
return;
}
UserPo userPo = loginUser.getUserPo();
Long loginUserOrganizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 数据权限:根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织(organizationId=2827):可以查询所有组织的数据,不设置组织过滤条件
searchExpenseAccountDO.setOrganizationId(null);
searchExpenseAccountDO.setTopOrganizationId(null);
} else {
// 其他组织:只查询当前组织的数据
if (loginUserOrganizationId != null) {
searchExpenseAccountDO.setOrganizationId(loginUserOrganizationId);
}
searchExpenseAccountDO.setTopOrganizationId(topOrganizationId);
}
}
public List<QueryExpenseAccountPO> selectSocialVehicleExpenseAccount(){
return expenseAccountDomainService.selectSocialVehicleExpenseAccount();
}
@@ -35,24 +35,190 @@ public class ServiceItemsManageApplicationService {
/**
* 分页查询服务项管理列表
*/
public List<ServiceItemsManagePO> queryList(ServiceItemsManageDO serviceItemsManageDO) {
setTopOrganizationIdLogin(serviceItemsManageDO);
return serviceItemsManageDomainService.queryList(serviceItemsManageDO);
try {
log.info("开始查询服务项管理列表,参数:organizationId={}, topOrganizationId={}, serviceItemsManageDO={}",
serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId(), serviceItemsManageDO);
// 先保存前端传递的 organizationId topOrganizationId如果存在
// 注意这里需要在设置权限逻辑之前保存因为 Assembler 可能已经设置了这些值
Long frontendOrganizationId = serviceItemsManageDO.getOrganizationId();
Long frontendTopOrganizationId = serviceItemsManageDO.getTopOrganizationId();
// 获取登录用户信息
LoginUser loginUser = SecurityUtils.getLoginUser();
Long loginUserOrganizationId = null;
Long loginUserTopOrganizationId = null;
if (loginUser != null && loginUser.getUserPo() != null) {
loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
loginUserTopOrganizationId = loginUser.getUserPo().getTopOrganizationId();
}
log.info("登录用户信息:loginUserOrganizationId={}, loginUserTopOrganizationId={}, 前端传递:frontendOrganizationId={}, frontendTopOrganizationId={}",
loginUserOrganizationId, loginUserTopOrganizationId, frontendOrganizationId, frontendTopOrganizationId);
// 数据权限根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId包括2827或其他组织使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId包括2827或其他组织使用前端传递的值进行过滤
serviceItemsManageDO.setOrganizationId(frontendOrganizationId);
serviceItemsManageDO.setTopOrganizationId(null); // 明确设置为 null避免使用 topOrganizationId 条件
log.info("南光组织查询指定组织:organizationId={}", frontendOrganizationId);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
serviceItemsManageDO.setOrganizationId(null);
serviceItemsManageDO.setTopOrganizationId(null);
log.info("南光组织查询所有组织:不设置组织过滤条件");
}
} else {
// 其他组织设置organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("服务项管理查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
serviceItemsManageDO.setOrganizationId(loginUserOrganizationId);
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
serviceItemsManageDO.setOrganizationId(frontendOrganizationId);
}
if (loginUserTopOrganizationId != null) {
serviceItemsManageDO.setTopOrganizationId(loginUserTopOrganizationId);
}
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
if (loginUserOrganizationId != null) {
serviceItemsManageDO.setOrganizationId(loginUserOrganizationId);
}
if (loginUserTopOrganizationId != null) {
serviceItemsManageDO.setTopOrganizationId(loginUserTopOrganizationId);
}
}
}
// 处理 createByName updateByName 字段
// 问题Assembler 在查询场景下serviceItemsManageId == null会自动设置 createByName updateByName 为当前登录用户名
// 这会导致 SQL 中添加 create_by_name LIKE '%nanguang%' update_by_name LIKE '%nanguang%' 条件
// 解决方案
// 1. 如果查询所有组织organizationId topOrganizationId 都为 null清空这些字段
// 2. 如果查询指定组织organizationId 不为 null且是南光组织查询如果 createByName updateByName 等于当前登录用户名清空它们
// 因为查询其他组织的数据时不应该通过当前登录用户的名称来过滤
// 注意这种方法可能会误判如果前端确实传递了当前登录用户名作为查询条件但这种情况很少见且影响较小
String currentUserName = null;
if (loginUser != null && loginUser.getUserPo() != null) {
currentUserName = loginUser.getUsername();
}
if (serviceItemsManageDO.getOrganizationId() == null && serviceItemsManageDO.getTopOrganizationId() == null) {
// 查询所有组织的数据时不应该通过创建者或更新者来过滤清空这些字段
log.info("查询所有组织数据,清空 createByName 和 updateByName 过滤条件,避免限制查询结果");
serviceItemsManageDO.setCreateByName(null);
serviceItemsManageDO.setUpdateByName(null);
} else if (serviceItemsManageDO.getOrganizationId() != null && loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织查询指定组织时如果 createByName updateByName 等于当前登录用户名说明可能是 Assembler 自动设置的
// 清空这些字段避免限制查询结果因为其他组织的数据可能不是当前登录用户创建的
if (currentUserName != null) {
if (serviceItemsManageDO.getCreateByName() != null && serviceItemsManageDO.getCreateByName().equals(currentUserName)) {
log.info("南光组织查询指定组织数据(organizationId={}),清空 createByName 过滤条件(可能由 Assembler 自动设置)",
serviceItemsManageDO.getOrganizationId());
serviceItemsManageDO.setCreateByName(null);
}
if (serviceItemsManageDO.getUpdateByName() != null && serviceItemsManageDO.getUpdateByName().equals(currentUserName)) {
log.info("南光组织查询指定组织数据(organizationId={}),清空 updateByName 过滤条件(可能由 Assembler 自动设置)",
serviceItemsManageDO.getOrganizationId());
serviceItemsManageDO.setUpdateByName(null);
}
}
}
log.info("设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, createByName={}, updateByName={}",
serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId(),
serviceItemsManageDO.getCreateByName(), serviceItemsManageDO.getUpdateByName());
List<ServiceItemsManagePO> result = serviceItemsManageDomainService.queryList(serviceItemsManageDO);
log.info("查询服务项管理列表成功,返回数据条数:{}", result != null ? result.size() : 0);
return result;
} catch (Exception e) {
log.error("查询服务项管理列表异常", e);
throw e;
}
}
public List<ServiceItemsManagePO> getCostTypeList(ServiceItemsManageDO serviceItemsManageDO){
setTopOrganizationIdLogin(serviceItemsManageDO);
return serviceItemsManageDomainService.getCostsType(serviceItemsManageDO);
}
private void setTopOrganizationIdLogin(ServiceItemsManageDO serviceItemsManageDO){
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null){
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1){
serviceItemsManageDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
try {
log.info("开始查询费用类别列表,参数:{}", serviceItemsManageDO);
// 先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = serviceItemsManageDO.getOrganizationId();
// 获取登录用户信息
LoginUser loginUser = SecurityUtils.getLoginUser();
Long loginUserOrganizationId = null;
Long topOrganizationId = null;
if (loginUser != null && loginUser.getUserPo() != null) {
loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
}
// 数据权限根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId包括2827使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId包括2827或其他组织使用前端传递的值进行过滤
serviceItemsManageDO.setOrganizationId(frontendOrganizationId);
serviceItemsManageDO.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
serviceItemsManageDO.setOrganizationId(null);
serviceItemsManageDO.setTopOrganizationId(null);
}
} else {
// 其他组织设置organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("费用类别查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
serviceItemsManageDO.setOrganizationId(loginUserOrganizationId);
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
serviceItemsManageDO.setOrganizationId(frontendOrganizationId);
}
if (topOrganizationId != null) {
serviceItemsManageDO.setTopOrganizationId(topOrganizationId);
}
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
if (loginUserOrganizationId != null) {
serviceItemsManageDO.setOrganizationId(loginUserOrganizationId);
}
if (topOrganizationId != null) {
serviceItemsManageDO.setTopOrganizationId(topOrganizationId);
}
}
}
log.info("设置组织ID后,费用类别查询参数:organizationId={}, topOrganizationId={}",
serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId());
List<ServiceItemsManagePO> result = serviceItemsManageDomainService.getCostsType(serviceItemsManageDO);
log.info("查询费用类别列表成功,返回数据条数:{}", result != null ? result.size() : 0);
return result;
} catch (Exception e) {
log.error("查询费用类别列表异常", e);
throw e;
}
}
@@ -56,6 +56,13 @@ public class WarehouseApplicationService {
* 新增仓库
*/
public Boolean insert(WarehouseDO warehouseDO) {
// 设置当前登录用户的组织信息
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
warehouseDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
warehouseDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
warehouseDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
}
//设置数据字典键值
setDataDict(warehouseDO);
return warehouseDomainService.insert(warehouseDO);
@@ -126,4 +126,7 @@ public class CommonRouteDo extends BaseVOEntity
@ApiModelProperty(name = "运费单价")
private BigDecimal freightUnitPrice;
@ApiModelProperty(name = "组织ID(用于数据权限过滤,内部使用)", hidden = true)
private Long organizationId;
}
@@ -101,4 +101,10 @@ public class ExpenseAccount extends BaseVOEntity{
@ApiModelProperty(name = "收支类型")
private Integer accountExpenseType;
@ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是")
private Integer fixedOrderDisplay;
@ApiModelProperty("费率")
private BigDecimal rate;
}
@@ -10,6 +10,7 @@ import com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO;
import com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDoMap;
import com.mhd.basic.domain.expenseAccount.repository.todo.SearchExpenseAccountDO;
import com.mhd.basic.interfaces.dto.expenseAccount.SearchExpenseAccountDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +25,7 @@ import java.util.List;
* @author gen
* @date 2024-06-04
*/
@Slf4j
@Service
public class ExpenseAccountImpl extends ServiceImpl<ExpenseAccountMapper, ExpenseAccount> implements IExpenseAccountService{
@Autowired
@@ -35,7 +37,15 @@ public class ExpenseAccountImpl extends ServiceImpl<ExpenseAccountMapper, Expens
@Override
public List<ExpenseAccountPO> queryList(ExpenseAccountDO expenseAccountDO)
{
return expenseAccountMapper.queryList(expenseAccountDO);
// 添加日志记录查询参数
log.info("ExpenseAccountImpl.queryList 查询参数:topOrganizationId={}, subjectName={}, subjectCode={}, status={}",
expenseAccountDO.getTopOrganizationId(),
expenseAccountDO.getSubjectName(),
expenseAccountDO.getSubjectCode(),
expenseAccountDO.getStatus());
List<ExpenseAccountPO> result = expenseAccountMapper.queryList(expenseAccountDO);
log.info("ExpenseAccountImpl.queryList 查询结果:{} 条", result != null ? result.size() : 0);
return result;
}
@Override
@@ -122,4 +122,11 @@ public class ExpenseAccountPO extends BaseVOEntity{
@Excel(name = "服务项税率")
private BigDecimal taxRate;
@ApiModelProperty("费率")
private BigDecimal rate;
@ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是")
private Integer fixedOrderDisplay;
}
@@ -39,5 +39,16 @@ public class QueryExpenseAccountPO {
@Excel(name = "上级科目名称")
private String upperSubject;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
}
@@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import io.swagger.annotations.ApiModelProperty;
import com.mhd.common.core.web.domain.BaseVOEntity;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.List;
@@ -125,4 +126,24 @@ public class ExpenseAccountDO extends BaseVOEntity{
@ApiModelProperty("服务项名称")
private String serviceItemsName;
@ApiModelProperty("费率")
private BigDecimal rate;
@ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是")
private Integer fixedOrderDisplay;
@ApiModelProperty(name = "创建者姓名")
private String createByName;
@ApiModelProperty(value = "创建时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新者")
private Long updateBy;
@ApiModelProperty(name = "创建者姓名")
private String updateByName;
}
@@ -25,4 +25,10 @@ public class SearchExpenseAccountDO{
@ApiModelProperty("社会车辆固定显示(1-是,2-否)")
private Integer societyStatus;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("上级组织ID")
private Long topOrganizationId;
}
@@ -22,7 +22,7 @@ public interface IServiceItemsManageService extends IService<ServiceItemsManage>
/**
* 查询费用类别
*/
public List<ServiceItemsManagePO> getCostType();
public List<ServiceItemsManagePO> getCostType(ServiceItemsManageDO serviceItemsManageDO);
/**
* 新增服务项管理
*/
@@ -21,6 +21,6 @@ public interface ServiceItemsManageMapper extends BaseMapper<ServiceItemsManage>
/**
* 查询费用类别
*/
public List<ServiceItemsManagePO> selectServiceTypes();
public List<ServiceItemsManagePO> selectServiceTypes(ServiceItemsManageDO serviceItemsManageDO);
}
@@ -6,6 +6,7 @@ import com.mhd.basic.domain.serviceItemsManage.entity.ServiceItemsManage;
import com.mhd.basic.domain.serviceItemsManage.repository.facade.IServiceItemsManageService;
import com.mhd.basic.domain.serviceItemsManage.repository.po.ServiceItemsManagePO;
import com.mhd.basic.domain.serviceItemsManage.repository.todo.ServiceItemsManageDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -19,6 +20,7 @@ import java.util.List;
* @author gen
* @date 2024-06-03
*/
@Slf4j
@Service
public class ServiceItemsManageImpl extends ServiceImpl<ServiceItemsManageMapper, ServiceItemsManage> implements IServiceItemsManageService{
@Autowired
@@ -30,12 +32,80 @@ public class ServiceItemsManageImpl extends ServiceImpl<ServiceItemsManageMapper
@Override
public List<ServiceItemsManagePO> queryList(ServiceItemsManageDO serviceItemsManageDO)
{
return serviceItemsManageMapper.queryList(serviceItemsManageDO);
// 添加日志记录查询参数
log.info("ServiceItemsManageImpl.queryList 查询参数:topOrganizationId={}, organizationId={}, serviceItemsName={}, serviceItemsCode={}",
serviceItemsManageDO.getTopOrganizationId(),
serviceItemsManageDO.getOrganizationId(),
serviceItemsManageDO.getServiceItemsName(),
serviceItemsManageDO.getServiceItemsCode());
// 构建SQL查询条件说明用于日志必须与 MyBatis XML 中的条件保持一致
StringBuilder sqlCondition = new StringBuilder("WHERE del_flag = 1");
// 组织过滤条件 XML 中的 <if test="organizationId != null"> <if test="topOrganizationId != null and organizationId == null"> 对应
if (serviceItemsManageDO.getOrganizationId() != null) {
// 如果设置了 organizationId添加 organization_id 条件
sqlCondition.append(" AND organization_id = ").append(serviceItemsManageDO.getOrganizationId());
sqlCondition.append(" AND organization_name IS NOT NULL");
sqlCondition.append(" AND organization_name != ''");
sqlCondition.append(" AND LENGTH(TRIM(organization_name)) > 0");
} else if (serviceItemsManageDO.getTopOrganizationId() != null) {
// 如果设置了 topOrganizationId 但没有设置 organizationId添加 top_organization_id 条件
sqlCondition.append(" AND top_organization_id = ").append(serviceItemsManageDO.getTopOrganizationId());
sqlCondition.append(" AND organization_name IS NOT NULL");
sqlCondition.append(" AND organization_name != ''");
sqlCondition.append(" AND LENGTH(TRIM(organization_name)) > 0");
} else {
// 如果 organizationId topOrganizationId 都为 null不添加组织过滤条件查询所有组织的数据
sqlCondition.append(" (无组织过滤条件,查询所有组织的数据)");
}
// 其他查询条件
if (serviceItemsManageDO.getCreateByName() != null && !serviceItemsManageDO.getCreateByName().isEmpty()) {
sqlCondition.append(" AND create_by_name LIKE '%").append(serviceItemsManageDO.getCreateByName()).append("%'");
}
if (serviceItemsManageDO.getUpdateByName() != null && !serviceItemsManageDO.getUpdateByName().isEmpty()) {
sqlCondition.append(" AND update_by_name LIKE '%").append(serviceItemsManageDO.getUpdateByName()).append("%'");
}
if (serviceItemsManageDO.getOrganizationName() != null && !serviceItemsManageDO.getOrganizationName().isEmpty()) {
sqlCondition.append(" AND organization_name LIKE '%").append(serviceItemsManageDO.getOrganizationName()).append("%'");
}
if (serviceItemsManageDO.getServiceItemsName() != null && !serviceItemsManageDO.getServiceItemsName().isEmpty()) {
sqlCondition.append(" AND service_items_name LIKE '%").append(serviceItemsManageDO.getServiceItemsName()).append("%'");
}
if (serviceItemsManageDO.getServiceItemsCode() != null && !serviceItemsManageDO.getServiceItemsCode().isEmpty()) {
sqlCondition.append(" AND service_items_code = '").append(serviceItemsManageDO.getServiceItemsCode()).append("'");
}
if (serviceItemsManageDO.getTaxRate() != null) {
sqlCondition.append(" AND tax_rate = ").append(serviceItemsManageDO.getTaxRate());
}
if (serviceItemsManageDO.getRemark() != null && !serviceItemsManageDO.getRemark().isEmpty()) {
sqlCondition.append(" AND remark LIKE '%").append(serviceItemsManageDO.getRemark()).append("%'");
}
log.info("ServiceItemsManageImpl.queryList 生成的SQL条件(预估):SELECT * FROM service_items_manage {}", sqlCondition.toString());
log.info("ServiceItemsManageImpl.queryList 实际执行的SQL请查看 MyBatis 日志,参数:organizationId={}, topOrganizationId={}, delFlag={}",
serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId(), serviceItemsManageDO.getDelFlag());
List<ServiceItemsManagePO> result = serviceItemsManageMapper.queryList(serviceItemsManageDO);
log.info("ServiceItemsManageImpl.queryList 查询结果:{} 条", result != null ? result.size() : 0);
// 记录查询结果中的组织ID分布
if (result != null && !result.isEmpty()) {
StringBuilder orgIds = new StringBuilder();
for (ServiceItemsManagePO po : result) {
if (orgIds.length() > 0) {
orgIds.append(", ");
}
orgIds.append(po.getOrganizationId());
}
log.info("查询结果中的组织ID分布:{}", orgIds.toString());
}
return result;
}
@Override
public List<ServiceItemsManagePO> getCostType() {
return serviceItemsManageMapper.selectServiceTypes();
public List<ServiceItemsManagePO> getCostType(ServiceItemsManageDO serviceItemsManageDO) {
return serviceItemsManageMapper.selectServiceTypes(serviceItemsManageDO);
}
/**
* 新增服务项管理
@@ -37,7 +37,7 @@ public class ServiceItemsManageDomainService {
* 查询费用类型
*/
public List<ServiceItemsManagePO> getCostsType(ServiceItemsManageDO serviceItemsManageDO){
return serviceItemsManageService.getCostType();
return serviceItemsManageService.getCostType(serviceItemsManageDO);
}
@@ -27,8 +27,10 @@ public class ExpenseAccountAssembler {
*/
public ExpenseAccountDO toDO(ExpenseAccountDTO expenseAccountDTO) {
ExpenseAccountDO expenseAccountDO = new ExpenseAccountDO();
// 拷贝
BeanUtils.copyProperties(expenseAccountDTO, expenseAccountDO, IgnoreNullUtil.getNullPropertyNames(expenseAccountDTO));
// 如果 expenseAccountDTO 不为 null才进行拷贝
if (expenseAccountDTO != null) {
BeanUtils.copyProperties(expenseAccountDTO, expenseAccountDO, IgnoreNullUtil.getNullPropertyNames(expenseAccountDTO));
}
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
@@ -36,28 +38,45 @@ public class ExpenseAccountAssembler {
String userName = loginUser.getUsername();
// 获取登录人id
Long userId = loginUser.getUserid();
if(expenseAccountDTO.getExpenseAccountId() != null){
// 只有在新增或编辑操作时才设置 createByName updateByName
// 查询列表时不应该自动设置这些字段否则会导致 SQL 中添加过滤条件影响查询结果
if(expenseAccountDTO != null && expenseAccountDTO.getExpenseAccountId() != null){
// 编辑操作只设置更新相关字段
if(userId != null){
expenseAccountDO.setUpdateBy(userId);
}else {
expenseAccountDO.setUpdateBy(new Long("0"));
}
expenseAccountDO.setUpdateByName(userName);
expenseAccountDO.setUpdateTime(new Date());
}else {
if(userId != null){
expenseAccountDO.setCreateBy(userId);
expenseAccountDO.setUpdateBy(userId);
}else {
expenseAccountDO.setCreateBy(new Long("0"));
expenseAccountDO.setUpdateBy(new Long("0"));
// 只有在 DTO 中没有传递 updateByName 时才设置避免覆盖前端传递的值
if(expenseAccountDO.getUpdateByName() == null || expenseAccountDO.getUpdateByName().isEmpty()){
expenseAccountDO.setUpdateByName(userName);
}
expenseAccountDO.setCreateByName(userName);
expenseAccountDO.setUpdateByName(userName);
expenseAccountDO.setCreateTime(new Date());
expenseAccountDO.setUpdateTime(new Date());
expenseAccountDO.setDelFlag(1);
} else if(expenseAccountDTO != null && expenseAccountDTO.getExpenseAccountId() == null) {
// expenseAccountId == null可能是查询操作或新增操作
// 如果前端传递了 createByName updateByName说明是查询条件不应该设置已经在 BeanUtils.copyProperties 中拷贝了
// 如果前端没有传递 createByName updateByName可能是新增操作需要设置默认值
boolean hasQueryCondition = (expenseAccountDTO.getCreateByName() != null && !expenseAccountDTO.getCreateByName().isEmpty())
|| (expenseAccountDTO.getUpdateByName() != null && !expenseAccountDTO.getUpdateByName().isEmpty());
if(!hasQueryCondition) {
// 没有查询条件可能是新增操作设置默认值
if(userId != null){
expenseAccountDO.setCreateBy(userId);
expenseAccountDO.setUpdateBy(userId);
}else {
expenseAccountDO.setCreateBy(new Long("0"));
expenseAccountDO.setUpdateBy(new Long("0"));
}
expenseAccountDO.setCreateByName(userName);
expenseAccountDO.setUpdateByName(userName);
expenseAccountDO.setCreateTime(new Date());
expenseAccountDO.setUpdateTime(new Date());
expenseAccountDO.setDelFlag(1);
}
// 如果有查询条件createByName updateByName说明是查询操作不应该设置这些字段
// 字段值已经在 BeanUtils.copyProperties 中从 DTO 拷贝过来了
}
return expenseAccountDO;
}
@@ -27,8 +27,10 @@ public class ServiceItemsManageAssembler {
*/
public ServiceItemsManageDO toDO(ServiceItemsManageDTO serviceItemsManageDTO) {
ServiceItemsManageDO serviceItemsManageDO = new ServiceItemsManageDO();
// 拷贝
BeanUtils.copyProperties(serviceItemsManageDTO, serviceItemsManageDO, IgnoreNullUtil.getNullPropertyNames(serviceItemsManageDTO));
// 如果 serviceItemsManageDTO 不为 null才进行拷贝
if (serviceItemsManageDTO != null) {
BeanUtils.copyProperties(serviceItemsManageDTO, serviceItemsManageDO, IgnoreNullUtil.getNullPropertyNames(serviceItemsManageDTO));
}
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
@@ -36,28 +38,49 @@ public class ServiceItemsManageAssembler {
String userName = loginUser.getUsername();
// 获取登录人id
Long userId = loginUser.getUserid();
if(serviceItemsManageDTO.getServiceItemsManageId() != null){
// 只有在新增或编辑操作时才设置 createByName updateByName
// 查询列表时不应该自动设置这些字段否则会导致 SQL 中添加过滤条件影响查询结果
// 判断规则
// 1. 如果 serviceItemsManageId != null说明是编辑操作只设置更新相关字段
// 2. 如果 serviceItemsManageId == null 且前端传递了 createByName updateByName说明是查询条件不应该覆盖
// 3. 如果 serviceItemsManageId == null 且前端没有传递 createByName updateByName可能是新增操作设置默认值
if(serviceItemsManageDTO != null && serviceItemsManageDTO.getServiceItemsManageId() != null){
// 编辑操作只设置更新相关字段
if(userId != null){
serviceItemsManageDO.setUpdateBy(userId);
}else {
serviceItemsManageDO.setUpdateBy(new Long("0"));
}
serviceItemsManageDO.setUpdateByName(userName);
serviceItemsManageDO.setUpdateTime(new Date());
}else {
if(userId != null){
serviceItemsManageDO.setCreateBy(userId);
serviceItemsManageDO.setUpdateBy(userId);
}else {
serviceItemsManageDO.setCreateBy(new Long("0"));
serviceItemsManageDO.setUpdateBy(new Long("0"));
// 只有在 DTO 中没有传递 updateByName 时才设置避免覆盖前端传递的值
if(serviceItemsManageDO.getUpdateByName() == null || serviceItemsManageDO.getUpdateByName().isEmpty()){
serviceItemsManageDO.setUpdateByName(userName);
}
serviceItemsManageDO.setCreateByName(userName);
serviceItemsManageDO.setUpdateByName(userName);
serviceItemsManageDO.setCreateTime(new Date());
serviceItemsManageDO.setUpdateTime(new Date());
serviceItemsManageDO.setDelFlag(1);
} else if(serviceItemsManageDTO != null && serviceItemsManageDTO.getServiceItemsManageId() == null) {
// serviceItemsManageId == null可能是查询操作或新增操作
// 如果前端传递了 createByName updateByName说明是查询条件不应该设置已经在 BeanUtils.copyProperties 中拷贝了
// 如果前端没有传递 createByName updateByName可能是新增操作需要设置默认值
boolean hasQueryCondition = (serviceItemsManageDTO.getCreateByName() != null && !serviceItemsManageDTO.getCreateByName().isEmpty())
|| (serviceItemsManageDTO.getUpdateByName() != null && !serviceItemsManageDTO.getUpdateByName().isEmpty());
if(!hasQueryCondition) {
// 没有查询条件可能是新增操作设置默认值
if(userId != null){
serviceItemsManageDO.setCreateBy(userId);
serviceItemsManageDO.setUpdateBy(userId);
}else {
serviceItemsManageDO.setCreateBy(new Long("0"));
serviceItemsManageDO.setUpdateBy(new Long("0"));
}
serviceItemsManageDO.setCreateByName(userName);
serviceItemsManageDO.setUpdateByName(userName);
serviceItemsManageDO.setCreateTime(new Date());
serviceItemsManageDO.setUpdateTime(new Date());
serviceItemsManageDO.setDelFlag(1);
}
// 如果有查询条件createByName updateByName说明是查询操作不应该设置这些字段
// 字段值已经在 BeanUtils.copyProperties 中从 DTO 拷贝过来了
}
return serviceItemsManageDO;
}
@@ -126,4 +126,10 @@ public class ExpenseAccountDTO extends BaseVOEntity{
@ApiModelProperty("服务项名称")
private String serviceItemsName;
@ApiModelProperty("费率")
private BigDecimal rate;
@ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是")
private Integer fixedOrderDisplay;
}
@@ -18,6 +18,7 @@ import com.mhd.common.core.constant.HttpStatus;
import com.mhd.common.core.domain.entity.R;
import com.sun.org.apache.bcel.internal.generic.NEW;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +29,8 @@ import javax.annotation.Resource;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.core.web.page.TableDataInfo;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
import org.springframework.web.client.RestTemplate;
/**
@@ -52,11 +55,35 @@ public class ExpenseAccountApi extends BaseController{
@GetMapping("/list")
public TableDataInfo list(ExpenseAccountDTO expenseAccountDTO)
{
//转换实体
ExpenseAccountDO expenseAccountDO = expenseAccountAssembler.toDO(expenseAccountDTO);
startPage();
List<ExpenseAccountPO> list = expenseAccountApplicationService.queryList(expenseAccountDO);
return getDataTable(list);
logger.info("收到查询费用科目列表请求,参数:{}", expenseAccountDTO);
try {
//转换实体如果 expenseAccountDTO null创建一个新的对象
if (expenseAccountDTO == null) {
expenseAccountDTO = new ExpenseAccountDTO();
logger.info("expenseAccountDTO 为 null,创建新对象");
}
ExpenseAccountDO expenseAccountDO = expenseAccountAssembler.toDO(expenseAccountDTO);
if(StringUtils.isBlank(expenseAccountDTO.getCreateByName())){
expenseAccountDO.setCreateByName(null);
}
if(StringUtils.isBlank(expenseAccountDTO.getUpdateByName())){
expenseAccountDO.setUpdateByName(null);
}
logger.info("转换后的 ExpenseAccountDO{}", expenseAccountDO);
startPage();
logger.info("分页参数已设置");
List<ExpenseAccountPO> list = expenseAccountApplicationService.queryList(expenseAccountDO);
logger.info("查询完成,返回数据条数:{}", list != null ? list.size() : 0);
if (list != null && list.isEmpty()) {
logger.warn("查询结果为空,可能的原因:1.数据库中没有符合条件的数据 2.数据权限过滤 3.SQL查询条件问题");
logger.warn("查询条件:topOrganizationId={}, del_flag=1", expenseAccountDO.getTopOrganizationId());
}
return getDataTable(list);
} catch (Exception e) {
logger.error("查询费用科目列表失败", e);
e.printStackTrace();
return getDataTable(new ArrayList<>());
}
}
@ApiOperation("查询费用科目树型列表")
@@ -81,9 +108,50 @@ public class ExpenseAccountApi extends BaseController{
public AjaxResult selectOtherExpenseAccount(SearchExpenseAccountDTO searchExpenseAccountDTO){
SearchExpenseAccountDO searchExpenseAccountDO = new SearchExpenseAccountDO();
BeanUtils.copyProperties(searchExpenseAccountDTO,searchExpenseAccountDO);
// 数据权限根据组织ID实现数据隔离
// organizationId=2827南光查询所有组织的数据其他组织只查询自己的数据
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getOrganizationPo() != null) {
Long loginUserOrganizationId = loginUser.getOrganizationPo().getOrganizationId();
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据不设置 organizationId 过滤条件
searchExpenseAccountDO.setOrganizationId(null);
} else {
// 其他组织只查询自己组织的数据
searchExpenseAccountDO.setOrganizationId(loginUserOrganizationId);
}
}
return AjaxResult.success(expenseAccountApplicationService.selectOtherExpenseAccount(searchExpenseAccountDO));
}
/**
* 测试查询 - 不设置组织ID查看是否有数据
*/
@ApiOperation("测试查询费用科目列表(不设置组织ID")
@GetMapping("/testList")
public AjaxResult testList(ExpenseAccountDTO expenseAccountDTO)
{
logger.info("测试查询费用科目列表,不设置组织ID");
try {
if (expenseAccountDTO == null) {
expenseAccountDTO = new ExpenseAccountDTO();
}
ExpenseAccountDO expenseAccountDO = expenseAccountAssembler.toDO(expenseAccountDTO);
// 不设置组织ID测试是否能查询到数据
expenseAccountDO.setTopOrganizationId(null);
logger.info("测试查询参数:{}", expenseAccountDO);
startPage();
List<ExpenseAccountPO> list = expenseAccountApplicationService.queryList(expenseAccountDO);
logger.info("测试查询结果:{} 条", list != null ? list.size() : 0);
return AjaxResult.success(list);
} catch (Exception e) {
logger.error("测试查询失败", e);
return AjaxResult.error("测试查询失败:" + e.getMessage());
}
}
@ApiOperation("查询费用科目-所有现金明细")
@GetMapping("/selectAllCashExpenseAccount")
public AjaxResult selectAllCashExpenseAccount(){
@@ -197,7 +265,16 @@ public class ExpenseAccountApi extends BaseController{
return AjaxResult.error(e.getMessage());
}
}
@ApiOperation("修改创建订单默认显示设置")
@PostMapping("/changeFixedOrderDisplay")
public AjaxResult changeFixedOrderDisplay(@RequestBody ExpenseAccountDTO expenseAccountDTO)
{
try {
return toAjax(expenseAccountApplicationService.changeFixedOrderDisplay(expenseAccountDTO));
}catch (Exception e){
return AjaxResult.error(e.getMessage());
}
}
@ApiOperation("根据code获取费用科目")
@GetMapping(value = "/getInfoByCode")
@@ -8,6 +8,7 @@ import com.mhd.basic.domain.serviceItemsManage.repository.todo.ServiceItemsManag
import com.mhd.basic.interfaces.assember.serviceItemsManage.ServiceItemsManageAssembler;
import com.mhd.basic.interfaces.dto.serviceItemsManage.ServiceItemsManageDTO;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -40,6 +41,12 @@ public class ServiceItemsManageApi extends BaseController{
{
//转换实体
ServiceItemsManageDO serviceItemsManageDO = serviceItemsManageAssembler.toDO(serviceItemsManageDTO);
if(StringUtils.isBlank(serviceItemsManageDTO.getCreateByName())){
serviceItemsManageDO.setCreateByName(null);
}
if(StringUtils.isBlank(serviceItemsManageDTO.getUpdateByName())){
serviceItemsManageDO.setUpdateByName(null);
}
startPage();
List<ServiceItemsManagePO> list = serviceItemsManageApplicationService.queryList(serviceItemsManageDO);
return getDataTable(list);
@@ -85,12 +85,25 @@ public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDi
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
// 数据权限验证南光组织organizationId=2827可以删除所有组织的数据其他组织只能删除自己组织的数据
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
Long loginUserTopOrganizationId = loginUser.getUserPo().getTopOrganizationId();
for (Long dictCode : dictCodes)
{
SysDictData data = selectDictDataById(dictCode);
if (ObjectUtil.notEqual(data.getTopOrganizationId(), loginUser.getUserPo().getTopOrganizationId())) {
throw new ServiceException("修改失败");
// 南光组织organizationId=2827可以删除所有组织的数据
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织可以删除不需要验证 topOrganizationId
} else {
// 其他组织只能删除自己组织的数据
// 使用 Objects.equals 安全比较处理 null 值的情况
if (!java.util.Objects.equals(data.getTopOrganizationId(), loginUserTopOrganizationId)) {
throw new ServiceException("删除失败:无权删除其他组织的字典数据");
}
}
dictDataMapper.deleteDictDataById(dictCode);
SysDictData dictData = new SysDictData();
dictData.setDictType(data.getDictType());
@@ -146,11 +159,25 @@ public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDi
if (ObjectUtil.isNull(sysDictData)) {
throw new ServiceException("字典数据未找到");
}
if ("Y".equals(sysDictData.getIsDefault())) {
throw new ServiceException("默认数据不允许修改");
}
if (ObjectUtil.notEqual(sysDictData.getTopOrganizationId(), loginUser.getUserPo().getTopOrganizationId())) {
throw new ServiceException("修改失败");
// 数据权限验证南光组织organizationId=2827可以修改所有组织的数据包括默认数据其他组织只能修改自己组织的数据包括默认数据
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
Long loginUserTopOrganizationId = loginUser.getUserPo().getTopOrganizationId();
Long dictDataTopOrganizationId = sysDictData.getTopOrganizationId();
Long dictDataOrganizationId = sysDictData.getOrganizationId();
// 南光组织organizationId=2827可以修改所有组织的数据包括默认数据
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织可以修改不需要验证 topOrganizationId
} else {
// 其他组织只能修改自己组织的数据包括默认数据
// 使用 Objects.equals 安全比较处理 null 值的情况
boolean isSameTopOrg = java.util.Objects.equals(dictDataTopOrganizationId, loginUserTopOrganizationId);
boolean isSameOrg = java.util.Objects.equals(dictDataOrganizationId, loginUserOrganizationId);
if (!isSameTopOrg || !isSameOrg) {
throw new ServiceException("修改失败:无权修改其他组织的字典数据");
}
}
data.setUpdateBy(loginUser.getUserPo().getUserName());
int row = dictDataMapper.updateDictData(data);
@@ -14,14 +14,20 @@ spring:
nacos:
discovery:
# 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.5:6848
username: nacos
password: manhuoda@2023
#线上正式环境
# server-addr: 10.102.192.105:6848
config:
# 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.5:6848
username: nacos
password: manhuoda@2023
#线上正式环境
# server-addr: 10.102.192.105:6848
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
@@ -102,7 +102,7 @@
WHERE
a.del_flag = 1
<include refid="common_where"/>
order by account_type,service_items_code,upper_subject_code,show_seq
order by a.update_time DESC
</select>
<select id="selectCostSubject" parameterType="com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO"
resultType="com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO">
@@ -191,12 +191,31 @@
<if test="expenseAccountDO.updateTimeEnd != null and expenseAccountDO.updateTimeEnd != ''">
AND date_format(a.update_time,'%Y-%m-%d') <![CDATA[<=]]> #{expenseAccountDO.updateTimeEnd}
</if>
<if test="expenseAccountDO.topOrganizationId != null ">
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
<!-- 如果 organizationId 和 topOrganizationId 都为 null,表示查询所有组织的数据(不添加组织过滤条件) -->
<if test="expenseAccountDO.organizationId != null">
<!-- 如果设置了 organizationId,添加 organization_id 条件 -->
and a.organization_id = #{expenseAccountDO.organizationId}
and a.organization_name IS NOT NULL
and a.organization_name != ''
and LENGTH(TRIM(a.organization_name)) > 0
</if>
<if test="expenseAccountDO.topOrganizationId != null and expenseAccountDO.organizationId == null">
<!-- 如果设置了 topOrganizationId 但没有设置 organizationId,添加 top_organization_id 条件 -->
and a.top_organization_id = #{expenseAccountDO.topOrganizationId}
and a.organization_name IS NOT NULL
and a.organization_name != ''
and LENGTH(TRIM(a.organization_name)) > 0
</if>
<if test="expenseAccountDO.organizationName != null and expenseAccountDO.organizationName != ''">
and a.organization_name like concat('%', #{expenseAccountDO.organizationName}, '%')
</if>
<if test="expenseAccountDO.serviceItemsCode != null and expenseAccountDO.serviceItemsCode != ''">
and b.service_items_code = #{expenseAccountDO.serviceItemsCode}
</if>
<if test="expenseAccountDO.fixedOrderDisplay != null ">
and a.fixed_order_display = #{expenseAccountDO.fixedOrderDisplay}
</if>
</sql>
<select id="selectExpenseAccount" parameterType="com.mhd.basic.domain.expenseAccount.repository.todo.SearchExpenseAccountDO" resultType="com.mhd.basic.domain.expenseAccount.repository.po.QueryExpenseAccountPO">
select
@@ -238,6 +257,15 @@
<if test="searchExpenseAccountDO.societyStatus != null ">
and a.society_status = #{searchExpenseAccountDO.societyStatus}
</if>
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
<!-- 如果 organizationId 为 null,表示查询所有组织的数据(不添加组织过滤条件) -->
<if test="searchExpenseAccountDO.organizationId != null">
<!-- 如果设置了 organizationId,添加 organization_id 条件 -->
and a.organization_id = #{searchExpenseAccountDO.organizationId}
and a.organization_name IS NOT NULL
and a.organization_name != ''
and LENGTH(TRIM(a.organization_name)) > 0
</if>
and a.del_flag=1
order by show_seq
</select>
@@ -8,18 +8,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectServiceItemsManagePo1">
<where>
del_flag = 1
<!-- 删除标记:0-无状态,1-正常,2-已删除,查询时只查询正常的数据 -->
<choose>
<when test="delFlag != null">
and del_flag = #{delFlag}
</when>
<otherwise>
and del_flag = 1
</otherwise>
</choose>
<if test="createByName != null and createByName != ''">
and create_by_name like concat('%', #{createByName}, '%')
</if>
<if test="updateByName != null and updateByName != ''">
and update_by_name like concat('%', #{updateByName}, '%')
</if>
<if test="topOrganizationId != null ">
and top_organization_id = #{topOrganizationId}
</if>
<if test="organizationId != null ">
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
<!-- 如果 organizationId 和 topOrganizationId 都为 null,表示查询所有组织的数据(不添加组织过滤条件) -->
<if test="organizationId != null">
<!-- 如果设置了 organizationId,添加 organization_id 条件 -->
and organization_id = #{organizationId}
and organization_name IS NOT NULL
and organization_name != ''
and LENGTH(TRIM(organization_name)) > 0
</if>
<if test="topOrganizationId != null and organizationId == null">
<!-- 如果设置了 topOrganizationId 但没有设置 organizationId,添加 top_organization_id 条件 -->
and top_organization_id = #{topOrganizationId}
and organization_name IS NOT NULL
and organization_name != ''
and LENGTH(TRIM(organization_name)) > 0
</if>
<if test="organizationName != null and organizationName != ''">
and organization_name like concat('%', #{organizationName}, '%')
@@ -42,12 +60,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createTimeEnd != null and createTimeEnd != ''">
AND date_format(create_time,'%Y-%m-%d') <![CDATA[<=]]> #{createTimeEnd}
</if>
<if test="createByName != null and createByName != ''">
and create_by_name like concat('%', #{createByName}, '%')
</if>
<if test="updateByName != null and updateByName != ''">
and update_by_name like concat('%', #{updateByName}, '%')
</if>
<if test="updateTimeStart != null and updateTimeStart != ''">
AND date_format(update_time,'%Y-%m-%d') <![CDATA[>=]]> #{updateTimeStart}
</if>
@@ -63,10 +75,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectServiceItemsManagePo1"/>
</select>
<select id="selectServiceTypes"
<select id="selectServiceTypes" parameterType="com.mhd.basic.domain.serviceItemsManage.repository.todo.ServiceItemsManageDO"
resultType="com.mhd.basic.domain.serviceItemsManage.repository.po.ServiceItemsManagePO">
select organization_name,service_items_code,service_items_name,tax_rate,CONCAT(service_items_name,service_items_code) cost_type
from service_items_manage
where del_flag = 1
<include refid="selectServiceItemsManagePo1"/>
</select>
</mapper>
@@ -9,6 +9,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.*
from
common_route a
<if test="commonRouteDo.organizationId != null">
LEFT JOIN "USER" u ON a.user_id = u.user_id AND u.del_flag = 0
</if>
WHERE
a.del_flag = 1
</sql>
@@ -26,6 +29,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and (a.mail_name like concat('%', #{commonRouteDo.synthesize}, '%') OR a.mail_phone LIKE concat('%', #{commonRouteDo.synthesize}, '%') OR a.mail_address_plot LIKE concat('%', #{commonRouteDo.synthesize}, '%')
OR a.addressee_name like concat('%', #{commonRouteDo.synthesize}, '%') OR a.addressee_phone LIKE concat('%', #{commonRouteDo.synthesize}, '%') OR a.addressee_address_plot LIKE concat('%', #{commonRouteDo.synthesize}, '%'))
</if>
<!-- 组织数据权限过滤:通过用户表关联来过滤组织数据 -->
<if test="commonRouteDo.organizationId != null">
and u.organization_id = #{commonRouteDo.organizationId}
</if>
</sql>
<select id="selectCommonRouteByCommonRouteId" parameterType="java.lang.Long"
@@ -140,27 +140,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectAddressBookList" parameterType="com.mhd.common.core.domain.po.AddressBookPo" resultMap="AddressBookResult">
<include refid="selectAddressBookVo"/>
SELECT
ab.*
FROM
address_book ab
<if test="organizationId != null">
LEFT JOIN "USER" u ON ab.user_id = u.user_id AND u.del_flag = 0
</if>
<where>
del_flag = 1
<if test="synthesize != null and synthesize != ''"> and (link_man like concat('%', #{synthesize}, '%') OR link_phone LIKE concat('%', #{synthesize}, '%') OR area_name LIKE concat('%', #{synthesize}, '%') OR address LIKE concat('%', #{synthesize}, '%') OR address_plot LIKE concat('%', #{synthesize}, '%')) </if>
<if test="userId != null "> and user_id = #{userId}</if>
<if test="linkMan != null and linkMan != ''"> and link_man = #{linkMan}</if>
<if test="linkPhone != null and linkPhone != ''"> and link_phone = #{linkPhone}</if>
<if test="provinceCode != null "> and province_code = #{provinceCode}</if>
<if test="cityCode != null "> and city_code = #{cityCode}</if>
<if test="countyCode != null "> and county_code = #{countyCode}</if>
<if test="provinceName != null and provinceName != ''"> and province_name like concat('%', #{provinceName}, '%')</if>
<if test="cityName != null and cityName != ''"> and city_name like concat('%', #{cityName}, '%')</if>
<if test="countyName != null and countyName != ''"> and county_name like concat('%', #{countyName}, '%')</if>
<if test="address != null and address != ''"> and address = #{address}</if>
<if test="doorplate != null and doorplate != ''"> and doorplate = #{doorplate}</if>
<if test="defaultStatus != null "> and default_status = #{defaultStatus}</if>
<if test="createByName != null and createByName != ''"> and create_by_name like concat('%', #{createByName}, '%')</if>
<if test="updateByName != null and updateByName != ''"> and update_by_name like concat('%', #{updateByName}, '%')</if>
ab.del_flag = 1
<if test="synthesize != null and synthesize != ''"> and (ab.link_man like concat('%', #{synthesize}, '%') OR ab.link_phone LIKE concat('%', #{synthesize}, '%') OR ab.area_name LIKE concat('%', #{synthesize}, '%') OR ab.address LIKE concat('%', #{synthesize}, '%') OR ab.address_plot LIKE concat('%', #{synthesize}, '%')) </if>
<if test="userId != null "> and ab.user_id = #{userId}</if>
<if test="linkMan != null and linkMan != ''"> and ab.link_man = #{linkMan}</if>
<if test="linkPhone != null and linkPhone != ''"> and ab.link_phone = #{linkPhone}</if>
<if test="provinceCode != null "> and ab.province_code = #{provinceCode}</if>
<if test="cityCode != null "> and ab.city_code = #{cityCode}</if>
<if test="countyCode != null "> and ab.county_code = #{countyCode}</if>
<if test="provinceName != null and provinceName != ''"> and ab.province_name like concat('%', #{provinceName}, '%')</if>
<if test="cityName != null and cityName != ''"> and ab.city_name like concat('%', #{cityName}, '%')</if>
<if test="countyName != null and countyName != ''"> and ab.county_name like concat('%', #{countyName}, '%')</if>
<if test="address != null and address != ''"> and ab.address = #{address}</if>
<if test="doorplate != null and doorplate != ''"> and ab.doorplate = #{doorplate}</if>
<if test="defaultStatus != null "> and ab.default_status = #{defaultStatus}</if>
<if test="createByName != null and createByName != ''"> and ab.create_by_name like concat('%', #{createByName}, '%')</if>
<if test="updateByName != null and updateByName != ''"> and ab.update_by_name like concat('%', #{updateByName}, '%')</if>
<!-- 组织数据权限过滤:通过用户表关联来过滤组织数据 -->
<if test="organizationId != null">
and u.organization_id = #{organizationId}
</if>
</where>
ORDER BY
create_time DESC
ab.create_time DESC
</select>
<select id="selectAddressBookListByManifestId" parameterType="java.lang.Long" resultMap="AddressBookResult">
@@ -4,14 +4,17 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.mhd.user.domain.userAggregate.entity.DriverVehicleBind;
import com.mhd.user.domain.userAggregate.repository.mapper.DriverVehicleBindMapper;
import com.mhd.user.domain.userAggregate.repository.po.DriverVehicleBindPo;
import com.mhd.user.domain.userAggregate.repository.todo.DriverVehicleBindDo;
import com.mhd.user.domain.userAggregate.service.DriverVehicleBindDomainService;
import com.mhd.user.domain.userAggregate.service.UserDriverDomainService;
import com.mhd.system.api.TransportFeign;
import com.mhd.user.interfaces.dto.DriverVehicleBindDto;
import com.mhd.user.interfaces.dto.addDTO.UserDriverDTO;
import com.mhd.user.interfaces.facadeApi.Po.VehicleDriverBindAppPo;
import com.mhd.common.core.domain.dto.VehicleDto;
import com.mhd.user.domain.userAggregate.repository.po.UserDriverPo;
@@ -49,6 +52,9 @@ public class DriverVehicleBindApplicationService {
private CommonApplicationService commonApplicationService;
@Resource
private UserDriverDomainService userDriverDomainService;
@Autowired
private DriverVehicleBindMapper driverVehicleBindMapper;
/**
* 分页查询司机车辆绑定关系列表
*/
@@ -355,4 +361,9 @@ public class DriverVehicleBindApplicationService {
}
return isTrue;
}
public int delectDriverBind(UserDriverDTO userDriverDTO) {
return driverVehicleBindMapper.delete(new LambdaQueryWrapper<DriverVehicleBind>().eq(DriverVehicleBind::getDriverBindId,userDriverDTO.getUserId())
.eq(DriverVehicleBind::getVehicleId,userDriverDTO.getVehicleId()));
}
}
@@ -40,9 +40,11 @@ import com.mhd.user.domain.roleAggregate.repository.todo.RoleDo;
import com.mhd.user.domain.roleAggregate.service.RoleDomainService;
import com.mhd.user.domain.userAggregate.entity.DriverVehicleBind;
import com.mhd.user.domain.userAggregate.entity.UserRoleEntity;
import com.mhd.common.core.domain.po.UserRoleMenuPO;
import com.mhd.user.domain.userAggregate.repository.po.UserDriverEnterprisePo;
import com.mhd.user.domain.userAggregate.repository.po.UserDriverPo;
import com.mhd.user.domain.userAggregate.repository.todo.*;
import com.mhd.user.domain.userAggregate.repository.todo.UserDO;
import com.mhd.user.domain.motorcade.service.MotorcadeRecordDomainService;
import com.mhd.user.domain.userAggregate.service.*;
import com.mhd.user.infrastructure.feign.SpecialLogisticsFeign;
@@ -131,7 +133,55 @@ public class MotorcadeApplicationService {
public List<MotorcadePo> queryList(MotorcadeDO motorcadeDo) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null){
motorcadeDo.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
UserPo userPo = loginUser.getUserPo();
Long organizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 数据权限根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (organizationId != null && organizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
Long frontendOrganizationId = motorcadeDo.getOrganizationId();
if (frontendOrganizationId != null) {
// 前端传递了 organizationId使用前端传递的值进行过滤
motorcadeDo.setOrganizationId(frontendOrganizationId);
motorcadeDo.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
motorcadeDo.setOrganizationId(null);
motorcadeDo.setTopOrganizationId(null);
}
} else {
// 其他组织设置 organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织的数据
Long frontendOrganizationId = motorcadeDo.getOrganizationId();
if (frontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(organizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("车队列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, organizationId);
motorcadeDo.setOrganizationId(organizationId);
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
motorcadeDo.setOrganizationId(frontendOrganizationId);
}
if (topOrganizationId != null) {
motorcadeDo.setTopOrganizationId(topOrganizationId);
}
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
motorcadeDo.setOrganizationId(organizationId);
if (topOrganizationId != null) {
motorcadeDo.setTopOrganizationId(topOrganizationId);
}
}
}
log.info("车队列表查询 - 设置组织ID后,查询参数:organizationId={}, topOrganizationId={}",
motorcadeDo.getOrganizationId(), motorcadeDo.getTopOrganizationId());
}
return motorcadeDomainService.queryList(motorcadeDo);
}
@@ -656,16 +706,28 @@ public class MotorcadeApplicationService {
motorcadeDo.setMotorcadeHeaderName(userPo.getUserName());
motorcadeDo.setMotorcadeHeaderAccount(userPo.getUserAccount());
motorcadeDo.setOrganizationId(loginUser.getUserPo().getOrganizationId());
motorcadeDo.setOrganizationName(loginUser.getUserPo().getOrganizationName());
motorcadeDo.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
// 设置当前登录用户的组织信息
UserPo loginUserPo = loginUser.getUserPo();
if (loginUserPo != null) {
motorcadeDo.setOrganizationId(loginUserPo.getOrganizationId());
motorcadeDo.setOrganizationName(loginUserPo.getOrganizationName());
motorcadeDo.setTopOrganizationId(loginUserPo.getTopOrganizationId());
log.info("新增车队 - 设置当前登录用户的组织信息,组织ID: {}, 组织名称: {}, 顶级组织ID: {}",
loginUserPo.getOrganizationId(), loginUserPo.getOrganizationName(), loginUserPo.getTopOrganizationId());
} else {
log.warn("新增车队 - 当前登录用户信息为空,无法设置组织信息");
}
motorcadeDo.setMotorcadeStatus(2L);
//获取车队承运编码
motorcadeDo.setDriverEnterpriseCode(userPo.getUserAccount());
// 设置当前登录用户的创建信息
motorcadeDo.setCreateBy(loginUser.getUserid());
motorcadeDo.setCreateByName(loginUser.getUsername());
motorcadeDo.setCreateTime(DateUtil.date());
log.info("新增车队 - 设置创建人信息,创建人ID: {}, 创建人姓名: {}", loginUser.getUserid(), loginUser.getUsername());
motorcadeDomainService.insert(motorcadeDo);
MotorcadeDriver motorcadeDriver = new MotorcadeDriverAssembler().getEntity();
motorcadeDriver.setMotorcadeId(motorcadeDo.getMotorcadeId());
@@ -674,9 +736,210 @@ public class MotorcadeApplicationService {
if(!flag){
throw new ServiceException("新增车队失败");
}
// 新增车队时更新车队长的用户信息角色用户类型用户身份
updateCaptainUserInfo(motorcadeDo.getMotorcadeHeaderId(), loginUser);
// 新增车队时给车队长分配"车队长"角色
assignCaptainRoleToUser(motorcadeDo.getMotorcadeHeaderId(), loginUser);
return true;
}
/**
* 更新车队长的用户信息角色代码角色名称业务类型等
* @param captainUserId 车队长用户ID
* @param loginUser 当前登录用户
*/
private void updateCaptainUserInfo(Long captainUserId, LoginUser loginUser) {
if (captainUserId == null || loginUser == null || loginUser.getUserPo() == null) {
log.warn("更新用户信息失败 - 车队长用户ID或登录用户信息为空");
return;
}
log.info("新增车队 - 更新车队长的用户信息,车队长用户ID: {}", captainUserId);
try {
// 获取当前登录用户的角色信息用于设置车队长的角色
Long loginUserId = loginUser.getUserPo().getUserId();
List<UserRoleMenuPO> loginUserRoleList = userRoleDomainService.selectRolesByUserId(loginUserId);
String roleCode = RoleEnum.CAPTAIN.getCode();
String roleName = RoleEnum.CAPTAIN.getName();
// 从当前登录用户的角色中查找"车队长"角色获取角色名称
if (CollUtil.isNotEmpty(loginUserRoleList)) {
for (UserRoleMenuPO loginUserRole : loginUserRoleList) {
if (RoleEnum.CAPTAIN.getCode().equals(loginUserRole.getRoleCode())) {
roleCode = loginUserRole.getRoleCode();
roleName = loginUserRole.getRoleName();
log.info("从当前登录用户的角色中获取车队长角色信息 - 角色代码: {}, 角色名称: {}", roleCode, roleName);
break;
}
}
}
// 更新车队长的用户信息
UserDO userDO = new UserDO();
userDO.setUserId(captainUserId);
userDO.setRoleCode(roleCode);
userDO.setRoleName(roleName);
// 设置业务类型如果用户已经是司机则设置为司机&车队长3否则设置为车队长2
UserPo captainUserPo = userApplicationService.selectByUserId(captainUserId);
if (captainUserPo != null) {
Integer businessType = captainUserPo.getBusinessType();
// 业务类型1=客户2=司机3=司机&车队长4=客户&司机
if (businessType != null && businessType == 2) {
// 如果用户已经是司机设置为司机&车队长3
userDO.setBusinessType(3);
log.info("车队长用户业务类型设置为:司机&车队长(3),原业务类型:{}", businessType);
} else if (businessType != null && businessType == 4) {
// 如果用户是客户&司机设置为客户&司机&车队长保持为4或者可以设置为5如果有的话
// 这里暂时保持为4或者根据业务需求调整
userDO.setBusinessType(4);
log.info("车队长用户业务类型保持为:客户&司机(4),原业务类型:{}", businessType);
} else {
// 如果用户不是司机设置为车队长2
userDO.setBusinessType(2);
log.info("车队长用户业务类型设置为:车队长(2),原业务类型:{}", businessType);
}
} else {
// 如果查询不到用户信息默认设置为车队长2
userDO.setBusinessType(2);
log.warn("查询不到车队长用户信息,默认设置业务类型为:车队长(2)");
}
// 设置组织信息从当前登录用户获取
UserPo loginUserPo = loginUser.getUserPo();
if (loginUserPo != null) {
userDO.setOrganizationId(loginUserPo.getOrganizationId());
userDO.setOrganizationName(loginUserPo.getOrganizationName());
userDO.setTopOrganizationId(loginUserPo.getTopOrganizationId());
log.info("设置车队长的组织信息 - 组织ID: {}, 组织名称: {}, 顶级组织ID: {}",
loginUserPo.getOrganizationId(), loginUserPo.getOrganizationName(), loginUserPo.getTopOrganizationId());
}
// 更新用户信息
UserPo updateResult = userApplicationService.updateUser(userDO);
if (updateResult != null && updateResult.getUserId() != null) {
log.info("成功更新车队长的用户信息 - 用户ID: {}, 角色代码: {}, 角色名称: {}, 业务类型: {}, 组织ID: {}, 组织名称: {}",
captainUserId, roleCode, roleName, userDO.getBusinessType(),
userDO.getOrganizationId(), userDO.getOrganizationName());
} else {
log.warn("更新车队长的用户信息失败 - 更新结果为null,用户ID: {}, 请检查用户是否存在", captainUserId);
}
} catch (Exception e) {
log.error("更新车队长的用户信息失败 - 用户ID: {}, 错误信息: {}", captainUserId, e.getMessage(), e);
// 不抛出异常允许继续执行但记录详细错误信息
}
}
/**
* "车队长"角色分配给车队创建时的车队长用户
* 优先从当前登录用户的角色中获取"车队长"角色如果找不到再根据组织ID查询
* @param captainUserId 车队长用户ID
* @param loginUser 当前登录用户
*/
private void assignCaptainRoleToUser(Long captainUserId, LoginUser loginUser) {
if (captainUserId == null || loginUser == null || loginUser.getUserPo() == null) {
log.warn("分配角色失败 - 车队长用户ID或登录用户信息为空");
return;
}
log.info("新增车队 - 分配车队长角色,车队长用户ID: {}", captainUserId);
Long loginUserId = loginUser.getUserPo().getUserId();
Long organizationId = loginUser.getUserPo().getOrganizationId();
// 优先从当前登录用户的角色中查找"车队长"角色
List<UserRoleMenuPO> loginUserRoleList = userRoleDomainService.selectRolesByUserId(loginUserId);
RoleEntity roleEntity = null;
if (CollUtil.isNotEmpty(loginUserRoleList)) {
log.info("当前登录用户共有 {} 个角色,查找车队长角色", loginUserRoleList.size());
for (UserRoleMenuPO loginUserRole : loginUserRoleList) {
if (RoleEnum.CAPTAIN.getCode().equals(loginUserRole.getRoleCode())) {
// 找到"车队长"角色使用当前登录用户的角色ID
log.info("从当前登录用户的角色中找到车队长角色 - 角色ID: {}, 角色代码: {}", loginUserRole.getRoleId(), loginUserRole.getRoleCode());
roleEntity = new RoleEntity();
roleEntity.setRoleId(loginUserRole.getRoleId());
roleEntity.setRoleCode(loginUserRole.getRoleCode());
roleEntity.setRoleName(loginUserRole.getRoleName());
break;
}
}
}
// 如果当前登录用户没有"车队长"角色根据组织ID查询
if (ObjectUtil.isNull(roleEntity)) {
if (organizationId == null) {
log.warn("当前登录用户的组织ID为空,无法查询车队长角色");
return;
}
log.info("当前登录用户没有车队长角色,根据组织ID查询 - 组织ID: {}, 角色代码: {}", organizationId, RoleEnum.CAPTAIN.getCode());
// 查询"车队长"角色
RoleDo roleDo = new RoleDo();
roleDo.setRoleCode(RoleEnum.CAPTAIN.getCode());
roleDo.setOrganizationId(organizationId);
roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo);
// 如果当前组织查询不到尝试回退查询不检查 organization_name IS NOT NULL
if (ObjectUtil.isNull(roleEntity)) {
log.warn("使用 organization_name IS NOT NULL 条件查询不到角色,尝试回退查询(不检查 organization_name- 组织ID: {}, 角色代码: {}", organizationId, RoleEnum.CAPTAIN.getCode());
com.mhd.common.core.domain.po.RolePO rolePO = roleDomainService.selectByRoleCodeAndOrganizationId(RoleEnum.CAPTAIN.getCode(), organizationId);
if (ObjectUtil.isNotNull(rolePO)) {
// RolePO 转换为 RoleEntity
roleEntity = new RoleEntity();
roleEntity.setRoleId(rolePO.getRoleId());
roleEntity.setRoleCode(rolePO.getRoleCode());
roleEntity.setRoleName(rolePO.getRoleName());
roleEntity.setRoleRemark(rolePO.getRoleRemark());
roleEntity.setRoleDataScope(rolePO.getRoleDataScope());
roleEntity.setRoleStatus(rolePO.getRoleStatus());
roleEntity.setRoleType(rolePO.getRoleType());
roleEntity.setOrganizationId(rolePO.getOrganizationId());
roleEntity.setOrganizationName(rolePO.getOrganizationName());
roleEntity.setTopOrganizationId(rolePO.getTopOrganizationId());
log.info("回退查询成功找到角色 - 角色ID: {}, 角色名称: {}, 组织名称: {}", roleEntity.getRoleId(), roleEntity.getRoleName(), roleEntity.getOrganizationName());
}
}
// 如果还是查询不到尝试使用顶级组织ID查询
if (ObjectUtil.isNull(roleEntity)) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId.equals(organizationId)) {
log.info("当前组织查询不到角色,尝试使用顶级组织ID查询 - 顶级组织ID: {}, 角色代码: {}", topOrganizationId, RoleEnum.CAPTAIN.getCode());
roleDo.setOrganizationId(null);
roleDo.setTopOrganizationId(topOrganizationId);
roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo);
}
}
}
if (ObjectUtil.isNotNull(roleEntity)) {
log.info("找到车队长角色 - 角色ID: {}, 角色名称: {}", roleEntity.getRoleId(), roleEntity.getRoleName());
UserRoleDo userRoleDo = new UserRoleDo();
userRoleDo.setUserId(captainUserId);
userRoleDo.setRoleId(roleEntity.getRoleId());
// 判断是否已存在相应角色
List<UserRoleEntity> userRoleEntities = userRoleDomainService.selectList(userRoleDo);
if (CollUtil.isEmpty(userRoleEntities)) {
userRoleDomainService.addUserRole(userRoleDo);
log.info("成功分配车队长角色给用户 - 角色ID: {}, 角色名称: {}", roleEntity.getRoleId(), roleEntity.getRoleName());
} else {
log.info("用户已存在车队长角色,跳过 - 角色ID: {}", roleEntity.getRoleId());
}
} else {
log.warn("未找到车队长角色 - 组织ID: {}, 角色代码: {}, 请检查该组织下是否配置了该角色", organizationId, RoleEnum.CAPTAIN.getCode());
// 不抛出异常允许继续执行因为角色可能在其他地方分配
}
}
@Transactional
@NeedSetValueField
public Boolean editWeb(MotorcadeDO motorcadeDo) {
@@ -1166,7 +1429,29 @@ public class MotorcadeApplicationService {
return motorcadeDomainService.queryList(motorcadeDo);
}
public List<MotorcadePo> queryNonePagingList() {
return motorcadeDomainService.queryNonePagingList();
// 获取当前登录用户的组织信息用于数据权限过滤
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
UserPo userPo = loginUser.getUserPo();
Long organizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 数据权限根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (organizationId != null && organizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据传递 null 表示不限制
log.info("查询车队列表(不分页) - 南光组织,查询所有组织的数据");
return motorcadeDomainService.queryNonePagingList(null, null);
} else {
// 其他组织只能查询自己组织的数据
if (organizationId != null) {
log.info("查询车队列表(不分页) - 其他组织,查询组织ID: {}", organizationId);
return motorcadeDomainService.queryNonePagingList(organizationId, topOrganizationId);
}
}
}
log.warn("查询车队列表(不分页) - 未获取到登录用户信息或组织ID,返回空列表");
return new ArrayList<>();
}
}
@@ -146,6 +146,10 @@ public class OpenUserApplicationService {
userDriverDO.setUserId(userPo.getUserId());
userDriverDO.setDriverEnterpriseCode(openDriverDto.getDriverEnterpriseCode());
userDriverDO.setDataSources(openDriverDto.getDataSources());
// 设置组织信息
userDriverDO.setOrganizationId(sysTenantsPo.getOrganizationId());
userDriverDO.setTopOrganizationId(sysTenantsPo.getTopOrganizationId());
userDriverDO.setOrganizationName(sysTenantsPo.getOrganizationName());
userDriverDomainService.saveUserDriverByOpen(userDriverDO);
//处理车队数据
@@ -83,22 +83,78 @@ public class RoleApplicationService {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
UserPo userPo = loginUser.getUserPo();
// 先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = roleDo.getOrganizationId();
// 获取登录用户信息
Long loginUserOrganizationId = null;
Long topOrganizationId = null;
if (userPo != null) {
loginUserOrganizationId = userPo.getOrganizationId();
topOrganizationId = userPo.getTopOrganizationId();
}
if (userPo.getUserAccountType() != null && userPo.getUserAccountType() == 5){
roleDo.setCreateBy(userPo.getCreateBy());
}else {
UserDataPermissionQueryDTO userDataPermissionQueryDTO = new UserDataPermissionQueryDTO();
userDataPermissionQueryDTO.setPermissionMenuId(roleDo.getPermissionMenuId());
userDataPermissionQueryDTO = userDataPermissionApplicationService.getUserDataPermissionQueryDTO(userDataPermissionQueryDTO);
// 在复制属性之前先保存前端传递的 organizationId如果存在
// 因为 BeanUtils.copyProperties 可能会覆盖掉前端传递的值
Long savedFrontendOrganizationId = frontendOrganizationId;
BeanUtils.copyProperties(userDataPermissionQueryDTO, roleDo, IgnoreNullUtil.getNullPropertyNames(userDataPermissionQueryDTO));
UserPo loginUserPo = loginUser.getUserPo();
if (ObjectUtil.isNull(roleDo.getOrganizationId())) {
roleDo.setOrganizationId(loginUserPo.getOrganizationId());
// 重新获取前端传递的 organizationId优先使用前端传递的值
// 对于南光组织如果前端传递了 organizationId必须使用前端传递的值
Long currentFrontendOrganizationId = savedFrontendOrganizationId != null ? savedFrontendOrganizationId : roleDo.getOrganizationId();
// 数据权限查询权限根据 organizationId 来设置与其他模块保持一致
// organizationId等于2827时为南光组织查所有其他组织查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId包括2827使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (currentFrontendOrganizationId != null) {
// 前端传递了 organizationId包括2827或其他组织使用前端传递的值进行过滤
roleDo.setOrganizationId(currentFrontendOrganizationId);
roleDo.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
roleDo.setOrganizationId(null);
roleDo.setTopOrganizationId(null);
}
if (!Strings.isNullOrEmpty(loginUserPo.getRoleCode()) && RoleEnum.SUPER_ADMIN.getCode().equals(loginUserPo.getRoleCode())) {
//角色等级0-无状态1-内置角色2-组织角色
roleDo.setRoleGrade(1);
//roleDo.setRoleGrade(1);
} else {
//roleDo.setRoleGrade(2);
}
} else {
roleDo.setRoleGrade(2);
// 其他组织设置organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织的数据
if (currentFrontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!currentFrontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("角色查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
currentFrontendOrganizationId, loginUserOrganizationId);
roleDo.setOrganizationId(loginUserOrganizationId);
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
roleDo.setOrganizationId(currentFrontendOrganizationId);
}
roleDo.setTopOrganizationId(topOrganizationId);
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
roleDo.setOrganizationId(loginUserOrganizationId);
roleDo.setTopOrganizationId(topOrganizationId);
}
//roleDo.setRoleGrade(2);
}
}
return roleDomainService.selecRolePoList(roleDo);
@@ -144,8 +200,39 @@ public class RoleApplicationService {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
UserPo loginUserPo = loginUser.getUserPo();
if (ObjectUtil.isNull(roleDo.getOrganizationId())) {
roleDo.setOrganizationId(loginUserPo.getOrganizationId());
// 保存前端传递的 organizationId
Long frontendOrganizationId = roleDo.getOrganizationId();
Long loginUserOrganizationId = loginUserPo.getOrganizationId();
// 数据权限查询权限根据 organizationId 来设置与其他模块保持一致
// organizationId等于2827时为南光组织查所有其他组织查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId 且不等于 2827使用前端传递的值进行过滤
// 如果前端没有传递 organizationId 或传递的是 2827清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null && !frontendOrganizationId.equals(2827L)) {
// 前端传递了其他组织的 organizationId使用前端传递的值进行过滤
roleDo.setOrganizationId(frontendOrganizationId);
roleDo.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId 或传递的是 2827清空组织过滤条件查询所有组织的数据
roleDo.setOrganizationId(null);
roleDo.setTopOrganizationId(null);
}
} else {
// 其他组织设置organizationId只查询当前组织的数据
if (ObjectUtil.isNull(frontendOrganizationId)) {
roleDo.setOrganizationId(loginUserOrganizationId);
} else {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("角色查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
roleDo.setOrganizationId(loginUserOrganizationId);
}
}
}
return roleDomainService.selectList(roleDo);
}
@@ -226,10 +313,36 @@ public class RoleApplicationService {
}
UserPo loginUserPo = loginUser.getUserPo();
//校验组织ID是否存在
if(ObjectUtil.isNull(roleDo.getOrganizationId())){
roleDo.setOrganizationId(loginUserPo.getOrganizationId());
// 数据隔离校验组织ID和权限与其他模块保持一致
Long frontendOrganizationId = roleDo.getOrganizationId();
Long loginUserOrganizationId = loginUserPo.getOrganizationId();
Long topOrganizationId = loginUserPo.getTopOrganizationId();
// 判断是否为南光组织topOrganizationId == null 时为顶级组织南光组织
// 与其他模块保持一致VerificationApplicationServiceTmsReceiptApplicationService等
boolean isNanguangOrg = (topOrganizationId == null);
if (ObjectUtil.isNull(frontendOrganizationId)) {
// 如果前端没有传递 organizationId使用当前登录用户的组织ID
roleDo.setOrganizationId(loginUserOrganizationId);
} else {
// 如果前端传递了 organizationId需要进行数据权限校验
if (isNanguangOrg) {
// 南光组织可以为任何组织创建角色使用前端传递的 organizationId
roleDo.setOrganizationId(frontendOrganizationId);
log.info("南光组织创建角色 - 目标组织ID: {}", frontendOrganizationId);
} else {
// 其他组织只能为自己组织创建角色不能为其他组织创建角色
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
log.warn("非南光组织尝试为其他组织创建角色 - 登录用户组织ID: {}, 尝试创建的组织ID: {}",
loginUserOrganizationId, frontendOrganizationId);
throw new ServiceException("无权限为其他组织创建角色,只能为本组织创建角色");
}
// 使用当前登录用户的组织ID
roleDo.setOrganizationId(loginUserOrganizationId);
}
}
if (ObjectUtil.isNotNull(roleDo.getRoleId())) {
RolePO rolePO = roleDomainService.selectByRoleId(roleDo.getRoleId());
if (rolePO == null) {
@@ -254,7 +367,58 @@ public class RoleApplicationService {
if (roleEntity != null){
throw new ServiceException("角色编码重复");
}
roleDo.setOrganizationId(loginUser.getUserPo().getOrganizationId());
// 设置组织信息保留传入的 organizationId如果为 null 则使用当前登录用户的组织ID
// 注意不能强制覆盖传入的 organizationId否则会导致角色保存到错误的组织下
if (roleDo.getOrganizationId() == null) {
roleDo.setOrganizationId(loginUserPo.getOrganizationId());
roleDo.setOrganizationName(loginUserPo.getOrganizationName());
roleDo.setTopOrganizationId(loginUserPo.getTopOrganizationId());
} else {
// 如果传入了 organizationId需要根据该 organizationId 查询对应的 organizationName
// 如果 organizationName 为空尝试通过 Feign 查询组织信息
if (roleDo.getOrganizationName() == null || roleDo.getOrganizationName().isEmpty()) {
try {
AjaxResult orgInfo = organizationServiceFeign.getInfo(roleDo.getOrganizationId());
if (orgInfo != null && "200".equals(String.valueOf(orgInfo.get("code")))) {
JSONObject data = (JSONObject) orgInfo.get("data");
if (data != null && data.containsKey("organizationName")) {
roleDo.setOrganizationName(data.getString("organizationName"));
log.info("通过 ProductServiceFeign 获取到组织名称: {}", roleDo.getOrganizationName());
}
}
// 如果查询失败使用当前登录用户的组织名称作为默认值
if (roleDo.getOrganizationName() == null || roleDo.getOrganizationName().isEmpty()) {
roleDo.setOrganizationName(loginUserPo.getOrganizationName());
log.warn("无法通过 organizationId {} 获取组织名称,使用当前登录用户的组织名称作为默认值", roleDo.getOrganizationId());
}
} catch (Exception e) {
log.warn("通过 ProductServiceFeign 获取组织名称失败: {},使用当前登录用户的组织名称作为默认值", e.getMessage());
roleDo.setOrganizationName(loginUserPo.getOrganizationName());
}
}
// 如果 topOrganizationId 为空尝试从组织信息中获取否则使用当前登录用户的顶级组织ID
if (roleDo.getTopOrganizationId() == null) {
try {
AjaxResult orgInfo = organizationServiceFeign.getInfo(roleDo.getOrganizationId());
if (orgInfo != null && "200".equals(String.valueOf(orgInfo.get("code")))) {
JSONObject data = (JSONObject) orgInfo.get("data");
if (data != null && data.containsKey("topOrganizationId")) {
Object topOrgId = data.get("topOrganizationId");
if (topOrgId != null) {
roleDo.setTopOrganizationId(Long.parseLong(topOrgId.toString()));
}
}
}
// 如果查询失败使用当前登录用户的顶级组织ID作为默认值
if (roleDo.getTopOrganizationId() == null) {
roleDo.setTopOrganizationId(loginUserPo.getTopOrganizationId());
}
} catch (Exception e) {
log.warn("通过 ProductServiceFeign 获取顶级组织ID失败: {},使用当前登录用户的顶级组织ID作为默认值", e.getMessage());
roleDo.setTopOrganizationId(loginUserPo.getTopOrganizationId());
}
}
}
roleDo.setCreateBy(loginUserPo.getUserId());
roleDo.setCreateByName(loginUserPo.getUserName());
roleDo.setCreateTime(new Date());
@@ -263,6 +427,19 @@ public class RoleApplicationService {
roleDo.setUpdateTime(new Date());
//删除标记0-无状态1-正常2-已删除
roleDo.setDelFlag(1);
// 添加调试日志确认保存的角色信息
log.info("新增角色 - 组织ID: {}, 组织名称: {}, 角色代码: {}, 角色名称: {}, 顶级组织ID: {}",
roleDo.getOrganizationId(), roleDo.getOrganizationName(), roleDo.getRoleCode(),
roleDo.getRoleName(), roleDo.getTopOrganizationId());
// 确保 organizationName 不为空否则查询时会查不到
if (roleDo.getOrganizationName() == null || roleDo.getOrganizationName().isEmpty()) {
log.error("新增角色失败 - organizationName 为空!组织ID: {}, 角色代码: {}",
roleDo.getOrganizationId(), roleDo.getRoleCode());
throw new ServiceException("组织名称不能为空,请检查组织信息是否正确");
}
int i = roleDomainService.addRole(roleDo);
Long roleId = roleDo.getRoleId();
//复制之前角色的菜单
@@ -984,4 +1161,4 @@ public class RoleApplicationService {
public List<RolePO> getRoleListByUserId(Long userId) {
return roleDomainService.getRoleListByUserId(userId);
}
}
}
@@ -330,17 +330,82 @@ public class UserApplicationService {
* @Date 2023/1/12 14:58
*/
public List<UserPo> staffList(UserDO userDo) {
// 首先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = userDo.getOrganizationId();
//获取当前登陆人
LoginUser loginUser = SecurityUtils.getLoginUser();
UserPo userPo = loginUser.getUserPo();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
if (userPo.getRoleCode().contains(RoleEnum.PLAT_ADMIN.getCode()) && ObjectUtil.equal(userPo.getOrganizationId(),userPo.getTopOrganizationId())){
userDo.setTopOrganizationId(userPo.getTopOrganizationId());
}else {
userDo.setOrganizationId(userPo.getOrganizationId());
Long loginUserOrganizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 数据权限查询权限根据 organizationId 来设置
// organizationId 2827 时查询全部其他仅查询各自组织的信息
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId使用前端传递的值进行过滤包括2827
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId使用前端传递的值进行过滤
userDo.setOrganizationId(frontendOrganizationId);
userDo.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
// 但如果用户是平台管理员且 organizationId 等于 topOrganizationId使用 topOrganizationId
if (userPo.getRoleCode() != null && userPo.getRoleCode().contains(RoleEnum.PLAT_ADMIN.getCode())
&& ObjectUtil.equal(loginUserOrganizationId, topOrganizationId)) {
userDo.setTopOrganizationId(topOrganizationId);
userDo.setOrganizationId(null);
} else {
userDo.setOrganizationId(null);
userDo.setTopOrganizationId(null);
}
}
} else {
// 其他组织设置organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织包括南光的数据
// 如果其他组织尝试查询南光organizationId=2827的数据返回空数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (frontendOrganizationId.equals(2827L)) {
// 其他组织尝试查询南光的数据设置一个不存在的 organizationId返回空数据
userDo.setOrganizationId(-1L);
userDo.setTopOrganizationId(null);
} else if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
userDo.setOrganizationId(loginUserOrganizationId);
if (topOrganizationId != null) {
userDo.setTopOrganizationId(topOrganizationId);
}
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
userDo.setOrganizationId(frontendOrganizationId);
if (topOrganizationId != null) {
userDo.setTopOrganizationId(topOrganizationId);
}
}
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
// 如果用户是平台管理员且 organizationId 等于 topOrganizationId使用 topOrganizationId
if (userPo.getRoleCode() != null && userPo.getRoleCode().contains(RoleEnum.PLAT_ADMIN.getCode())
&& ObjectUtil.equal(loginUserOrganizationId, topOrganizationId)) {
userDo.setTopOrganizationId(topOrganizationId);
userDo.setOrganizationId(null);
} else {
if (loginUserOrganizationId != null) {
userDo.setOrganizationId(loginUserOrganizationId);
}
if (topOrganizationId != null) {
userDo.setTopOrganizationId(topOrganizationId);
}
}
}
}
return userDomainService.selectList(userDo);
}
@@ -1084,6 +1149,19 @@ public class UserApplicationService {
if (ObjectUtil.isNull(userDO.getOrganizationId())) {
userDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
} else {
// 如果前端传递了 organizationId根据 organizationId 查询组织信息获取正确的组织名称
AjaxResult orgInfoResult = productServiceFeign.getInfo(userDO.getOrganizationId());
String orgInfoCode = orgInfoResult.get("code").toString();
if ("200".equals(orgInfoCode)) {
Object orgData = orgInfoResult.get("data");
if (ObjectUtil.isNotNull(orgData)) {
OrganizationPo organizationPo = BeanUtil.toBean(orgData, OrganizationPo.class);
if (ObjectUtil.isNotNull(organizationPo)) {
userDO.setOrganizationName(organizationPo.getOrganizationName());
}
}
}
}
UserPo userPo = new UserPo();
//先根据组织ID获取一级组织
@@ -1151,7 +1229,15 @@ public class UserApplicationService {
}
BeanUtils.copyProperties(userEntity, userPo);
//同步网货平台员工信息
wlhyDomainService.addOrEditPlatformUser(userEntity);
try {
wlhyDomainService.addOrEditPlatformUser(userEntity);
} catch (Exception e) {
// 同步网货失败时记录日志但不影响用户保存
// 避免同步失败导致整个事务回滚用户数据无法保存
log.warn("同步网货平台员工信息失败,但不影响用户保存: {}", e.getMessage());
// 如果业务要求必须同步成功可以取消下面的注释让异常抛出
// throw e;
}
return userPo;
}
}
@@ -1249,7 +1335,12 @@ public class UserApplicationService {
}
BeanUtils.copyProperties(userEntity, userPo);
//同步网货平台员工信息
wlhyDomainService.addOrEditPlatformUser(userEntity);
try {
wlhyDomainService.addOrEditPlatformUser(userEntity);
} catch (Exception e) {
// 同步网货失败时记录日志但不影响用户保存
log.warn("同步网货平台员工信息失败,但不影响用户保存: {}", e.getMessage());
}
return userPo;
}
}
@@ -1342,7 +1433,12 @@ public class UserApplicationService {
}
BeanUtils.copyProperties(userEntity, userPo);
//同步网货平台员工信息
wlhyDomainService.addOrEditPlatformUser(userEntity);
try {
wlhyDomainService.addOrEditPlatformUser(userEntity);
} catch (Exception e) {
// 同步网货失败时记录日志但不影响用户保存
log.warn("同步网货平台员工信息失败,但不影响用户保存: {}", e.getMessage());
}
return userPo;
}
}
@@ -2042,6 +2138,7 @@ public class UserApplicationService {
VehiclePo vehiclePo = new VehiclePo();
sysUser.setUserid(userPo.getUserId());
sysUser.setUsername(userPo.getUserAccount());
sysUser.setRealname(userPo.getUserName());
UserDriverPo userDriverPo = userDriverDomainService.selectByUserId(userPo.getUserId());
if (ObjectUtil.isNull(userDriverPo)) {
userDriverPo = new UserDriverPo();
@@ -4822,12 +4919,25 @@ public class UserApplicationService {
if (Objects.isNull(loginUser)){
throw new ServiceException("当前用户不存在!");
}
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
Long filterOrganizationId = null;
Long userId = null;
if(loginUser.getUserPo().getBusinessType()==1||loginUser.getUserPo().getBusinessType()==3||loginUser.getUserPo().getUserAccountType()==5){
userId = loginUser.getUserid();
// 数据隔离根据 organizationId 字段来实现
// 如果当前登录用户的organizationId为2827可查询全部组织数据其他组织只能查询自己组织的数据
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织查询所有组织的数据不设置 organizationId userId 过滤条件
filterOrganizationId = null;
userId = null;
} else {
// 其他组织只查询自己组织的数据
filterOrganizationId = loginUserOrganizationId;
// 如果当前登录用户是货主或企业用户只查询当前登录用户的信息
if(loginUser.getUserPo().getBusinessType()==1||loginUser.getUserPo().getBusinessType()==3||loginUser.getUserPo().getUserAccountType()==5){
userId = loginUser.getUserid();
}
}
return userDomainService.findAllShipperInfo(userId,topOrganizationId);
return userDomainService.findAllShipperInfo(userId, filterOrganizationId);
}
private QueryAllShipperInfoVo convertToVo(UserEntity userEntity) {
@@ -44,6 +44,8 @@ import com.mhd.user.domain.roleAggregate.entity.RoleEntity;
import com.mhd.user.domain.roleAggregate.repository.todo.RoleDo;
import com.mhd.user.domain.roleAggregate.service.RoleDomainService;
import com.mhd.user.domain.userAggregate.entity.*;
import com.mhd.user.domain.userAggregate.repository.mapper.DriverVehicleBindMapper;
import com.mhd.user.domain.userAggregate.repository.mapper.UserMapper;
import com.mhd.user.domain.userAggregate.repository.po.*;
import com.mhd.user.domain.userAggregate.repository.po.UserDriverEnterprisePo;
import com.mhd.user.domain.userAggregate.repository.po.UserDriverPo;
@@ -178,6 +180,10 @@ public class UserDriverApplicationService {
private MotorcadeCollectionDomainService motorcadeCollectionDomainService;
@Resource
private VehicleBindingStrategyFactory vehicleBindingStrategyFactory;
@Autowired
private DriverVehicleBindMapper driverVehicleBindMapper;
@Autowired
private UserMapper userMapper;
/**
* @Description 承运人列表查询
@@ -323,6 +329,14 @@ public class UserDriverApplicationService {
LoginUser loginUser = SecurityUtils.getLoginUser();
Map<String, Object> result = new HashMap<>();
// 设置当前登录用户的组织信息
UserPo userPo = loginUser.getUserPo();
if (userPo != null) {
userDriverDO.setOrganizationId(userPo.getOrganizationId());
userDriverDO.setOrganizationName(userPo.getOrganizationName());
userDriverDO.setTopOrganizationId(userPo.getTopOrganizationId());
}
if(userDriverDO.getUserDriverType()==1&&StringUtils.isBlank(userDriverDO.getDepartmentId())){
throw new ServiceException("请维护司机部门信息");
}
@@ -344,6 +358,9 @@ public class UserDriverApplicationService {
if (ObjectUtil.isNull(userDriverDO.getUserId())) {
throw new ServiceException("用户ID未设置,无法继续司机认证流程");
}
// 新增承运人时使用当前登录账号的用户角色
assignLoginUserRolesToDriver(userDriverDO.getUserId(), loginUser);
// 新增的自有司机默认审核通过
if (userDriverDO.getUserDriverType().equals(UserDriverConstants.OWN_DIVER)){
@@ -580,6 +597,111 @@ public class UserDriverApplicationService {
}
}
/**
* "个人司机"角色分配给新创建的承运人用户
* 优先从当前登录用户的角色中获取"个人司机"角色如果找不到再根据组织ID查询
* @param driverUserId 承运人用户ID
* @param loginUser 当前登录用户
*/
private void assignLoginUserRolesToDriver(Long driverUserId, LoginUser loginUser) {
if (driverUserId == null || loginUser == null || loginUser.getUserPo() == null) {
log.warn("分配角色失败 - 承运人用户ID或登录用户信息为空");
return;
}
log.info("新增承运人 - 分配个人司机角色,承运人用户ID: {}", driverUserId);
Long loginUserId = loginUser.getUserPo().getUserId();
Long organizationId = loginUser.getUserPo().getOrganizationId();
// 优先从当前登录用户的角色中查找"个人司机"角色
List<UserRoleMenuPO> loginUserRoleList = userRoleDomainService.selectRolesByUserId(loginUserId);
RoleEntity roleEntity = null;
if (CollUtil.isNotEmpty(loginUserRoleList)) {
log.info("当前登录用户共有 {} 个角色,查找个人司机角色", loginUserRoleList.size());
for (UserRoleMenuPO loginUserRole : loginUserRoleList) {
if (RoleEnum.DRIVER.getCode().equals(loginUserRole.getRoleCode())) {
// 找到"个人司机"角色使用当前登录用户的角色ID
log.info("从当前登录用户的角色中找到个人司机角色 - 角色ID: {}, 角色代码: {}", loginUserRole.getRoleId(), loginUserRole.getRoleCode());
roleEntity = new RoleEntity();
roleEntity.setRoleId(loginUserRole.getRoleId());
roleEntity.setRoleCode(loginUserRole.getRoleCode());
roleEntity.setRoleName(loginUserRole.getRoleName());
break;
}
}
}
// 如果当前登录用户没有"个人司机"角色根据组织ID查询
if (ObjectUtil.isNull(roleEntity)) {
if (organizationId == null) {
log.warn("当前登录用户的组织ID为空,无法查询个人司机角色");
return;
}
log.info("当前登录用户没有个人司机角色,根据组织ID查询 - 组织ID: {}, 角色代码: {}", organizationId, RoleEnum.DRIVER.getCode());
// 查询"个人司机"角色
RoleDo roleDo = new RoleDo();
roleDo.setRoleCode(RoleEnum.DRIVER.getCode());
roleDo.setOrganizationId(organizationId);
roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo);
// 如果当前组织查询不到尝试回退查询不检查 organization_name IS NOT NULL
if (ObjectUtil.isNull(roleEntity)) {
log.warn("使用 organization_name IS NOT NULL 条件查询不到角色,尝试回退查询(不检查 organization_name- 组织ID: {}, 角色代码: {}", organizationId, RoleEnum.DRIVER.getCode());
com.mhd.common.core.domain.po.RolePO rolePO = roleDomainService.selectByRoleCodeAndOrganizationId(RoleEnum.DRIVER.getCode(), organizationId);
if (ObjectUtil.isNotNull(rolePO)) {
// RolePO 转换为 RoleEntity
roleEntity = new RoleEntity();
roleEntity.setRoleId(rolePO.getRoleId());
roleEntity.setRoleCode(rolePO.getRoleCode());
roleEntity.setRoleName(rolePO.getRoleName());
roleEntity.setRoleRemark(rolePO.getRoleRemark());
roleEntity.setRoleDataScope(rolePO.getRoleDataScope());
roleEntity.setRoleStatus(rolePO.getRoleStatus());
roleEntity.setRoleType(rolePO.getRoleType());
roleEntity.setOrganizationId(rolePO.getOrganizationId());
roleEntity.setOrganizationName(rolePO.getOrganizationName());
roleEntity.setTopOrganizationId(rolePO.getTopOrganizationId());
log.info("回退查询成功找到角色 - 角色ID: {}, 角色名称: {}, 组织名称: {}", roleEntity.getRoleId(), roleEntity.getRoleName(), roleEntity.getOrganizationName());
}
}
// 如果还是查询不到尝试使用顶级组织ID查询
if (ObjectUtil.isNull(roleEntity)) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId.equals(organizationId)) {
log.info("当前组织查询不到角色,尝试使用顶级组织ID查询 - 顶级组织ID: {}, 角色代码: {}", topOrganizationId, RoleEnum.DRIVER.getCode());
roleDo.setOrganizationId(null);
roleDo.setTopOrganizationId(topOrganizationId);
roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo);
}
}
}
if (ObjectUtil.isNotNull(roleEntity)) {
log.info("找到个人司机角色 - 角色ID: {}, 角色名称: {}", roleEntity.getRoleId(), roleEntity.getRoleName());
UserRoleDo userRoleDo = new UserRoleDo();
userRoleDo.setUserId(driverUserId);
userRoleDo.setRoleId(roleEntity.getRoleId());
// 判断是否已存在相应角色
List<UserRoleEntity> userRoleEntities = userRoleDomainService.selectList(userRoleDo);
if (CollUtil.isEmpty(userRoleEntities)) {
userRoleDomainService.addUserRole(userRoleDo);
log.info("成功分配个人司机角色给承运人用户 - 角色ID: {}, 角色名称: {}", roleEntity.getRoleId(), roleEntity.getRoleName());
} else {
log.info("承运人用户已存在个人司机角色,跳过 - 角色ID: {}", roleEntity.getRoleId());
}
} else {
log.warn("未找到个人司机角色 - 组织ID: {}, 角色代码: {}, 请检查该组织下是否配置了该角色", organizationId, RoleEnum.DRIVER.getCode());
// 不抛出异常允许继续执行因为角色可能在其他地方分配
}
}
/**
* 托运人待审核推送
*/
@@ -2052,6 +2174,42 @@ public class UserDriverApplicationService {
return mapList;
}
public List<Map<String, String>> userPersonalDriverAuthList() {
//获取当前登录人
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
UserDriverDO userDriverDO = new UserDriverDO();
//20240227 修改为查询用户关联的司机数据包括车队长承运企业
List<UserDriverPo> userDriverPos = userDriverDomainService.userPersonalDriverAuthList(userDriverDO);
List<Map<String, String>> mapList = new ArrayList<>();
if (CollUtil.isNotEmpty(userDriverPos)) {
for (UserDriverPo u : userDriverPos) {
Map<String, String> map = new HashMap<>();
map.put("userId", u.getUserId().toString());
StringBuilder str = new StringBuilder();
str.append(u.getUserName());
if (StrUtil.isNotEmpty(u.getUserPhone())) {
str.append(", ").append(u.getUserPhone());
}
if (StrUtil.isNotEmpty(u.getDriverEnterpriseName())) {
str.append("").append(u.getDriverEnterpriseName()).append("");
}
map.put("label", String.valueOf(str));
mapList.add(map);
}
}
return mapList;
}
/**
* 车队认证-车队长查询
*/
@@ -2718,5 +2876,20 @@ public class UserDriverApplicationService {
// }
return motorcade.getDriverEnterpriseCode();
}
public int bindVehicleForHome(UserDriverDO userDriverDO) {
DriverVehicleBind driverVehicleBind = new DriverVehicleBind();
driverVehicleBind.setUserId(userDriverDO.getUserId());
driverVehicleBind.setVehicleId(userDriverDO.getVehicleId());
driverVehicleBind.setDefaultFlag(1);
driverVehicleBind.setDelFlag(1);
driverVehicleBind.setDriverBindId(userDriverDO.getUserId());
UserPo userPo = userMapper.selectByUserId(userDriverDO.getUserId());
driverVehicleBind.setBindDriverName(userPo.getUserName());
driverVehicleBind.setBindDriverPhone(userPo.getUserPhone());
//向网货同步添加绑定关系
// wlhyDomainService.binding(driverVehicleBind);
return driverVehicleBindMapper.insert(driverVehicleBind);
}
}
@@ -750,6 +750,15 @@ public class UserDriverEnterpriseApplicationService {
public UserDriverEnterprisePo getEnterpriseByUserId(Long userId) {
return userDriverEnterpriseDomainService.getEnterpriseByUserId(userId);
}
/**
* 根据用户id查询用户企业信息
*
* @param userId
* @return
*/
public UserDriverEnterprisePo getEnterpriseByUserIds(Long userId) {
return userDriverEnterpriseDomainService.getEnterpriseByUserIds(userId);
}
/**
* @param driverEnterpriseCode
@@ -29,6 +29,7 @@ import com.mhd.system.api.service.webSocket.AsyncWebSocketApplicationService;
import com.mhd.user.domain.roleAggregate.entity.RoleEntity;
import com.mhd.user.domain.roleAggregate.repository.todo.RoleDo;
import com.mhd.user.domain.roleAggregate.service.RoleDomainService;
import com.mhd.common.core.domain.po.RolePO;
import com.mhd.user.domain.userAggregate.entity.UserRoleEntity;
import com.mhd.user.domain.userAggregate.entity.UserShipperEntity;
import com.mhd.user.domain.userAggregate.event.ShipperEventPublisher;
@@ -118,17 +119,85 @@ public class UserShipperApplicationService {
*/
@NeedSetValueMethod
public List<UserShipperPo> userShipperList(UserShipperDO userShipperDO) {
// userShipperDO.setTopOrganizationId(SecurityUtils.getLoginUser().getUserPo().getTopOrganizationId());
List<UserShipperPo> userShipperList=userShipperDomainService.userShipperList(userShipperDO);
for(UserShipperPo userShipperPo:userShipperList){
R<TmsShipper> tmsShipper=wlhyServiceFeign.queryBySzwlUserId(userShipperPo.getUserId());
// 获取登录人信息
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null || loginUser.getUserPo() == null) {
log.warn("托运人列表查询 - 未获取到登录用户信息,跳过数据权限过滤");
List<UserShipperPo> userShipperList = userShipperDomainService.userShipperList(userShipperDO);
return processShipperList(userShipperList);
}
UserPo userPo = loginUser.getUserPo();
// 先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = userShipperDO.getOrganizationId();
// 获取当前登录用户的组织信息
Long loginUserOrganizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 数据权限根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId使用前端传递的值进行过滤
userShipperDO.setOrganizationId(frontendOrganizationId);
userShipperDO.setTopOrganizationId(null);
log.info("托运人列表查询 - 南光组织查询指定组织:organizationId={}", frontendOrganizationId);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
userShipperDO.setOrganizationId(null);
userShipperDO.setTopOrganizationId(null);
log.info("托运人列表查询 - 南光组织查询所有组织:不设置组织过滤条件");
}
} else {
// 其他组织设置 organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("托运人列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
userShipperDO.setOrganizationId(loginUserOrganizationId);
} 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={}",
userShipperDO.getOrganizationId(), userShipperDO.getTopOrganizationId(), userShipperDO.getUserId());
List<UserShipperPo> userShipperList = userShipperDomainService.userShipperList(userShipperDO);
return processShipperList(userShipperList);
}
/**
* 处理托运人列表填充网货平台数据
*/
private List<UserShipperPo> processShipperList(List<UserShipperPo> userShipperList) {
for(UserShipperPo userShipperPo : userShipperList){
R<TmsShipper> tmsShipper = wlhyServiceFeign.queryBySzwlUserId(userShipperPo.getUserId());
if (tmsShipper.getCode() == R.SUCCESS) {
if(ObjectUtil.isNotNull(tmsShipper.getData())){
userShipperPo.setAuthorizedQuota(tmsShipper.getData().getCreditLine());
userShipperPo.setSettlementDay(tmsShipper.getData().getSettlementInterval());
userShipperPo.setAuthorizedUsedAmount(tmsShipper.getData().getUsedQuota());
}
}
}
return userShipperList;
@@ -154,6 +223,13 @@ public class UserShipperApplicationService {
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.USER_NULL);
}
// 设置当前登录用户的组织信息
UserPo userPo = loginUser.getUserPo();
if (userPo != null) {
userShipperDO.setOrganizationId(userPo.getOrganizationId());
userShipperDO.setOrganizationName(userPo.getOrganizationName());
userShipperDO.setTopOrganizationId(userPo.getTopOrganizationId());
}
// 2023年5月22日改动为个人认证和企业认证分开认证所以此处需要根据前端认证的角色给不同的字段赋值
if (userShipperDO.getShipperType() == null) {
throw new ServiceException("角色类型不能为空");
@@ -652,36 +728,41 @@ public class UserShipperApplicationService {
String roleCodes = null;
//实名认证通过此时赋值企业个人货主角色
if (userShipperDO.getShipperAuthStatus() == 3) {
RoleDo roleDo = new RoleDo();
if (userShipperDO.getAuthType() == 1) {
roleDo.setRoleCode(RoleEnum.SHIPPER.getCode());
} else if (userShipperDO.getAuthType() == 2) {
roleDo.setRoleCode(RoleEnum.COMPANY.getCode());
} else {
throw new ServiceException("角色未找到");
// 新增委托方时使用当前登录账号的用户角色
Long loginUserId = loginUser.getUserPo().getUserId();
log.info("新增委托方 - 使用当前登录用户的角色,登录用户ID: {}", loginUserId);
// 获取当前登录用户的所有角色
List<UserRoleMenuPO> loginUserRoleList = userRoleDomainService.selectRolesByUserId(loginUserId);
if (CollUtil.isEmpty(loginUserRoleList)) {
log.warn("当前登录用户没有角色,登录用户ID: {}", loginUserId);
throw new ServiceException("当前登录用户没有角色,无法分配给委托方");
}
roleDo.setOrganizationId(loginUser.getUserPo().getOrganizationId());
RoleEntity roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo);
if (ObjectUtil.isNotNull(roleEntity)) {
log.info("当前登录用户共有 {} 个角色", loginUserRoleList.size());
// 将当前登录用户的所有角色分配给新创建的委托方用户
for (UserRoleMenuPO loginUserRole : loginUserRoleList) {
UserRoleDo userRoleDo = new UserRoleDo();
userRoleDo.setUserId(userShipperDO.getUserId());
userRoleDo.setRoleId(roleEntity.getRoleId());
// userApplicationService.assignUserRoles(userRoleDo);
//判断是否已存在相应角色
userRoleDo.setRoleId(loginUserRole.getRoleId());
// 判断是否已存在相应角色
List<UserRoleEntity> userRoleEntities = userRoleDomainService.selectList(userRoleDo);
if (CollUtil.isEmpty(userRoleEntities)) {
userRoleDomainService.addUserRole(userRoleDo);
log.info("成功分配角色给委托方用户 - 角色ID: {}, 角色代码: {}", loginUserRole.getRoleId(), loginUserRole.getRoleCode());
} else {
log.info("委托方用户已存在该角色,跳过 - 角色ID: {}, 角色代码: {}", loginUserRole.getRoleId(), loginUserRole.getRoleCode());
}
} else {
throw new ServiceException("当前组织无相应角色");
}
//审核通过后调用用户开通钱包
AccountCashWalletDto accountCashWalletDto = new AccountCashWalletDto();
accountCashWalletDto.setUserId(userShipperPo.getUserId());
AjaxResult ajaxResult = financeServiceFeign.accountCashWalletSave(accountCashWalletDto);
if (null == ajaxResult || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
/*if (null == ajaxResult || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("开通钱包失败");
}
}*/
//审核通过此时重新更新网货中的角色code需要重新查询
List<UserRoleMenuPO> roleCodeList = userRoleDomainService.selectRolesByUserId(userShipperDO.getUserId());
@@ -773,7 +854,59 @@ public class UserShipperApplicationService {
*/
public Map<String, String> userShipperCount(UserShipperDO userShipperDO) {
Map<String, String> res = new HashMap<>();
// userShipperDO.setTopOrganizationId(SecurityUtils.getLoginUser().getUserPo().getTopOrganizationId());
// 获取登录人信息
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null || loginUser.getUserPo() == null) {
log.warn("托运人统计查询 - 未获取到登录用户信息,跳过数据权限过滤");
} else {
UserPo userPo = loginUser.getUserPo();
// 先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = userShipperDO.getOrganizationId();
// 获取当前登录用户的组织信息
Long loginUserOrganizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 数据权限根据 topOrganizationId 来设置查询权限与其他模块保持一致
// topOrganizationId null 为顶级组织南光组织查所有其他组织查自己
if (topOrganizationId == null) {
// 南光组织可以查询所有组织的数据
// 如果前端传递了 organizationId使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId使用前端传递的值进行过滤
userShipperDO.setOrganizationId(frontendOrganizationId);
userShipperDO.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
userShipperDO.setOrganizationId(null);
userShipperDO.setTopOrganizationId(null);
}
} else {
// 其他组织设置 organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("托运人统计查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
userShipperDO.setOrganizationId(loginUserOrganizationId);
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
userShipperDO.setOrganizationId(frontendOrganizationId);
}
userShipperDO.setTopOrganizationId(topOrganizationId);
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
userShipperDO.setOrganizationId(loginUserOrganizationId);
userShipperDO.setTopOrganizationId(topOrganizationId);
}
}
}
//先将所有托运人查询出来然后再进行
List<UserShipperPo> userShipperPoList = userShipperDomainService.userShipperAndRoleList(userShipperDO);
//托运人总数
@@ -71,5 +71,5 @@ public interface MotorcadeRepositoryInterface extends IService<Motorcade>
List<MotorcadePo> getAllOtherMotorcade(Long userId);
List<MotorcadePo> queryNonePagingList(Long organizationId);
List<MotorcadePo> queryNonePagingList(Long organizationId, Long topOrganizationId);
}
@@ -26,7 +26,7 @@ public interface MotorcadeMapper extends BaseMapper<Motorcade>
*/
public List<MotorcadePo> queryList(MotorcadeDO motorcadeDo);
List<MotorcadePo> queryNonePagingList(@Param("organizationId") Long organizationId);
List<MotorcadePo> queryNonePagingList(@Param("organizationId") Long organizationId, @Param("topOrganizationId") Long topOrganizationId);
/**
* 查询我加入的所以车队id
@@ -130,7 +130,7 @@ public class MotorcadeRepositoryImpl extends ServiceImpl<MotorcadeMapper, Motorc
}
@Override
public List<MotorcadePo> queryNonePagingList(Long organizationId) {
return motorcadeMapper.queryNonePagingList(organizationId);
public List<MotorcadePo> queryNonePagingList(Long organizationId, Long topOrganizationId) {
return motorcadeMapper.queryNonePagingList(organizationId, topOrganizationId);
}
}
@@ -182,11 +182,7 @@ public class MotorcadeDomainService {
}
public List<MotorcadePo> queryNonePagingList() {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null &&loginUser.getUserPo().getTopOrganizationId()!= null){
return motorcadeInterface.queryNonePagingList(loginUser.getUserPo().getTopOrganizationId());
}
return Collections.emptyList();
public List<MotorcadePo> queryNonePagingList(Long organizationId, Long topOrganizationId) {
return motorcadeInterface.queryNonePagingList(organizationId, topOrganizationId);
}
}
@@ -25,6 +25,10 @@ public class RoleEntity extends BaseVOEntity {
private Integer roleType;
@ApiModelProperty(name = "组织表ID")
private Long organizationId;
@ApiModelProperty(name = "组织名称")
private String organizationName;
@ApiModelProperty(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty(name = "职务/角色权限字符,控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)")
private String roleCode;
@ApiModelProperty(name = "职务/角色名称")
@@ -17,6 +17,10 @@ public class RoleDo extends BaseVOEntity implements Serializable {
private Long parentRoleId;
@ApiModelProperty(name = "组织表ID")
private Long organizationId;
@ApiModelProperty(name = "组织名称")
private String organizationName;
@ApiModelProperty(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty(name = "角色业务场景数据字典ID")
private Long roleBusinessExampleId;
@ApiModelProperty(name = "角色业务场景名称")
@@ -1,6 +1,7 @@
package com.mhd.user.domain.userAggregate.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -127,4 +128,25 @@ public class UserDriverEntity extends BaseVOEntity {
@ApiModelProperty(name = "tms推送状态: 1-未推送 2- 已推送")
private Integer tmsPushStatus;
@ApiModelProperty(name = "用户身份")
private Integer userIdentity;
/**
* 一级组织表ID
*/
@ApiModelProperty(name = "一级组织表ID")
private Long topOrganizationId;
/**
* 组织表ID
*/
@ApiModelProperty(name = "组织表ID")
private Long organizationId;
/**
* 组织名称
*/
@ApiModelProperty(name = "组织名称")
private String organizationName;
}
@@ -194,4 +194,16 @@ public class UserShipperEntity extends BaseVOEntity {
@ApiModelProperty(name = "客户nc编码")
private String customerNcCode;
@ApiModelProperty("结算币种")
private String settlementCurrency;
@ApiModelProperty(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty(name = "组织表ID")
private Long organizationId;
@ApiModelProperty(name = "组织名称")
private String organizationName;
}
@@ -26,6 +26,14 @@ public class UserDriverFactory {
String userName = loginUser.getUsername();
// 获取登录人id
Long userId = loginUser.getUserid();
// 设置组织信息如果 userDriverDO 中没有设置组织信息则使用当前登录用户的组织信息
if (userDriverEntity.getOrganizationId() == null && loginUser.getUserPo() != null) {
userDriverEntity.setOrganizationId(loginUser.getUserPo().getOrganizationId());
userDriverEntity.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
userDriverEntity.setOrganizationName(loginUser.getUserPo().getOrganizationName());
}
if(userDriverDO.getDriverId() != null){
if(userId != null){
userDriverEntity.setUpdateBy(userId);
@@ -54,6 +62,8 @@ public class UserDriverFactory {
public UserDriverEntity getUserDriverEntityByOpen(UserDriverDO userDriverDO) {
UserDriverEntity userDriverEntity = new UserDriverEntity();
BeanUtils.copyProperties(userDriverDO,userDriverEntity, IgnoreNullUtil.getNullPropertyNames(userDriverDO));
// 设置组织信息 userDriverDO 中复制如果为空则保持null开放接口可能由外部系统设置
if(userDriverDO.getDriverId() != null){
userDriverEntity.setUpdateBy(new Long("0"));
@@ -1,5 +1,6 @@
package com.mhd.user.domain.userAggregate.factory;
import cn.hutool.core.util.ObjectUtil;
import com.mhd.user.domain.userAggregate.entity.UserEntity;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.user.domain.userAggregate.repository.todo.UserDO;
@@ -20,6 +21,7 @@ public class UserFactory {
public UserEntity getUserEntity(UserDO userDO) {
UserEntity userEntity = new UserEntity();
BeanUtils.copyProperties(userDO,userEntity, IgnoreNullUtil.getNullPropertyNames(userDO));
userEntity.setDepartmentId(ObjectUtil.isNotEmpty(userDO.getDepartmentId())?Integer.valueOf(userDO.getDepartmentId()):null);
return userEntity;
}
public CheckDO getCheckDo(UserDO userDO) {
@@ -52,4 +52,6 @@ public interface UserDriverEnterpriseService extends IService<UserDriverEnterpri
List<UserDriverEnterprisePo> queryCaptainList(UserDriverEnterpriseDo userDriverEnterpriseDo);
UserDriverEnterprisePo getEnterpriseByUserId(Long userId);
UserDriverEnterprisePo getEnterpriseByUserIds(Long userId);
}
@@ -55,6 +55,8 @@ public interface UserDriverRepositoryInterface extends IService<UserDriverEntity
List<UserDriverPo> userDriverAuthList(UserDriverDO userDriverDO);
List<UserDriverPo> userPersonalDriverAuthList(UserDriverDO userDriverDO);
List<Map<String, Object>> motorcadeAuthCaptainList(Long organizationId);
List<UserDriverPo> getRegionDriverList(UserDriverDO userDriverDO);
@@ -69,7 +69,7 @@ public interface UserRepositoryInterface extends IService<UserEntity> {
UserEntity selectByTopOrganizationId(Long organizationId);
List<QueryAllShipperInfoVo> findAllShipperInfo(Long userId, Long topOrganizationId);
List<QueryAllShipperInfoVo> findAllShipperInfo(Long userId, Long organizationId);
String finShipperEnterpriseNamedByUserId(Long userId);
@@ -35,4 +35,6 @@ public interface UserDriverEnterpriseMapper extends BaseMapper<UserDriverEnterpr
List<UserDriverEnterprisePo> queryCaptainList(@Param("userDriverEnterpriseDo") UserDriverEnterpriseDo userDriverEnterpriseDo);
UserDriverEnterprisePo getEnterpriseByUserId(@Param("userId") Long userId);
UserDriverEnterprisePo getEnterpriseByUserIds(@Param("userId") Long userId);
}
@@ -54,6 +54,8 @@ public interface UserDriverMapper extends BaseMapper<UserDriverEntity> {
List<UserDriverPo> userDriverAuthList(UserDriverDO userDriverDO);
List<UserDriverPo> userPersonalDriverAuthList(UserDriverDO userDriverDO);
List<Map<String, Object>> motorcadeAuthCaptainList(Long organizationId);
List<UserDriverPo> getRegionDriverList(@Param("userDriverDO") UserDriverDO userDriverDO);
@@ -68,7 +68,7 @@ public interface UserMapper extends BaseMapper<UserEntity> {
UserEntity selectByTopOrganizationId(@Param("organizationId") Long organizationId);
List<QueryAllShipperInfoVo> findAllShipperInfo(@Param("userId") Long userId, @Param("topOrganizationId") Long topOrganizationId);
List<QueryAllShipperInfoVo> findAllShipperInfo(@Param("userId") Long userId, @Param("organizationId") Long organizationId);
String finShipperEnterpriseNamedByUserId(@Param("userId") Long userId);
@@ -111,4 +111,9 @@ public class UserDriverEnterpriseImpl extends ServiceImpl<UserDriverEnterpriseMa
public UserDriverEnterprisePo getEnterpriseByUserId(Long userId) {
return userDriverEnterpriseMapper.getEnterpriseByUserId(userId);
}
@Override
public UserDriverEnterprisePo getEnterpriseByUserIds(Long userId) {
return userDriverEnterpriseMapper.getEnterpriseByUserIds(userId);
}
}
@@ -183,6 +183,11 @@ public class UserDriverRepositoryImpl extends ServiceImpl<UserDriverMapper,UserD
return userDriverMapper.userDriverAuthList(userDriverDO);
}
@Override
public List<UserDriverPo> userPersonalDriverAuthList(UserDriverDO userDriverDO) {
return userDriverMapper.userPersonalDriverAuthList(userDriverDO);
}
@Override
public List<Map<String, Object>> motorcadeAuthCaptainList(Long organizationId) {
return userDriverMapper.motorcadeAuthCaptainList(organizationId);
@@ -160,8 +160,8 @@ public class UserRepositoryImpl extends ServiceImpl<UserMapper,UserEntity> imple
}
@Override
public List<QueryAllShipperInfoVo> findAllShipperInfo(Long userId, Long topOrganizationId) {
return userMapper.findAllShipperInfo(userId,topOrganizationId);
public List<QueryAllShipperInfoVo> findAllShipperInfo(Long userId, Long organizationId) {
return userMapper.findAllShipperInfo(userId, organizationId);
}
@Override
@@ -228,4 +228,13 @@ public class UserDriverPo extends BaseVOEntity {
@ApiModelProperty(name = "tms推送状态: 1-未推送 2- 已推送")
private Integer tmsPushStatus;
@ApiModelProperty(name = "用户身份")
private Integer userIdentity;
@ApiModelProperty(name = "经营许可证")
private String driverBusinessLicenseFrontUrl;
@ApiModelProperty(name = "经营许可证号")
private String driverBusinessLicenseNumber;
}
@@ -100,8 +100,12 @@ public class UserShipperPo implements Serializable {
@ApiModelProperty(name = "营业执照照片")
private String shipperEnterpriseLicenseFrontUrl = "";
@ApiModelProperty(name = "组织表ID")
private Long organizationId;
@ApiModelProperty(name = "组织名称")
private String organizationName = "";
private String organizationName;
// @ApiModelProperty(name = '一级组织表ID')
private Long topOrganizationId;
@ApiModelProperty(name = "创建者姓名")
private String createByName = "";
@@ -257,4 +261,7 @@ public class UserShipperPo implements Serializable {
@ApiModelProperty(name = "客户nc编码")
private String customerNcCode;
@ApiModelProperty("结算币种")
private String settlementCurrency;
}
@@ -283,4 +283,10 @@ public class UserDriverDO extends UserDO {
@ApiModelProperty(name = "车队名称")
private String motorcadeName;
@ApiModelProperty(name = "用户身份")
private Integer userIdentity;
@ApiModelProperty(name = "车辆主体")
private String vehicleBody;
}
@@ -228,4 +228,7 @@ public class UserShipperDO extends UserDO {
@ApiModelProperty(name = "客户nc编码")
private String customerNcCode;
@ApiModelProperty("结算币种")
private String settlementCurrency;
}
@@ -246,8 +246,8 @@ public class UserDomainService {
return userRepositoryInterface.selectByTopOrganizationId(organizationId);
}
public List<QueryAllShipperInfoVo> findAllShipperInfo(Long userId, Long topOrganizationId) {
return userRepositoryInterface.findAllShipperInfo(userId,topOrganizationId);
public List<QueryAllShipperInfoVo> findAllShipperInfo(Long userId, Long organizationId) {
return userRepositoryInterface.findAllShipperInfo(userId, organizationId);
}
public String findUserNameByUserId(Long userId){
@@ -92,13 +92,71 @@ public class UserDriverDomainService {
*/
// @DataPermissions(cacheName = "master")
public List<UserDriverListPo> userDriverList(UserDriverDO userDriverDO) {
// 首先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = userDriverDO.getOrganizationId();
//获取当前登陆人
LoginUser loginUser = SecurityUtils.getLoginUser();
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
if (loginUser.getUserPo().getBusinessType() == 2){
userDriverDO.setCreateBy(loginUser.getUserPo().getUserId());
userDriverDO.setOrganizationId(null);
// businessType == 2 如果前端没有传递 organizationId清空组织过滤条件
if (frontendOrganizationId == null) {
userDriverDO.setOrganizationId(null);
}
}
userDriverDO.setTopOrganizationId(loginUser.getUserPo().getOrganizationId());
// 数据权限查询权限根据 organizationId 来设置
// organizationId 2827 时查询全部其他仅查询各自组织的信息
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId使用前端传递的值进行过滤包括2827
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId使用前端传递的值进行过滤
userDriverDO.setOrganizationId(frontendOrganizationId);
userDriverDO.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
userDriverDO.setOrganizationId(null);
userDriverDO.setTopOrganizationId(null);
}
} else {
// 其他组织设置organizationId只查询当前组织的数据
// 其他组织只能查询自己组织的数据不能查询其他组织包括南光的数据
// 如果其他组织尝试查询南光organizationId=2827的数据返回空数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (frontendOrganizationId.equals(2827L)) {
// 其他组织尝试查询南光的数据设置一个不存在的 organizationId返回空数据
userDriverDO.setOrganizationId(-1L);
userDriverDO.setTopOrganizationId(null);
} else if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
userDriverDO.setOrganizationId(loginUserOrganizationId);
if (topOrganizationId != null) {
userDriverDO.setTopOrganizationId(topOrganizationId);
}
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
userDriverDO.setOrganizationId(frontendOrganizationId);
if (topOrganizationId != null) {
userDriverDO.setTopOrganizationId(topOrganizationId);
}
}
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
if (loginUserOrganizationId != null) {
userDriverDO.setOrganizationId(loginUserOrganizationId);
}
if (topOrganizationId != null) {
userDriverDO.setTopOrganizationId(topOrganizationId);
}
}
}
return userDriverRepositoryInterface.userDriverList(userDriverDO);
}
@@ -187,6 +245,11 @@ public class UserDriverDomainService {
return userDriverRepositoryInterface.userDriverAuthList(userDriverDO);
}
@DataPermissions(cacheName = "master")
public List<UserDriverPo> userPersonalDriverAuthList(UserDriverDO userDriverDO) {
return userDriverRepositoryInterface.userPersonalDriverAuthList(userDriverDO);
}
public List<Map<String, Object>> motorcadeAuthCaptainList(Long organizationId) {
return userDriverRepositoryInterface.motorcadeAuthCaptainList(organizationId);
}
@@ -154,4 +154,8 @@ public class UserDriverEnterpriseDomainService {
.eq(UserDriverEnterprise::getUserId, userId)
.update();
}
public UserDriverEnterprisePo getEnterpriseByUserIds(Long userId) {
return userDriverEnterpriseService.getEnterpriseByUserIds(userId);
}
}
@@ -49,10 +49,19 @@ public class UserShipperDomainService {
// @DataPermissions(cacheName = "master")
public List<UserShipperPo> userShipperList(UserShipperDO userShipperDO) {
// 数据权限逻辑已在 UserShipperApplicationService.userShipperList 中处理
// 这里不再重复处理数据权限直接使用传入的参数进行查询
//获取当前登陆人
LoginUser loginUser = SecurityUtils.getLoginUser();
userShipperDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
if(loginUser.getUserPo().getBusinessType()==1||loginUser.getUserPo().getBusinessType()==3||loginUser.getUserPo().getUserAccountType()==5){
// 如果 organizationId topOrganizationId 都为 null表示查询所有组织的数据南光组织查询全部
// 此时不应该设置 userId 过滤条件否则会限制查询结果
boolean isQueryAllOrganizations = (userShipperDO.getOrganizationId() == null && userShipperDO.getTopOrganizationId() == null);
if(loginUser != null && loginUser.getUserPo() != null &&
(loginUser.getUserPo().getBusinessType()==1||loginUser.getUserPo().getBusinessType()==3||loginUser.getUserPo().getUserAccountType()==5) &&
!isQueryAllOrganizations) {
// 只有在不是查询所有组织的情况下才设置 userId 过滤条件
userShipperDO.setUserId(loginUser.getUserid());
}
return userShipperRepositoryInterface.selectList(userShipperDO);
@@ -278,9 +278,17 @@ public class UserWlhyDomainService {
tmsShipperDTO.setIdCardEndDate(idCardEndDate);
Date idCardStartDate = DateUtil.parse(userPo.getUserIdcardDateFrom());
tmsShipperDTO.setIdCardStartDate(idCardStartDate);
tmsShipperDTO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
tmsShipperDTO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
tmsShipperDTO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
// 优先使用 userShipperEntity 对象中保存的组织信息确保与数据库中的组织ID一致
// 如果 userShipperEntity 中没有组织信息则使用当前登录用户的组织信息作为后备
if (userShipperEntity.getOrganizationId() != null) {
tmsShipperDTO.setOrganizationId(userShipperEntity.getOrganizationId());
tmsShipperDTO.setOrganizationName(userShipperEntity.getOrganizationName());
tmsShipperDTO.setTopOrganizationId(userShipperEntity.getTopOrganizationId());
} else if (loginUser.getUserPo() != null) {
tmsShipperDTO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
tmsShipperDTO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
tmsShipperDTO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
}
tmsShipperDTO.setCompanyName(userShipperEntity.getShipperEnterpriseName());
return tmsShipperDTO;
}
@@ -640,9 +648,17 @@ public class UserWlhyDomainService {
TmsDriverAddOrUpdateDTO tmsDriverAddOrUpdateDTO = new TmsDriverAddOrUpdateDTO();
tmsDriverAddOrUpdateDTO.setAddress(userPo.getUserAreaAddress());
tmsDriverAddOrUpdateDTO.setRegisteredAddress(userPo.getUserAreaAddress());
tmsDriverAddOrUpdateDTO.setTopOrganizationId(userPo.getTopOrganizationId());
tmsDriverAddOrUpdateDTO.setOrganizationId(userPo.getOrganizationId());
tmsDriverAddOrUpdateDTO.setOrganizationName(userPo.getOrganizationName());
// 优先使用 userDriverDO 对象中保存的组织信息确保与数据库中的组织ID一致
// 如果 userDriverDO 中没有组织信息则使用 userPo 中的组织信息作为后备
if (userDriverDO.getOrganizationId() != null) {
tmsDriverAddOrUpdateDTO.setTopOrganizationId(userDriverDO.getTopOrganizationId());
tmsDriverAddOrUpdateDTO.setOrganizationId(userDriverDO.getOrganizationId());
tmsDriverAddOrUpdateDTO.setOrganizationName(userDriverDO.getOrganizationName());
} else if (userPo != null) {
tmsDriverAddOrUpdateDTO.setTopOrganizationId(userPo.getTopOrganizationId());
tmsDriverAddOrUpdateDTO.setOrganizationId(userPo.getOrganizationId());
tmsDriverAddOrUpdateDTO.setOrganizationName(userPo.getOrganizationName());
}
tmsDriverAddOrUpdateDTO.setSzwlUserId(userDriverDO.getUserId());
Integer type = userDriverDO.getDriverType() != 1 ? 1 : 0;
tmsDriverAddOrUpdateDTO.setType(type);
@@ -308,4 +308,10 @@ public class UserDriverDTO extends UserDTO {
@ApiModelProperty(name = "部门id")
private String departmentId;
@ApiModelProperty(name = "用户身份")
private Integer userIdentity;
@ApiModelProperty(name = "车辆主体")
private String vehicleBody;
}
@@ -194,4 +194,7 @@ public class UserShipperDTO extends UserDTO {
@ApiModelProperty("客户nc编码")
private String customerNcCode;
@ApiModelProperty("结算币种")
private String settlementCurrency;
}
@@ -8,6 +8,7 @@ import com.mhd.common.log.enums.BusinessType;
import com.mhd.user.application.service.*;
import com.mhd.user.domain.userAggregate.entity.DriverExcel;
import com.mhd.user.domain.userAggregate.repository.po.DriverVehicleBindPo;
import com.mhd.user.domain.userAggregate.repository.po.UserDriverEnterprisePo;
import com.mhd.user.domain.userAggregate.repository.todo.*;
import com.mhd.user.interfaces.assember.*;
import com.mhd.user.interfaces.dto.DriverExcelDto;
@@ -128,7 +129,20 @@ public class UserDriverAPI extends BaseController {
UserDriverDO userDriverDO = userDriverAssember.toUserDriverDO(userDriverDTO);
return toAjax(userDriverApplicationService.bindVehicle(userDriverDO));
}
@Log(title = "承运人管理-绑定车辆", description ="绑定车辆",businessType = BusinessType.UPDATE)
@ApiOperation("绑定车辆")
@PostMapping("/bindVehicleForHome")
public AjaxResult bindVehicleForHome(@RequestBody UserDriverDTO userDriverDTO){
UserDriverDO userDriverDO = userDriverAssember.toUserDriverDO(userDriverDTO);
return toAjax(userDriverApplicationService.bindVehicleForHome(userDriverDO));
}
@ApiOperation("删除司机绑定关系")
@PostMapping("/driverVehicleBindApi/delectDriverBind")
public AjaxResult delectDriverBind(@RequestBody UserDriverDTO userDriverDTO) {
return toAjax(driverVehicleBindApplicationService.delectDriverBind(userDriverDTO));
}
@Log(title = "承运人管理-个体承运人新增绑定车辆", description ="个体承运人新增绑定车辆",businessType = BusinessType.UPDATE)
@ApiOperation("个体承运人新增绑定车辆")
@PostMapping("/bindVehicle1")
@@ -246,6 +260,17 @@ public class UserDriverAPI extends BaseController {
return AjaxResult.success(userDriverApplicationService.userDriverAuthList());
}
/**
* 车辆认证-承运人查询(个人司机)
* @return
*/
@Log(title = "承运人管理-查询", description ="车辆认证-承运人查询(个人司机)",businessType = BusinessType.INQUIRE)
@ApiOperation("车辆认证-承运人查询(个人司机)")
@GetMapping("/userPersonalDriverAuthList")
public AjaxResult userPersonalDriverAuthList() {
return AjaxResult.success(userDriverApplicationService.userPersonalDriverAuthList());
}
/**
* 车辆导入-承运人查询
* @return
@@ -303,6 +328,12 @@ public class UserDriverAPI extends BaseController {
return AjaxResult.success(userDriverEnterpriseApplicationService.getEnterpriseByUserId(userId));
}
@ApiOperation("根据用户id查询企业信息(返回值不同)")
@GetMapping("/getEnterpriseByUserIds")
public UserDriverEnterprisePo getEnterpriseByUserIds(@RequestParam("userId") Long userId) {
return userDriverEnterpriseApplicationService.getEnterpriseByUserIds(userId);
}
/**
* 获取司机校验相应值
*/
@@ -58,4 +58,18 @@ public class QueryAllShipperInfoVo {
@ApiModelProperty("是否有默认地址")
private Boolean hasDefaultAddress;
}
@ApiModelProperty("用户nc")
private String documentPreparerNcCode;
@ApiModelProperty(name = "客户nc编码")
private String customerNcCode;
@ApiModelProperty(name = "组织ID")
private Long organizationId;
@ApiModelProperty(name = "一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("结算币种")
private String settlementCurrency;
}
@@ -20,15 +20,17 @@ spring:
discovery:
# server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号
# server-addr: 10.33.0.129:6010
#线上正式环境
server-addr: 10.102.192.105:6848
# server-addr: 10.33.0.129:6010
server-addr: 10.102.192.5:6848
username: nacos
password: manhuoda@2023
config:
# server-addr: 127.0.0.1:8848
# 线上测试环境配置 容器名+端口号
# server-addr: 10.33.0.129:6010
#线上正式环境
server-addr: 10.102.192.105:6848
# server-addr: 10.33.0.129:6010
server-addr: 10.102.192.5:6848
username: nacos
password: manhuoda@2023
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
file-extension: yml #默认properties
# 共享配置
@@ -40,4 +42,4 @@ spring:
max-request-size: 50MB
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
@@ -209,8 +209,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="organizationName != null and organizationName != ''">
and m.organization_name like concat('%', #{organizationName}, '%')
</if>
<if test="topOrganizationId != null and topOrganizationId != ''">
and top_organization_id = #{topOrganizationId}
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
<if test="organizationId != null">
<!-- 如果设置了 organizationId,添加 organization_id 条件 -->
and m.organization_id = #{organizationId}
and m.organization_name IS NOT NULL
</if>
<if test="topOrganizationId != null">
<!-- 如果设置了 topOrganizationId,添加 top_organization_id 条件 -->
and m.top_organization_id = #{topOrganizationId}
<if test="organizationId == null">
<!-- 如果没有设置 organizationId,添加 organization_name IS NOT NULL 条件 -->
and m.organization_name IS NOT NULL
</if>
</if>
<if test="organizationIdList != null ">
AND m.organization_id in
@@ -377,7 +388,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN
motorcade_driver d
ON m.motorcade_id = d.motorcade_id and d.del_flag = 1
where top_organization_id = #{organizationId} and m.del_flag = 1
<where>
m.del_flag = 1
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
<if test="organizationId != null">
<!-- 如果设置了 organizationId,添加 organization_id 条件 -->
and m.organization_id = #{organizationId}
and m.organization_name IS NOT NULL
</if>
<if test="topOrganizationId != null">
<!-- 如果设置了 topOrganizationId,添加 top_organization_id 条件 -->
and m.top_organization_id = #{topOrganizationId}
<if test="organizationId == null">
<!-- 如果没有设置 organizationId,添加 organization_name IS NOT NULL 条件 -->
and m.organization_name IS NOT NULL
</if>
</if>
</where>
</select>
</mapper>
@@ -25,6 +25,8 @@
a.role_id,
a.parent_role_id,
a.organization_id,
a.organization_name AS organizationName,
a.top_organization_id AS topOrganizationId,
a.role_code,
a.role_name,
a.role_remark,
@@ -51,6 +53,7 @@
a.del_flag = 1
<include refid="common_where"></include>
GROUP BY a.role_id
ORDER BY COALESCE(a.update_time, a.create_time) DESC
</select>
<select id="selectByOrganizationIdAndRoleCode"
parameterType="com.mhd.user.domain.roleAggregate.repository.todo.RoleDo"
@@ -119,6 +122,16 @@
</if>
<if test="organizationId !=null">
and a.organization_id = #{organizationId}
and a.organization_name IS NOT NULL
</if>
<if test="topOrganizationId !=null">
and a.top_organization_id = #{topOrganizationId}
<if test="organizationId == null">
and a.organization_name IS NOT NULL
</if>
</if>
<if test="organizationName != null and organizationName != ''">
and a.organization_name like concat('%' , #{organizationName} , '%')
</if>
<if test="organizationIds !=null">
and a.organization_id in
@@ -106,4 +106,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND a.user_id = #{userId}
</select>
<select id="getEnterpriseByUserIds" resultType="com.mhd.user.domain.userAggregate.repository.po.UserDriverEnterprisePo" parameterType="java.lang.Long">
SELECT
a.*
FROM
user_driver_enterprise a
WHERE
a.del_flag = 1
AND a.driver_type = 2
AND a.user_id = #{userId}
</select>
</mapper>
@@ -120,6 +120,7 @@
a.driver_work_license_front_url,
a.work_certificate_back_img_url,
b.create_time,
a.user_identity,
b.create_by,
b.create_by_name,
b.update_time,
@@ -186,6 +187,7 @@
ude.driver_corp_idcard_number,
r.roleName,
dvb.vehicle_id,
wlhydriver.id as wlhydriverId,
WM_CONCAT(DISTINCT dvb.vehicle_license_plate_number ) AS vehicleLicensePlateNumber,
WM_CONCAT(DISTINCT m.motorcade_name ) AS driverTeamName
FROM
@@ -205,6 +207,8 @@
user_id
) r ON r.user_id = b.user_id
LEFT JOIN user_driver a ON a.user_id = b.user_id
LEFT JOIN NGWL_TEST_WLHY.sys_user wlhyuser ON wlhyuser.szwl_user_id = b.user_id
LEFT JOIN NGWL_TEST_WLHY.tms_driver wlhydriver ON wlhydriver.driver_id = wlhyuser.id
LEFT JOIN user_driver_enterprise ude ON b.user_id = ude.user_id
AND ude.driver_type = 1
LEFT JOIN user_driver_enterprise ud ON b.user_id = ud.user_id
@@ -228,6 +232,7 @@
<sql id="selectUserDriverVo2">
SELECT a.driver_id,
a.user_driver_type,
a.driver_allow_driving_type_id,
a.driver_allow_driving_type_name,
a.driver_certification_authority,
@@ -262,6 +267,7 @@
a.driver_fill_auth_id,
a.driver_fill_auth_name,
a.driver_fill_auth_remark,
a.user_identity,
b.user_id,
b.top_organization_id,
b.organization_id,
@@ -300,11 +306,13 @@
ude.driver_corp_legal_name,
ude.driver_corp_name,
ude.driver_corp_idcard_number,
ude.driver_business_license_front_url,
ude.driver_business_license_number,
WM_CONCAT(dvb.vehicle_license_plate_number) AS vehicleLicensePlateNumber,
WM_CONCAT(m.motorcade_name) AS driverTeamName,
md.motorcade_id motorcade_header_id
FROM "USER" b
LEFT JOIN user_driver a ON a.user_id = b.user_id AND b.del_flag = 1
LEFT JOIN user_driver a ON a.user_id = b.user_id AND a.del_flag = 1
LEFT JOIN user_driver_enterprise ude ON a.user_id = ude.user_id AND ude.del_flag = 1
LEFT JOIN driver_vehicle_bind dvb ON a.user_id = dvb.user_id AND dvb.del_flag = 1
LEFT JOIN motorcade m ON a.driver_id = m.motorcade_header_id AND m.del_flag = 1
@@ -602,6 +610,9 @@
<if test="userDriverDO.userDriverType != null">
and a.user_driver_type = #{userDriverDO.userDriverType}
</if>
<if test="userDriverDO.userIdentity != null">
and a.user_identity = #{userDriverDO.userIdentity}
</if>
/*准驾车型id*/
<if test="userDriverDO.driverAllowDrivingTypeId != null and userDriverDO.driverAllowDrivingTypeId != ''">
and a.driver_allow_driving_type_id = #{userDriverDO.driverAllowDrivingTypeId}
@@ -692,7 +703,10 @@
<!-- </foreach>-->
<!-- </if>-->
<if test="userDriverDO.organizationId != null"> and b.organization_id = #{userDriverDO.organizationId}</if>
<if test="userDriverDO.organizationId != null">
and b.organization_id = #{userDriverDO.organizationId}
and b.organization_name IS NOT NULL
</if>
<if test="userDriverDO.createBy != null">
and (b.create_by = #{userDriverDO.createBy}
or b.user_id = #{userDriverDO.createBy}
@@ -973,6 +987,37 @@
</if>
</select>
<select id="userPersonalDriverAuthList" resultType="com.mhd.user.domain.userAggregate.repository.po.UserDriverPo">
select ud.driver_id,
u.user_id,
u.user_name,
u.user_phone,
u.user_account,
ude.user_driver_enterprise_id,
ude.driver_enterprise_name
from "USER" u
left join user_driver ud on ud.user_id = u.user_id and u.del_flag = 1
left join user_driver_enterprise ude
on u.user_id = ude.user_id and ude.del_flag = 1
where u.del_flag = 1 and u.role_code = 'driver'
<if test="createBy != null"> and u.create_by = #{createBy}</if>
<if test="createBy != null and organizationIdList == null">
and u.create_by = #{createBy}</if>
<if test="organizationIdList != null and createBy == null">
AND u.organization_id in
<foreach item="id" collection="organizationIdList" open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="organizationIdList != null and createBy != null">
AND (u.organization_id in
<foreach item="id" collection="organizationIdList" open="(" separator="," close=")">
#{id}
</foreach>
OR u.create_by = #{createBy})
</if>
</select>
<select id="motorcadeAuthCaptainList" resultType="java.util.HashMap">
select u.user_id userId,
u.top_organization_id topOrganizationId,
@@ -70,7 +70,7 @@
a.department_id,
a.ding_user_id,
a.ding_dept_id,
a.validity_period_management
a.validity_period_management,a.salesperson_nc_code,a.document_preparer_nc_code
FROM "USER" a
where a.del_flag = 1
</sql>
@@ -96,7 +96,7 @@
FROM
user_shipper s
LEFT JOIN
"user" u
"USER" u
ON u.user_id = s.user_id
<where>
<if test="topOrganizationId != null "> and u.top_organization_id = #{topOrganizationId}</if>
@@ -117,7 +117,7 @@
FROM
user_shipper s
LEFT JOIN
"user" u
"USER" u
ON u.user_id = s.user_id and u.del_flag = 1
<where>
s.del_flag = 1 and s.shipper_fill = 3
@@ -217,11 +217,19 @@
and a.user_id = #{userId}
</if>
<if test="organizationId !=null">
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
<if test="organizationId != null">
<!-- 如果设置了 organizationId,添加 organization_id 条件 -->
and a.organization_id = #{organizationId}
and a.organization_name IS NOT NULL
</if>
<if test="topOrganizationId !=null">
<if test="topOrganizationId != null">
<!-- 如果设置了 topOrganizationId,添加 top_organization_id 条件 -->
and a.top_organization_id = #{topOrganizationId}
<if test="organizationId == null">
<!-- 如果没有设置 organizationId,添加 organization_name IS NOT NULL 条件 -->
and a.organization_name IS NOT NULL
</if>
</if>
/*组织名称*/
<if test="organizationName != null and organizationName != ''">
@@ -411,7 +419,7 @@
a.user_account,
a.avatar
FROM
"user" a
"USER" a
WHERE
a.del_flag = 1
<include refid="common_where1"></include>
@@ -658,7 +666,7 @@
us.shipper_enterprise_name,
us.shipper_type
FROM
"user" u
"USER" u
LEFT JOIN user_shipper us ON u.user_id = us.user_id
WHERE
u.del_flag = 1
@@ -676,7 +684,7 @@
ude.driver_enterprise_name,
ude.driver_type
FROM
"user" u
"USER" u
LEFT JOIN user_driver_enterprise ude ON u.user_id = ude.user_id
WHERE
u.del_flag = 1
@@ -700,7 +708,7 @@
a.user_account,
a.avatar
FROM
"user" a
"USER" a
WHERE
a.del_flag = 1
and a.top_organization_id = #{topOrganizationId}
@@ -708,7 +716,8 @@
</select>
<select id="findAllShipperInfo" resultType="com.mhd.user.interfaces.vo.QueryAllShipperInfoVo">
SELECT u.user_id, u.user_name, u.user_area_address, u.user_area_county_id, u.user_area_name ,u.user_phone,u.has_default_address,b.shipper_id,b.shipper_enterprise_name
SELECT u.user_id, u.user_name, u.user_area_address, u.user_area_county_id, u.user_area_name ,u.user_phone,u.has_default_address,b.shipper_id,b.shipper_enterprise_name,u.DOCUMENT_PREPARER_NC_CODE,b.CUSTOMER_NC_CODE,u.organization_id AS organizationId,u.top_organization_id AS topOrganizationId,
b.settlement_currency AS settlementCurrency
FROM "USER" u
LEFT JOIN user_shipper b ON u.user_id = b.user_id
left join (select user_id, LISTAGG(r.role_name, '&amp;') WITHIN GROUP(ORDER BY r.role_name) AS roleName
@@ -723,11 +732,12 @@
<if test="userId !=null">
AND u.user_Id = #{userId}
</if>
/*一级组织ID*/
<if test="topOrganizationId !=null">
AND u.top_organization_id = #{topOrganizationId}
/*组织ID - 数据隔离:南光组织(organizationId=2827)查询全部,其他组织查询自己组织的数据*/
<if test="organizationId !=null">
AND u.organization_id = #{organizationId}
AND u.organization_name IS NOT NULL
</if>
GROUP BY u.user_id
GROUP BY u.user_id, u.user_name, u.user_area_address, u.user_area_county_id, u.user_area_name, u.user_phone, u.has_default_address, b.shipper_id, b.shipper_enterprise_name, u.DOCUMENT_PREPARER_NC_CODE, b.CUSTOMER_NC_CODE, u.organization_id, u.top_organization_id, b.settlement_currency
</select>
<select id="finShipperEnterpriseNamedByUserId" resultType="string">
SELECT
@@ -742,4 +752,4 @@
AND u.business_type IN (1, 3)
AND u.user_Id = #{userId}
</select>
</mapper>
</mapper>
@@ -114,7 +114,8 @@
b.shipper_enterprisel_auth_id,
a.user_phone,
a.user_name,
a.organization_name,
a.organization_id AS organizationId,
a.organization_name AS organizationName,
a.user_account,
a.user_member_code,
a.user_idcard_number,
@@ -139,7 +140,7 @@
b.monthly_settlement_flag,
a.user_auth_status,
b.original_receipt_flag,
b.freight_node,b.customer_nc_code
b.freight_node,b.customer_nc_code,b.settlement_currency
FROM "USER" a
LEFT JOIN user_shipper b ON a.user_id = b.user_id
left join (select user_id, LISTAGG(DISTINCT r.role_name, '&amp;') WITHIN GROUP(ORDER BY r.role_name) AS roleName
@@ -191,7 +192,7 @@
b.shipper_enterprise_fill,
a.business_type
FROM
"user" a
"USER" a
LEFT JOIN user_shipper b ON b.user_id = a.user_id
LEFT JOIN user_role ur ON b.user_id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.role_id
@@ -1,6 +1,7 @@
package com.mhd.modules.monitor.config;
import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -9,7 +10,7 @@ import org.springframework.security.web.authentication.SavedRequestAwareAuthenti
/**
* 监控权限配置
*
*
* @author mhd
*/
@EnableWebSecurity
@@ -32,11 +33,23 @@ public class WebSecurityConfigurer
return httpSecurity
.headers().frameOptions().disable()
.and().authorizeRequests()
.antMatchers("/actuator/health", "/actuator/info").permitAll() //扫描漏洞添加
.antMatchers("/actuator/**").authenticated() //扫描漏洞添加
.antMatchers(adminContextPath + "/assets/**"
, adminContextPath + "/login"
, adminContextPath + "/actuator/**"
, adminContextPath + "/instances/**"
).permitAll()
// 管理端点需要认证
.antMatchers("/actuator/**").hasRole("ADMIN")//扫描漏洞添加
.antMatchers("/admin/**").hasRole("ADMIN")//扫描漏洞添加
.antMatchers("/actuator/env").hasRole("plat_admin") // 仅允许ADMIN角色访问/env端点 //扫描漏洞添加
// 允许公开访问的端点
.requestMatchers(EndpointRequest.to("health", "info", "prometheus"))//扫描漏洞添加
.permitAll()
// 敏感端点需要管理员权限
.requestMatchers(EndpointRequest.to("env", "configprops", "beans", "mappings"))//扫描漏洞添加
.hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin().loginPage(adminContextPath + "/login")
+1 -1
View File
@@ -92,7 +92,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<!--链路追踪-->
@@ -7,11 +7,15 @@ import com.linke.finance.domain.approvalDocument.repository.todo.ApprovalDocumen
import com.linke.finance.domain.approvalDocument.repository.todo.WorkflowProcessInstancesByIdDO;
import com.linke.finance.domain.approvalDocument.service.ApprovalDocumentDomainService;
import com.linke.finance.interfaces.vo.ApprovalStatsVO;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.rmi.ServerException;
import java.util.List;
/**
* 审批单据ApplicationService
@@ -30,8 +34,12 @@ public class ApprovalDocumentApplicationService {
* 分页查询审批单据列表
*/
public List<ApprovalDocumentPO> queryList(ApprovalDocumentDO approvalDocumentDO) {
public List<ApprovalDocumentPO> queryList(ApprovalDocumentDO approvalDocumentDO) throws Exception{
LoginUser loginUser = SecurityUtils.getLoginUser();
UserPo userPo=loginUser.getUserPo();
if(!userPo.getRoleCode().equals("plat_admin")){
throw new ServerException("您没有权限访问");
}
if (loginUser != null){
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1){
@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.linke.finance.domain.accountManage.entity.AccountCashWallet;
import com.linke.finance.domain.accountManage.service.AccountCashWalletDomainService;
import com.linke.finance.domain.auditConfiguration.repository.todo.AuditConfigurationDO;
@@ -124,11 +125,51 @@ public class BusinessDocumentApplicationService {
public List<BusinessDocumentPO> queryList(BusinessDocumentDO businessDocumentDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null || loginUser.getUserPo() == null) {
log.warn("运单管理查询 - 未获取到登录用户信息,跳过数据权限过滤");
return businessDocumentDomainService.queryList(businessDocumentDO);
}
UserPo userPo = loginUser.getUserPo();
if (userPo.getUserAccountType() == 3){
businessDocumentDO.setTopOrganizationId(userPo.getTopOrganizationId());
}else {
businessDocumentDO.setOrganizationId(userPo.getOrganizationId());
Long loginUserOrganizationId = userPo.getOrganizationId();
Long topOrganizationId = userPo.getTopOrganizationId();
// 先保存前端传递的 organizationId如果存在
Long frontendOrganizationId = businessDocumentDO.getOrganizationId();
// 数据权限根据organizationId来设置查询权限
// organizationId等于2827时查询全部其他仅查询各自组织的信息
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
businessDocumentDO.setOrganizationId(frontendOrganizationId);
businessDocumentDO.setTopOrganizationId(null);
} else {
businessDocumentDO.setOrganizationId(null);
businessDocumentDO.setTopOrganizationId(null);
}
} else {
// 其他组织根据userAccountType设置组织过滤
if (userPo.getUserAccountType() == 3){
// 租户管理员使用topOrganizationId
if (topOrganizationId != null) {
businessDocumentDO.setTopOrganizationId(topOrganizationId);
}
businessDocumentDO.setOrganizationId(null);
} else {
// 其他用户使用organizationId
if (frontendOrganizationId != null && !frontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的organizationId强制使用当前登录用户的组织ID防止越权查询
log.warn("运单管理查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
frontendOrganizationId, loginUserOrganizationId);
businessDocumentDO.setOrganizationId(loginUserOrganizationId);
} else if (frontendOrganizationId == null) {
businessDocumentDO.setOrganizationId(loginUserOrganizationId);
}
businessDocumentDO.setTopOrganizationId(null);
}
}
return businessDocumentDomainService.queryList(businessDocumentDO);
}
@@ -550,6 +591,10 @@ public class BusinessDocumentApplicationService {
return businessDocumentDomainService.queryList(businessDocumentDO);
}
public List<Map<String,Object>> getFeeList(String invoiceId) {
return businessDocumentDomainService.getFeeList(invoiceId);
}
/**
* 修改业务单据支付状态同步网货修改支付状态
*/
@@ -1285,12 +1330,43 @@ public class BusinessDocumentApplicationService {
List<BusinessDocumentDetali> businessDocumentDetaliUpdateList = new ArrayList<>();
List<BusinessDocumentDetaliDTO> businessDocumentDetailDtoList = new ArrayList<>();
List<Verification> verificationList = new ArrayList<>();
log.info("批量审核开始,审核状态:{},待审核数据条数:{}", businessDocumentDetaliDO.getAuditStatus(), detailList.size());
// 先设置审核人的组织信息确保在生成应付账单时能够正确获取组织信息
Long loginUserOrganizationId = null;
String loginUserOrganizationName = null;
Long loginUserTopOrganizationId = null;
if (loginUser.getUserPo() != null) {
loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
loginUserOrganizationName = loginUser.getUserPo().getOrganizationName();
loginUserTopOrganizationId = loginUser.getUserPo().getTopOrganizationId();
}
for (BusinessDocumentDetali detail:detailList) {
log.debug("处理业务单据详情:businessDocumentDetaliId={}, 当前审核状态={}, 目标审核状态={}",
detail.getBusinessDocumentDetaliId(), detail.getAuditStatus(), businessDocumentDetaliDO.getAuditStatus());
if(detail.getAuditStatus()==2||detail.getAuditStatus()==3){
log.warn("业务单据详情 businessDocumentDetaliId={} 的审核状态已经是 {}(2=已同意,3=已拒绝),跳过处理",
detail.getBusinessDocumentDetaliId(), detail.getAuditStatus());
continue;
}
// 在生成应付账单之前先设置审核人的组织信息确保 packVerication 能够正确获取组织信息
if (loginUserOrganizationId != null) {
detail.setOrganizationId(loginUserOrganizationId);
}
if (loginUserOrganizationName != null) {
detail.setOrganizationName(loginUserOrganizationName);
}
if (loginUserTopOrganizationId != null) {
detail.setTopOrganizationId(loginUserTopOrganizationId);
}
//只有同意的才生成应付账单
if(businessDocumentDetaliDO.getAuditStatus()==ApproveStatusEnum.AGREE.getKey()){
log.info("审核通过,开始生成应付账单:businessDocumentDetaliId={}, firstSubject={}",
detail.getBusinessDocumentDetaliId(), detail.getFirstSubject());
if(SubjectCodeEnum.first_zycl_clhs.getCode().equals(detail.getFirstSubject())){//车辆核算的单独处理
//查询要自有车辆费用明细
R<List<SecondSubjectPO>> secondSubjectList = wlhyServiceFeign.getZyclClhsSecondSubjectList(detail.getBusinessCocumentId());
@@ -1308,6 +1384,14 @@ public class BusinessDocumentApplicationService {
verification.setAuditRemark(businessDocumentDetaliDO.getAuditRemark());
verification.setCreateBy(loginUser.getUserid());
verification.setCreateByName(loginUser.getUsername());
verification.setCreateTime(now);
verification.setUpdateTime(now);
verification.setUpdateBy(loginUser.getUserid());
verification.setUpdateByName(loginUser.getUsername());
// 确保 delFlag 被设置1=正常2=已删除
if (verification.getDelFlag() == null) {
verification.setDelFlag(1);
}
verification.setPayType(secondSubjectPO.getPayType());
verification.setBillRemarks(detail.getRemark());
verification.setPaymentMethod(detail.getPaymentMethod());
@@ -1318,6 +1402,10 @@ public class BusinessDocumentApplicationService {
verification.setPayName(secondSubjectPO.getPayName());
}
verificationList.add(verification);
log.debug("车辆核算二级科目应付账单已添加到列表:businessDocumentDetaliId={}, secondSubject={}, verificationMoney={}, innerNumber={}, delFlag={}, organizationId={}, organizationName={}",
detail.getBusinessDocumentDetaliId(), secondSubjectPO.getSecondSubject(),
secondSubjectPO.getAmount(), innerNumber, verification.getDelFlag(),
verification.getOrganizationId(), verification.getOrganizationName());
}
}else{
throw new ServiceException("查询车辆核算二级科目异常!");
@@ -1332,12 +1420,27 @@ public class BusinessDocumentApplicationService {
verification.setAuditRemark(businessDocumentDetaliDO.getAuditRemark());
verification.setCreateBy(loginUser.getUserid());
verification.setCreateByName(loginUser.getUsername());
verification.setCreateTime(now);
verification.setUpdateTime(now);
verification.setUpdateBy(loginUser.getUserid());
verification.setUpdateByName(loginUser.getUsername());
// 确保 delFlag 被设置1=正常2=已删除
if (verification.getDelFlag() == null) {
verification.setDelFlag(1);
}
verification.setPayType(detail.getSecondSubjectName());//付款方式油卡借款/现金借款=>与二级科目保持一致
verification.setBillRemarks(detail.getRemark());
verification.setPaymentMethod(detail.getPaymentMethod());
verification.setFuelCardNumber(detail.getFuelCardNumber());
verificationList.add(verification);
log.debug("普通科目应付账单已添加到列表:businessDocumentDetaliId={}, firstSubject={}, secondSubject={}, verificationMoney={}, innerNumber={}, delFlag={}, organizationId={}, organizationName={}",
detail.getBusinessDocumentDetaliId(), detail.getFirstSubject(), detail.getSecondSubject(),
detail.getAmount(), innerNumber, verification.getDelFlag(),
verification.getOrganizationId(), verification.getOrganizationName());
}
} else {
log.info("审核状态不是已同意(当前状态:{}),不生成应付账单:businessDocumentDetaliId={}",
businessDocumentDetaliDO.getAuditStatus(), detail.getBusinessDocumentDetaliId());
}
detail.setAuditStatus(businessDocumentDetaliDO.getAuditStatus());//审批结果
@@ -1347,11 +1450,25 @@ public class BusinessDocumentApplicationService {
detail.setUpdateBy(loginUser.getUserid());
detail.setUpdateByName(loginUser.getUsername());
detail.setUpdateTime(now);
// 组织信息已经在生成应付账单之前设置这里不需要重复设置
businessDocumentDetaliUpdateList.add(detail);
BusinessDocumentDetaliDTO detailDto = new BusinessDocumentDetaliDTO();
BeanUtils.copyProperties(detail,detailDto);
detailDto.setAuditRemark(businessDocumentDetaliDO.getAuditRemark());
// 确保关键字段的类型正确避免 TMS 端类型转换错误
// 确保 auditRemark 是字符串类型不为 null使用最新的审核备注
String auditRemark = businessDocumentDetaliDO.getAuditRemark();
if (auditRemark == null) {
auditRemark = "";
}
// 显式设置为字符串类型确保类型正确
detailDto.setAuditRemark(auditRemark);
// 确保其他关键字段也是正确的类型虽然已经通过 copyProperties 复制但显式设置更安全
detailDto.setAuditStatus(detail.getAuditStatus());
detailDto.setAuditType(detail.getAuditType());
businessDocumentDetailDtoList.add(detailDto);
//车辆维修单同步工时费申请状态
if(businessDocumentDetaliDO.getAuditStatus()==2||businessDocumentDetaliDO.getAuditStatus()==3){
@@ -1380,14 +1497,72 @@ public class BusinessDocumentApplicationService {
}
}
//应付账单
log.info("准备保存应付账单,应付账单数量:{}", verificationList.size());
if (!verificationList.isEmpty()){
// 记录应付账单详细信息便于排查
for (int i = 0; i < Math.min(verificationList.size(), 3); i++) {
Verification v = verificationList.get(i);
log.info("应付账单示例[{}]businessDocumentDetaliId={}, innerNumber={}, verificationMoney={}, firstSubject={}, secondSubject={}",
i, v.getBusinessDocumentDetaliId(), v.getInnerNumber(), v.getVerificationMoney(),
v.getFirstSubject(), v.getSecondSubject());
}
boolean saveFlag = verificationDomainService.batchAddVerification(verificationList);
log.info("保存应付账单结果:saveFlag={}, 应付账单数量={}", saveFlag, verificationList.size());
if(!saveFlag){
log.error("保存应付账单失败!应付账单数量:{}", verificationList.size());
throw new ServiceException("保存应付账单失败!");
}
log.info("应付账单保存成功,共保存 {} 条记录", verificationList.size());
} else {
log.warn("应付账单列表为空,未生成任何应付账单。审核状态:{},业务单据详情数量:{}",
businessDocumentDetaliDO.getAuditStatus(), detailList.size());
}
//推送数据到tms:审核通过修改单据状态为待付款审核拒绝修改状态为已拒绝并处理相关逻辑
if(businessDocumentDetailDtoList.size()>0){
// 记录传递给 TMS 的数据便于调试
log.info("准备同步TMS业务单据信息,数据条数:{}", businessDocumentDetailDtoList.size());
for (int i = 0; i < Math.min(businessDocumentDetailDtoList.size(), 3); i++) {
BusinessDocumentDetaliDTO dto = businessDocumentDetailDtoList.get(i);
log.info("同步TMS业务单据信息示例[{}]businessDocumentDetaliId={}, auditStatus={}, auditStatus类型={}, auditRemark={}, auditRemark类型={}, auditRemark值={}",
i, dto.getBusinessDocumentDetaliId(), dto.getAuditStatus(),
dto.getAuditStatus() != null ? dto.getAuditStatus().getClass().getName() : "null",
dto.getAuditRemark(), dto.getAuditRemark() != null ? dto.getAuditRemark().getClass().getName() : "null",
dto.getAuditRemark());
}
// 最后一次验证确保所有 auditRemark 都是字符串类型
for (BusinessDocumentDetaliDTO dto : businessDocumentDetailDtoList) {
if (dto.getAuditRemark() == null) {
dto.setAuditRemark("");
} else if (!(dto.getAuditRemark() instanceof String)) {
// 如果不是字符串类型转换为字符串
log.warn("发现 auditRemark 不是字符串类型:{},类型:{},将转换为字符串",
dto.getAuditRemark(), dto.getAuditRemark().getClass().getName());
dto.setAuditRemark(String.valueOf(dto.getAuditRemark()));
}
}
// 通过 JSON 序列化和反序列化确保类型正确避免类型转换问题
try {
String jsonString = JSON.toJSONString(businessDocumentDetailDtoList);
log.debug("同步TMS业务单据信息,JSON序列化结果长度:{}", jsonString.length());
List<BusinessDocumentDetaliDTO> deserializedList = JSON.parseArray(jsonString, BusinessDocumentDetaliDTO.class);
log.debug("JSON反序列化后,数据条数:{}", deserializedList.size());
// 验证反序列化后的 auditRemark 类型
for (int i = 0; i < Math.min(deserializedList.size(), 3); i++) {
BusinessDocumentDetaliDTO dto = deserializedList.get(i);
if (dto.getAuditRemark() != null && !(dto.getAuditRemark() instanceof String)) {
log.warn("JSON反序列化后,auditRemark 类型不正确:{},将强制转换为字符串",
dto.getAuditRemark().getClass().getName());
dto.setAuditRemark(String.valueOf(dto.getAuditRemark()));
}
}
businessDocumentDetailDtoList = deserializedList;
} catch (Exception e) {
log.warn("JSON序列化/反序列化失败,使用原始数据:{}", e.getMessage());
}
AjaxResult ajaxResult = wlhyServiceFeign.syncBusinessDocumentInfo(businessDocumentDetailDtoList);
if (null != ajaxResult && !"200".equals(String.valueOf(ajaxResult.get("code")))) {
log.error("同步TMS业务单据信息失败:" + ajaxResult.get("msg"));
@@ -1401,6 +1576,7 @@ public class BusinessDocumentApplicationService {
Verification verification = new Verification();
verification.setOrganizationId(businessDocumentDetaliDTO.getOrganizationId());
verification.setTopOrganizationId(businessDocumentDetaliDTO.getTopOrganizationId());
verification.setOrganizationName(businessDocumentDetaliDTO.getOrganizationName());
verification.setVerificationStatus(1);//未支付
verification.setBusinessDocumentDetaliId(businessDocumentDetaliDTO.getBusinessDocumentDetaliId());
verification.setBusinessDocumentDetaliNumber(businessDocumentDetaliDTO.getBusinessDocumentDetaliNumber());
@@ -1487,4 +1663,4 @@ public class BusinessDocumentApplicationService {
return true;
}
}
}

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