瀏覽代碼

财务汇总发放管理-日结

FengChaoYu 9 月之前
父節點
當前提交
f1cb814634
共有 34 個文件被更改,包括 2618 次插入55 次删除
  1. 57 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailySummaryDataBean.java
  2. 51 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailySummaryDataVO.java
  3. 31 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailyWokerBankCardMonthBean.java
  4. 27 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailyWorkerBankCardBean.java
  5. 43 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailyWorkerIssueSalaryBean.java
  6. 8 2
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/WorkerWaitBuckleVO.java
  7. 29 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/BankCardInfoBean.java
  8. 19 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/LinkPayBean.java
  9. 18 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/ModBean.java
  10. 33 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/PayBean.java
  11. 61 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/PayItem.java
  12. 18 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/PayResultBean.java
  13. 42 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/ReceivedItem.java
  14. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/CommonMapper.java
  15. 47 2
      mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/DailyMapper.java
  16. 6 0
      mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java
  17. 18 20
      mall-server-api/src/main/java/com/gree/mall/manager/controller/settle/repair/BankAccountController.java
  18. 126 21
      mall-server-api/src/main/java/com/gree/mall/manager/controller/settle/repair/DailyImportSummaryController.java
  19. 11 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/settle/repair/DailyWithholdController.java
  20. 28 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/repair/settle/IsBuckleEnum.java
  21. 30 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/repair/settle/IssueSummaryStatusEnum.java
  22. 14 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/common/CommonLogic.java
  23. 139 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/common/SMSLogic.java
  24. 112 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/DailyImportSummaryLogic.java
  25. 598 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/DailyTransferLogic.java
  26. 19 5
      mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/DailyWithholdLogic.java
  27. 16 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/RepairSettleAccountLogic.java
  28. 378 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/cmc/CmcBankLogic.java
  29. 23 3
      mall-server-api/src/main/java/com/gree/mall/manager/utils/CommonUtils.java
  30. 133 0
      mall-server-api/src/main/java/com/gree/mall/manager/utils/sm4/DCCryptor.java
  31. 168 0
      mall-server-api/src/main/java/com/gree/mall/manager/utils/sm4/DCHelper.java
  32. 99 0
      mall-server-api/src/main/java/com/gree/mall/manager/utils/sm4/SMHttpTool.java
  33. 4 2
      mall-server-api/src/main/resources/mapper/CommonMapper.xml
  34. 211 0
      mall-server-api/src/main/resources/mapper/DailyMapper.xml

+ 57 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailySummaryDataBean.java

@@ -0,0 +1,57 @@
+package com.gree.mall.manager.bean.settle.repair;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@ApiModel
+@Data
+public class DailySummaryDataBean {
+
+    @ApiModelProperty(value = "日结算记录编号")
+    private Long issueSalaryId;
+    @ApiModelProperty(value = "结算单位编号")
+    private String summaryNumber;
+    @ApiModelProperty(value = "结算单位名称")
+    private String summaryName;
+    @ApiModelProperty(value = "网点单位编号")
+    private String websitNumber;
+    @ApiModelProperty(value = "网点单位名称")
+    private String websitName;
+    @ApiModelProperty(value = "状态 1.未发放 2已发放")
+    private Integer status;
+    @ApiModelProperty(value = "发放月份")
+    private String month;
+    @ApiModelProperty(value = "结算人数")
+    private Integer summaryNum;
+    @ApiModelProperty(value = "结算工单人数")
+    private Integer summaryOrderNum;
+    @ApiModelProperty(value = "维修结算费用")
+    private BigDecimal totalRepairCostC;
+    @ApiModelProperty(value = "需扣回费用")
+    private BigDecimal reduceCostC;
+    @ApiModelProperty(value = "增减费用")
+    private BigDecimal incrDecrCostC;
+    @ApiModelProperty(value = "工伤保险")
+    private BigDecimal injuryCostC;
+    @ApiModelProperty(value = "残保金")
+    private BigDecimal residualCostC;
+    @ApiModelProperty(value = "暂扣款")
+    private BigDecimal withholdCostC;
+    @ApiModelProperty(value = "应发工资总额")
+    private BigDecimal issueCostC;
+    @ApiModelProperty(value = "发放人")
+    private String issueBy;
+    @ApiModelProperty(value = "发放时间")
+    private String issueTime;
+    @ApiModelProperty(value = "汇总操作人")
+    private String summaryBy;
+    @ApiModelProperty(value = "汇总时间")
+    private String summaryTime;
+    @ApiModelProperty(value = "汇总批次号")
+    private String summaryBatchNo;
+    @ApiModelProperty(value = "分组状态")
+    private Integer groupStatus;
+}

+ 51 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailySummaryDataVO.java

@@ -0,0 +1,51 @@
+package com.gree.mall.manager.bean.settle.repair;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.repair.settle.IssueSummaryStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class DailySummaryDataVO {
+
+    @ApiModelProperty(value = "所属商户")
+    private String companyWechatName;
+
+    @ApiModelProperty(value = "汇总批次号")
+    private String summaryBatchNo;
+
+    @ApiModelProperty(value = "发放月份")
+    private String month;
+
+    @ZfireField(ignoreSelect = true)
+    @ApiModelProperty(value = "结算人数")
+    private Integer summaryNum;
+
+    @ZfireField(ignoreSelect = true)
+    @ApiModelProperty(value = "结算工单数量(单)")
+    private Integer summaryOrderNum;
+
+    @ApiModelProperty(value = "结算金额(元)")
+    private BigDecimal issueCostC;
+
+    @ApiModelProperty(value = "发放状态")
+    private IssueSummaryStatusEnum status;
+
+    @ApiModelProperty(value = "汇总操作人")
+    private String summaryBy;
+
+    @ApiModelProperty(value = "汇总时间")
+    private String summaryTime;
+
+    @ApiModelProperty(value = "发放操作人")
+    private String issueBy;
+
+    @ApiModelProperty(value = "发放时间")
+    private String issueTime;
+
+}

+ 31 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailyWokerBankCardMonthBean.java

@@ -0,0 +1,31 @@
+package com.gree.mall.manager.bean.settle.repair;
+
+import com.gree.mall.manager.plus.entity.SettleDailyIssueSummaryMonthRecord;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+public class DailyWokerBankCardMonthBean extends SettleDailyIssueSummaryMonthRecord {
+
+    @ApiModelProperty(value = "银行卡号")
+    private String bankAccount;
+
+    @ApiModelProperty(value = "户名")
+    private String bankAccountName;
+
+    @ApiModelProperty(value = "开户行")
+    private String depositBank;
+
+    @ApiModelProperty(value = "开户行机构ID")
+    private String depositBankOrgId;
+
+//    @ApiModelProperty(value = "姓名")
+//    private String websiteName;
+
+    @ApiModelProperty(value = "开户行地址")
+    private String bankAddr;
+}

+ 27 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailyWorkerBankCardBean.java

@@ -0,0 +1,27 @@
+package com.gree.mall.manager.bean.settle.repair;
+
+import com.gree.mall.manager.plus.entity.SettleDailyIssueSummaryRecord;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+public class DailyWorkerBankCardBean extends SettleDailyIssueSummaryRecord {
+    @ApiModelProperty(value = "银行卡号")
+    private String bankAccount;
+
+    @ApiModelProperty(value = "户名")
+    private String bankAccountName;
+
+    @ApiModelProperty(value = "开户行")
+    private String depositBank;
+
+    @ApiModelProperty(value = "开户行机构ID")
+    private String depositBankOrgId;
+
+    @ApiModelProperty(value = "开户行地址")
+    private String bankAddr;
+}

+ 43 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/DailyWorkerIssueSalaryBean.java

@@ -0,0 +1,43 @@
+package com.gree.mall.manager.bean.settle.repair;
+
+import com.gree.mall.manager.plus.entity.SettleDailyImportSummaryItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+public class DailyWorkerIssueSalaryBean extends SettleDailyImportSummaryItem {
+
+    @ApiModelProperty(value = "银行卡号")
+    private String bankAccount;
+
+    @ApiModelProperty(value = "户名")
+    private String bankAccountName;
+
+    @ApiModelProperty(value = "开户行")
+    private String depositBank;
+
+    @ApiModelProperty(value = "发放状态 1.待发放 2.已发放")
+    private Integer issueStatus;
+
+    @ApiModelProperty(value = "发放时间")
+    private String issueTime;
+
+    @ApiModelProperty(value = "发放人")
+    private String issueBy;
+
+    @ApiModelProperty(value = "是否扣减 1是 2否")
+    private Integer reduceStatus;
+
+    @ApiModelProperty(value = "结算时间 reduceStatus=1取")
+    private Date reduceTime;
+
+    @ApiModelProperty(value = "1.已发放 2.未发放 3.暂不结算 4.已扣回")
+    private String tStatus;
+
+}

+ 8 - 2
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/WorkerWaitBuckleVO.java

@@ -1,6 +1,7 @@
 package com.gree.mall.manager.bean.settle.repair;
 
 import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.repair.settle.IsBuckleEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -13,11 +14,15 @@ import java.util.Date;
 @ZfireField(tbName = "a")
 public class WorkerWaitBuckleVO {
 
+    @ApiModelProperty(value = "所属商户")
+    private String companyWechatName;
+
     @ApiModelProperty("费用发生时间")
     private Date createTime;
 
+    @ZfireField(tbName = "aa")
     @ApiModelProperty("服务人员姓名")
-    private String workerName;
+    private String nickName;
 
     @ApiModelProperty("服务人员编号")
     private String workerNumber;
@@ -25,6 +30,7 @@ public class WorkerWaitBuckleVO {
     @ApiModelProperty("身份证")
     private String idcard;
 
+    @ZfireField(tbName = "b")
     @ApiModelProperty("联系方式")
     private String mobile;
 
@@ -35,7 +41,7 @@ public class WorkerWaitBuckleVO {
     private BigDecimal buckleAmount;
 
     @ApiModelProperty("状态")
-    private Boolean isBuckle;
+    private IsBuckleEnum isBuckle;
 
     @ApiModelProperty("扣除时间")
     private Date updateTime;

+ 29 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/BankCardInfoBean.java

@@ -0,0 +1,29 @@
+package com.gree.mall.manager.bean.settle.repair.cmc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel
+@Data
+public class BankCardInfoBean {
+    @ApiModelProperty(value = "银行卡号")
+    private String bankAccount;
+    @ApiModelProperty(value = "分行区号")
+    private String bankOrgCode;
+    @ApiModelProperty(value = "授权类型 1:联动支付,2:联动代发")
+    private String authType;
+    @ApiModelProperty(value = "授权账号")
+    private String authBankAccount;
+
+    public BankCardInfoBean(String bankAccount, String bankOrgCode, String authType, String authBankAccount) {
+        this.bankAccount = bankAccount;
+        this.bankOrgCode = bankOrgCode;
+        this.authType = authType;
+        this.authBankAccount = authBankAccount;
+    }
+
+    public BankCardInfoBean(){
+
+    }
+}

+ 19 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/LinkPayBean.java

@@ -0,0 +1,19 @@
+package com.gree.mall.manager.bean.settle.repair.cmc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel
+@Data
+public class LinkPayBean {
+    @ApiModelProperty(value = "模式单记录")
+    private List<ModBean> modList;
+
+    @ApiModelProperty(value = "业务单记录")
+    private List<PayBean> payList;
+
+
+}

+ 18 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/ModBean.java

@@ -0,0 +1,18 @@
+package com.gree.mall.manager.bean.settle.repair.cmc;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel
+@Data
+public class ModBean {
+
+    @ApiModelProperty(value = "业务模式编号")
+    private String busmod;
+
+    public ModBean(String busmod) {
+        this.busmod = busmod;
+    }
+}

+ 33 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/PayBean.java

@@ -0,0 +1,33 @@
+package com.gree.mall.manager.bean.settle.repair.cmc;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel
+@Data
+public class PayBean {
+
+    @ApiModelProperty(value = "业务参考号")
+    private String yurref;
+    @ApiModelProperty(value = "付方分行号")
+    private String dbtbbk;
+    @ApiModelProperty(value = "付方账号")
+    private String dbtacc;
+    @ApiModelProperty(value = "授权账号")
+    private String auteac;
+    @ApiModelProperty(value = "收方帐号")
+    private String crtacc;
+    @ApiModelProperty(value = "收方户名")
+    private String crtnam;
+    @ApiModelProperty(value = "收方行地址")
+    private String crtadr;
+    @ApiModelProperty(value = "交易金额")
+    private String trsamt;
+    @ApiModelProperty(value = "业务摘要")
+    private String busnar;
+
+
+
+}

+ 61 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/PayItem.java

@@ -0,0 +1,61 @@
+package com.gree.mall.manager.bean.settle.repair.cmc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel
+@Data
+public class PayItem {
+
+    @ApiModelProperty(value = "交易总金额")
+    private String ttlamt;
+
+    @ApiModelProperty(value = "交易总笔数")
+    private String ttlcnt;
+
+    @ApiModelProperty(value = "本次金额")
+    private String curamt;
+
+    @ApiModelProperty(value = "本次笔数")
+    private String curcnt;
+
+    @ApiModelProperty(value = "代发协议号")
+    private String cnvnbr;
+
+
+    @ApiModelProperty(value = "代发类型")
+    private String agctyp;
+
+    @ApiModelProperty(value = "币种")
+    private String ccynbr;
+
+    @ApiModelProperty(value = "分行号")
+    private String bbknbr;
+
+    @ApiModelProperty(value = "账号")
+    private String accnbr;
+
+    @ApiModelProperty(value = "授权账号")
+    private String autacc;
+
+    @ApiModelProperty(value = "业务参考号")
+    private String yurref;
+
+    @ApiModelProperty(value = "期望日期 yyyymmdd")
+    private String eptdat;
+
+    @ApiModelProperty(value = "期望时间 000000")
+    private String epttim;
+
+    @ApiModelProperty(value = "交易摘要")
+    private String trsrmk;
+
+
+//    @ApiModelProperty(value = "结算通道 Y 超网 N 大小额")
+//    private String chlflg;
+
+
+
+
+}

+ 18 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/PayResultBean.java

@@ -0,0 +1,18 @@
+package com.gree.mall.manager.bean.settle.repair.cmc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel
+@Data
+public class PayResultBean {
+
+    @ApiModelProperty(value = "经办起始日期 格式:20201030")
+    private String bgndat;
+    @ApiModelProperty(value = "经办结束日期")
+    private String enddat;
+    @ApiModelProperty(value = "业务摘要")
+    private String refkey;
+
+}

+ 42 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/settle/repair/cmc/ReceivedItem.java

@@ -0,0 +1,42 @@
+package com.gree.mall.manager.bean.settle.repair.cmc;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel
+@Data
+public class ReceivedItem {
+
+    @ApiModelProperty(value = "交易序号")
+    private String trsseq;
+
+    @ApiModelProperty(value = "收方账号")
+    private String objacc;
+
+    @ApiModelProperty(value = "收方户名")
+    private String objacn;
+
+    @ApiModelProperty(value = "交易金额")
+    private String trsamt;
+
+    @ApiModelProperty(value = "系统内标志 Y 行内,N 行外")
+    private String sysflg;
+
+    @ApiModelProperty(value = "他行户口开户行")
+    private String accbnk;
+
+    @ApiModelProperty(value = "他行户口开户地")
+    private String acccty;
+
+    public ReceivedItem(String trsseq, String objacc, String objacn, String trsamt, String sysflg, String accbnk, String acccty) {
+        this.trsseq = trsseq;
+        this.objacc = objacc;
+        this.objacn = objacn;
+        this.trsamt = trsamt;
+        this.sysflg = sysflg;
+        this.accbnk = accbnk;
+        this.acccty = acccty;
+    }
+}

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/CommonMapper.java

@@ -692,4 +692,5 @@ public interface CommonMapper {
      * @return
      */
     IPage<WorkerWaitBuckleVO> buckleList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
 }

+ 47 - 2
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/DailyMapper.java

@@ -1,12 +1,15 @@
 package com.gree.mall.manager.commonmapper;
 
 import com.baomidou.mybatisplus.annotation.SqlParser;
-import com.gree.mall.manager.bean.settle.repair.DailyIncrDecrCostCountBean;
-import com.gree.mall.manager.bean.settle.repair.DailyTotalCostBean;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.settle.repair.*;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 @Mapper
 public interface DailyMapper {
@@ -44,5 +47,47 @@ public interface DailyMapper {
             @Param("status") Integer status
     );
 
+    @MapKey(value = "summaryNumber")
+    List<Map<String,Object>>  querySummaryNumber(
+            @Param("companyWechatId") String companyWechatId,
+            @Param("summaryBatchNo") String summaryBatchNo
+    );
+
+    @MapKey(value = "summaryNumber")
+    List<Map<String,Object>>  querySummaryMonthNumber(
+            @Param("companyWechatId") String companyWechatId,
+            @Param("summaryBatchNo") String summaryBatchNo
+    );
+
+    List<DailyWokerBankCardMonthBean> queryIssueSalaryMonthBankCardInfo(
+            @Param("summaryBatchNo") String summaryBatchNo,
+            @Param("summaryNumber") String summaryNumber,
+            @Param("status") Integer status,
+            @Param("companyWechatId") String companyWechatId);
+
+    List<DailyWorkerBankCardBean> queryIssueSalaryAndBankCardInfo(
+            @Param("summaryBatchNo") String summaryBatchNo,
+            @Param("summaryNumber") String summaryNumber,
+            @Param("status") Integer status,
+            @Param("companyWechatId") String companyWechatId
+    );
+
+    List<DailySummaryDataBean> summaryDayList(@Param("summaryBatchNo") String summaryBatchNo,
+                                              @Param("companyWechatIds") List<String> companyWechatIds,
+                                              @Param("adminWebsitIds") List<String> adminWebsitIds);
+
+    IPage<DailySummaryDataBean> cwSummaryList(Page page,
+                                              @Param("summaryBatchNo") String summaryBatchNo,
+                                              @Param("summaryStartTime") String summaryStartTime,
+                                              @Param("summaryEndTime") String summaryEndTime,
+                                              @Param("issueStartTime") String issueStartTime,
+                                              @Param("issueEndTime") String issueEndTime,
+                                              @Param("status") Integer status,
+                                              @Param("companyWechatIds") List<String> companyWechatIds,
+                                              @Param("adminWebsitIds") List<String> adminWebsitIds);
 
+    IPage<DailyWorkerIssueSalaryBean> workerDetailList(Page page,
+                                                       @Param("issueSalaryId") Integer issueSalaryId,
+                                                       @Param("companyWechatIds") List<String> companyWechatIds,
+                                                       @Param("adminWebsitIds") List<String> adminWebsitIds);
 }

+ 6 - 0
mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java

@@ -13,6 +13,9 @@ public class Constant {
     //维修日结-待扣临时前缀
     public final static String DAILY_PREFIX = "DAILY_TMP_";
 
+    //短信验证码过期时间
+    public static final Integer SMS_EXPIRE = 10 * 60;
+
     public class Ali {
         public final static String ACCESS_KEY_ID = "LTAI4GK1q4mnpCFbonMd1pji";
         public final static String ACCESS_KEY_SECERT = "E5LW0V1H8HBxqjKkExIxaXUgSyex6C";
@@ -68,6 +71,9 @@ public class Constant {
         //维修日结汇总
         public final static String LOCK_DAILY_BANKACCOUNT = "jsm:SETTLE:LOCK:BANKACCOUNT:";
         public final static String LOCK_DAILY_SUMMARY = "jsm:SETTLE:LOCK:DAILY:SUMMARY";
+        public final static String BALANCE_SEL_MOBILE_SMS = "jsm:SETTLE:BALANCE:SMS";
+        public final static String ISSUE_SAL_MOBILE_SMS = "jsm:SETTLE:ISSUE:SMS";
+        public final static String LOCK_SUMMARY_ISSUE = "jsm:SETTLE:lock:issue:summary";
     }
     public class ChatMessage {
         public final static String MSG_TYPE_DOC = "docmsg";

+ 18 - 20
mall-server-api/src/main/java/com/gree/mall/manager/controller/settle/repair/BankAccountController.java

@@ -7,6 +7,7 @@ import com.gree.mall.manager.bean.settle.repair.DailyBankAccountVO;
 import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.settle.repair.DailyTransferLogic;
 import com.gree.mall.manager.logic.settle.repair.RepairSettleAccountLogic;
 import com.gree.mall.manager.plus.entity.SettleDailyBankAccount;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
@@ -34,6 +35,7 @@ public class BankAccountController {
 
     private final RepairSettleAccountLogic repairSettleAccountLogic;
     private final RedisLockRegistry redisLockRegistry;
+    private final DailyTransferLogic dailyTransferLogic;
 
     @ZfireList
     @PostMapping("/list")
@@ -139,15 +141,15 @@ public class BankAccountController {
 //    }
 //
 //
-//    @GetMapping("/send/msg")
-//    @ApiOperation(value = "查询余额/(发放工资)发送验证码")
-//    public ResponseHelper sendMsg(
-//            @ApiParam(required = true, value = "手机号") @RequestParam(required = true) String mobile,
-//            @ApiParam(required = false, value = "类型 发放:issue , 余额:balance") @RequestParam(required = false) String type
-//    ) throws Exception {
-//        repairSettleAccountLogic.sendMsg(mobile,type);
-//        return ResponseHelper.success();
-//    }
+    @PostMapping("/send/msg")
+    @ApiOperation(value = "查询余额/(发放工资)发送验证码")
+    public ResponseHelper sendMsg(
+            @ApiParam(required = true, value = "手机号") @RequestParam String mobile,
+            @ApiParam(value = "类型 发放:issue , 余额:balance") @RequestParam(required = false) String type
+    ) throws Exception {
+        repairSettleAccountLogic.sendMsg(mobile,type);
+        return ResponseHelper.success();
+    }
 //
 //
 //
@@ -168,17 +170,13 @@ public class BankAccountController {
         repairSettleAccountLogic.importData(file);
         return ResponseHelper.success();
     }
-//
-//
-//    @Autowired
-//    DailyTransferLogic dailyTransferLogic;
-//
-//    @GetMapping("/excute")
-//    @ApiOperation("查询转账结果")
-//    public ResponseHelper excute(){
-//        dailyTransferLogic.excute();
-//        return ResponseHelper.success();
-//    }
+
+    @PostMapping("/excute")
+    @ApiOperation("查询转账结果")
+    public ResponseHelper excute(){
+        dailyTransferLogic.excute();
+        return ResponseHelper.success();
+    }
 //
 //    @GetMapping("/template/export")
 //    @ApiOperation("银行账号信息-导出")

+ 126 - 21
mall-server-api/src/main/java/com/gree/mall/manager/controller/settle/repair/DailyImportSummaryController.java

@@ -3,12 +3,14 @@ package com.gree.mall.manager.controller.settle.repair;
 import cn.hutool.core.lang.TypeReference;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.ExcelData;
 import com.gree.mall.manager.bean.settle.repair.*;
 import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.helper.ResponseHelper;
 import com.gree.mall.manager.logic.settle.repair.DailyImportSummaryLogic;
 import com.gree.mall.manager.plus.entity.SettleDailyIncrDecrCost;
+import com.gree.mall.manager.plus.entity.SettleDailyIssueSummaryRecord;
 import com.gree.mall.manager.utils.excel.ExcelUtils;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
@@ -65,7 +67,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "结算数据导入-删除")
     public ResponseHelper repairDelete(
             @ApiParam(required = true, value = "导入批次号") @RequestParam String importBatchNo
-    ){
+    ) {
         dailyImportSummaryLogic.repairDelete(importBatchNo);
         return ResponseHelper.success();
     }
@@ -77,19 +79,19 @@ public class DailyImportSummaryController {
             @ApiParam(value = "是否为安装费用") @RequestParam(required = false) Boolean install
     ) throws InterruptedException {
         Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_DAILY_SUMMARY);
-        if(!obtain.tryLock(10, TimeUnit.SECONDS)){
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
             throw new RemoteServiceException("正在汇总中,请稍后再试");
         }
-        try{
-            for(String importBatchNo:importBatchNos) {
+        try {
+            for (String importBatchNo : importBatchNos) {
                 try {
-                    dailyImportSummaryLogic.repairSummary(importBatchNo,install);
-                }catch(Exception e){
-                    log.error("结算数据汇总失败",e);
-                    return ResponseHelper.error("批次号:"+importBatchNo+"汇总失败");
+                    dailyImportSummaryLogic.repairSummary(importBatchNo, install);
+                } catch (Exception e) {
+                    log.error("结算数据汇总失败", e);
+                    return ResponseHelper.error("批次号:" + importBatchNo + "汇总失败");
                 }
             }
-        }finally {
+        } finally {
             obtain.unlock();
         }
         return ResponseHelper.success();
@@ -123,7 +125,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "结算数据导入明细-删除/批量删除")
     public ResponseHelper repairItemDelete(
             @ApiParam(required = true, value = "id") @RequestParam List<Integer> ids
-    ){
+    ) {
         dailyImportSummaryLogic.repairItemDelete(ids);
         return ResponseHelper.success();
     }
@@ -132,7 +134,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "结算数据导入明细-暂不结算/批量暂结算/不结算")
     public ResponseHelper batchWaitSummary(
             @ApiParam(required = true, value = "id") @RequestParam List<Integer> ids
-    ){
+    ) {
         dailyImportSummaryLogic.batchWaitSummary(ids);
         return ResponseHelper.success();
     }
@@ -141,7 +143,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "结算数据导入明细-恢复结算(批量)")
     public ResponseHelper batchSummary(
             @ApiParam(required = true, value = "id") @RequestParam List<Integer> ids
-    ){
+    ) {
         dailyImportSummaryLogic.batchSummary(ids);
         return ResponseHelper.success();
     }
@@ -198,7 +200,7 @@ public class DailyImportSummaryController {
     @PostMapping("/reduce/update")
     @ApiOperation(value = "增减费用明细-编辑")
     public ResponseHelper reduceUpdate(
-            @ApiParam(value = "增减费用对象",required = true) @RequestBody
+            @ApiParam(value = "增减费用对象", required = true) @RequestBody
                     SettleDailyIncrDecrCost cost
     ) {
         dailyImportSummaryLogic.reduceUpdate(cost);
@@ -213,13 +215,13 @@ public class DailyImportSummaryController {
             HttpServletRequest request
     ) throws Exception {
         List<Object> datas = ExcelUtils.importExcel(file);
-        dailyImportSummaryLogic.importIncrDecrCost(importBatchNo,datas ,request);
+        dailyImportSummaryLogic.importIncrDecrCost(importBatchNo, datas, request);
         return ResponseHelper.success();
     }
 
     @ZfireList
     @PostMapping("/incrDecrCost/list")
-    @ApiOperation(value = "增减费用管理-列表")
+    @ApiOperation(value = "增减费用明细-列表")
     public ResponseHelper<IPage<DailyIncrDecrCostVO>> incrDecrCostList(
             @RequestBody ZfireParamBean zfireParamBean
     ) {
@@ -229,7 +231,7 @@ public class DailyImportSummaryController {
     }
 
     @PostMapping("/incrDecrCost/list/export")
-    @ApiOperation("增减费用管理-导出")
+    @ApiOperation("增减费用明细-导出")
     public void incrDecrCostListExport(
             @RequestBody ZfireParamBean zfireParamBean,
             HttpServletRequest request,
@@ -280,7 +282,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "需扣回工单费用-删除")
     public ResponseHelper reduceListDelete(
             @ApiParam(required = true, value = "导入批次号") @RequestParam String importBatchNo
-    ){
+    ) {
         dailyImportSummaryLogic.reduceListDelete(importBatchNo);
         return ResponseHelper.success();
     }
@@ -289,7 +291,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "需扣回工单费用-执行扣回")
     public ResponseHelper reduceListDo(
             @ApiParam(required = true, value = "导入批次号") @RequestParam String importBatchNo
-    ){
+    ) {
         dailyImportSummaryLogic.reduceListDo(importBatchNo);
         return ResponseHelper.success();
     }
@@ -298,7 +300,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "需扣回工单费用详情-删除")
     public ResponseHelper reduceItemDelete(
             @ApiParam(required = true, value = "ids") @RequestParam List<Integer> ids
-    ){
+    ) {
         dailyImportSummaryLogic.reduceItemDelete(ids);
         return ResponseHelper.success();
     }
@@ -307,7 +309,7 @@ public class DailyImportSummaryController {
     @ApiOperation(value = "需扣回工单费用详情-执行扣回")
     public ResponseHelper reduceItemDo(
             @ApiParam(required = true, value = "ids") @RequestParam List<Integer> ids
-    ){
+    ) {
         dailyImportSummaryLogic.reduceItemDo(ids);
         return ResponseHelper.success();
     }
@@ -324,7 +326,7 @@ public class DailyImportSummaryController {
     }
 
     @PostMapping("/buckle/export")
-    @ApiOperation("师傅待扣费用-导出")
+    @ApiOperation(value = "师傅待扣费用-导出")
     public void buckleListExport(
             @RequestBody ZfireParamBean zfireParamBean,
             HttpServletRequest request,
@@ -335,4 +337,107 @@ public class DailyImportSummaryController {
         //3.导出
         FieldUtils.exportData(page.getRecords(), zfireParamBean.getExportFields(), request, response);
     }
+
+    @GetMapping("/cw/list")
+    @ApiOperation(value = "财务汇总发放管理-日结")
+    public ResponseHelper<IPage<DailySummaryDataBean>>  cwList(
+            @ApiParam(required = true, value = "页号") @RequestParam Integer pageNo,
+            @ApiParam(required = true, value = "页大小") @RequestParam Integer pageSize,
+            @ApiParam(value = "汇总批次号") @RequestParam(required = false) String summaryBatchNo,
+            @ApiParam(value = "汇总时间段起始") @RequestParam(required = false) String summaryStartTime,
+            @ApiParam(value = "汇总时间段结束") @RequestParam(required = false) String summaryEndTime,
+            @ApiParam(value = "发放时间段起始") @RequestParam(required = false) String issueStartTime,
+            @ApiParam(value = "发放时间段结束") @RequestParam(required = false) String issueEndTime,
+            @ApiParam(value = "发放状态1.未发放 2.已发放") @RequestParam(required = false) Integer status
+    ){
+        IPage<DailySummaryDataBean> page = dailyImportSummaryLogic.cwSummaryList(summaryBatchNo, summaryStartTime, summaryEndTime,
+                issueStartTime, issueEndTime, status, pageNo, pageSize);
+        return ResponseHelper.success(page);
+    }
+
+    /**
+     * 发放日结工资
+     */
+    @PostMapping("/salary/issue")
+    @ApiOperation(value = "日结工资(结算网点发放批量)-发放")
+    public ResponseHelper issueSalary(
+            @ApiParam(required = true, value = "汇总批次号") @RequestParam String summaryBatchNo,
+            @ApiParam(required = true, value = "手机号") @RequestParam String mobile,
+            @ApiParam(required = true, value = "验证码") @RequestParam String code,
+            @ApiParam(value = "结算单位") @RequestParam(required = false) List<String> summaryNumberList
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_SUMMARY_ISSUE + summaryBatchNo);
+        try {
+            if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
+                throw new RemoteServiceException("系统繁忙,请稍后再试");
+            }
+            dailyImportSummaryLogic.issueSalary(summaryBatchNo, summaryNumberList, mobile, code);
+        } catch (Exception e) {
+            log.error("发放失败 {}", e);
+        } finally {
+            obtain.unlock();
+        }
+        return ResponseHelper.success();
+    }
+
+    @GetMapping("/summary/list")
+    @ApiOperation(value = "结算网点汇总-日结")
+    public ResponseHelper<List<DailySummaryDataBean>> summaryList(
+            @ApiParam(required = true, value = "汇总批次号") @RequestParam String summaryBatchNo
+    ){
+        List<DailySummaryDataBean> page = dailyImportSummaryLogic.summaryList(summaryBatchNo);
+        return ResponseHelper.success(page);
+    }
+
+    @PostMapping("/worker/summary/list")
+    @ApiOperation(value = "师傅汇总-列表")
+    public ResponseHelper<IPage<SettleDailyIssueSummaryRecord>> workerSummaryList(
+            @ApiParam(value = "时间") @RequestParam(required = false) String month,
+            @ApiParam(value = "状态 1.未发放 2.已发放 3.银行处理中") @RequestParam(required = false) String status,
+            @ApiParam(value = "所属网点") @RequestParam(required = false) String websiteName,
+            @ApiParam(value = "所属网点(网点权限时必传)") @RequestParam(required = false) String websiteNumber,
+            @ApiParam(value = "服务人员") @RequestParam(required = false) String serviceName,
+            @ApiParam(value = "身份证号") @RequestParam(required = false) String idCard,
+            @ApiParam(value = "手机号") @RequestParam(required = false) String mobile,
+            @ApiParam(required = true, value = "汇总批次号") @RequestParam String summaryBatchNo,
+            @ApiParam(required = true, value = "结算单位") @RequestParam String summaryNumber,
+            @ApiParam(required = true, value = "页号") @RequestParam Integer pageNo,
+            @ApiParam(required = true, value = "页大小") @RequestParam Integer pageSize
+    ) {
+        IPage<SettleDailyIssueSummaryRecord> page = dailyImportSummaryLogic.workerSummaryList(summaryBatchNo,summaryNumber,month, status, websiteName, serviceName, idCard, mobile,websiteNumber, pageNo, pageSize);
+        return ResponseHelper.success(page);
+    }
+
+    @GetMapping("/worker/summary/export")
+    @ApiOperation(value = "师傅汇总列表-导出")
+    public void workerSummaryExport(
+            @ApiParam(value = "时间") @RequestParam(required = false) String month,
+            @ApiParam(value = "状态 1.未发放 2.已发放 3.银行处理中") @RequestParam(required = false) String status,
+            @ApiParam(value = "所属网点") @RequestParam(required = false) String websiteName,
+            @ApiParam(value = "所属网点(网点权限时必传)") @RequestParam(required = false) String websiteNumber,
+            @ApiParam(value = "服务人员") @RequestParam(required = false) String serviceName,
+            @ApiParam(value = "身份证号") @RequestParam(required = false) String idCard,
+            @ApiParam(value = "手机号") @RequestParam(required = false) String mobile,
+            @ApiParam(required = true, value = "汇总批次号") @RequestParam String summaryBatchNo,
+            @ApiParam(required = true, value = "结算单位") @RequestParam String summaryNumber,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        IPage<SettleDailyIssueSummaryRecord> page = dailyImportSummaryLogic.workerSummaryList(summaryBatchNo,summaryNumber,month, status, websiteName, serviceName, idCard, mobile, websiteNumber,1, -1);
+        ExcelData excelData = dailyImportSummaryLogic.workerSummaryExport(page.getRecords());
+        ExcelUtils.exportExcel(request, response, "师傅日结发放记录.xlsx", excelData);
+    }
+
+    @GetMapping("/worker/detail/list")
+    @ApiOperation(value = "师傅汇总-详情列表")
+    public ResponseHelper<IPage<DailyWorkerIssueSalaryBean>> workerDetailList(
+            @ApiParam(required = true, value = "页号") @RequestParam Integer pageNo,
+            @ApiParam(required = true, value = "页大小") @RequestParam Integer pageSize,
+            @ApiParam(required = true, value = "日结记录ID") @RequestParam Integer issueSalaryId
+
+    ) {
+        IPage<DailyWorkerIssueSalaryBean> page = dailyImportSummaryLogic.workerDetailList(issueSalaryId, pageNo, pageSize);
+        return ResponseHelper.success(page);
+    }
+
 }

+ 11 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/settle/repair/DailyWithholdController.java

@@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Slf4j
 @RestController
@@ -91,4 +92,14 @@ public class DailyWithholdController {
         dailyWithholdLogic.saveConfig(rate);
         return ResponseHelper.success();
     }
+
+    @GetMapping("/config/getbyCode")
+    @ApiOperation(value = "获取结算发放/查询手机号列表")
+    public ResponseHelper<List<SysDictCompany>> getConfigByCode(
+            @ApiParam(required = true, value = "查询: SELECT,发放:ISSUE") @RequestParam String code
+    )
+    {
+        List<SysDictCompany> dict = dailyWithholdLogic.getConfig(code);
+        return ResponseHelper.success(dict);
+    }
 }

+ 28 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/repair/settle/IsBuckleEnum.java

@@ -0,0 +1,28 @@
+package com.gree.mall.manager.enums.repair.settle;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum IsBuckleEnum implements BaseEnum,IEnum<Boolean> {
+    Y("true","已扣除"),
+    N("false","未扣除"),
+    ;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+
+
+    @Override
+    public Boolean getValue() {
+        return Boolean.parseBoolean(key);
+    }
+}

+ 30 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/repair/settle/IssueSummaryStatusEnum.java

@@ -0,0 +1,30 @@
+package com.gree.mall.manager.enums.repair.settle;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum IssueSummaryStatusEnum implements BaseEnum, IEnum<Integer> {
+    WAIT("1","待发放"),
+    END("2","已发放"),
+    HOLD("3","银行受理中"),
+    ERROR("4","发放失败"),
+    REJECT("5","驳回"),
+    ;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+    private final String remark;
+
+    @Override
+    public Integer getValue() {
+        return Integer.parseInt(key);
+    }
+}

+ 14 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/common/CommonLogic.java

@@ -436,6 +436,20 @@ public class CommonLogic {
         return number.toString();
     }
 
+    public String generateReqNo(String start, String orderType,int length) {
+        String dayFmt = DateUtil.format(new Date(), "yyyyMMdd");
+        String tNumKey = Constant.RedisPrefix.ORDER_NUM + orderType + dayFmt;
+        StringBuffer number = new StringBuffer();
+        number.append(start);
+        // number.append(dayFmt);
+        int ramainLen = length - number.toString().length();
+        //自增 填充位数
+        Object value = redisUtil.incr(tNumKey, 1);
+        redisUtil.expire(tNumKey, 24 * 60 * 60);
+        number.append(String.format("%0" + ramainLen + "d", Integer.parseInt(value.toString())));
+        return number.toString();
+    }
+
 
     /**
      * 获取跳往小程序的链接(带公众号openid)

+ 139 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/common/SMSLogic.java

@@ -0,0 +1,139 @@
+package com.gree.mall.manager.logic.common;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
+import com.aliyun.oss.ClientException;
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.plus.entity.SmsRecord;
+import com.gree.mall.manager.plus.service.SmsRecordService;
+import com.gree.mall.manager.utils.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+@Service
+@Slf4j
+public class SMSLogic {
+
+    @Value("${spring.profiles.active}")
+    private String profiles;
+    @Value("${ali.access.key.id}")
+    private String ACCESS_KEY_ID;
+    @Value("${ali.access.key.secert}")
+    private String ACCESS_KEY_SECERT;
+    @Value("${ali.sms.msg.code}")
+    private String TEMPLATE_SMS_CODE;
+
+    private static final String smsSignName = "格力客服中心";
+
+    @Resource
+    RedisUtil redisUtil;
+    @Resource
+    SmsRecordService smsRecordService;
+
+
+    public void sendSms(String constantStr, String mobile, String type, int expireSec) throws Exception {
+        //限制不能频繁发送
+        this.checkSendTime(constantStr, mobile);
+
+        //6位随机数
+        if(!profiles.equals("prd")){
+            //记录发送的code
+            redisUtil.set(constantStr + mobile, "000000", expireSec);
+        } else {
+            Random random = new Random();
+            int num = (int) (random.nextDouble() * (1000000 - 100000) + 100000);
+            String code = String.format("%06d", num);
+            HashMap<String, String> map = new HashMap<>();
+            map.put("code", code);
+            String content = this.send(mobile, TEMPLATE_SMS_CODE, map);
+
+            String beforeDate = DateUtil.formatDate(new Date());
+            long count = smsRecordService.count(new LambdaQueryWrapper<SmsRecord>()
+                    .eq(SmsRecord::getPhone, mobile)
+                    .eq(SmsRecord::getType, type)
+                    .ge(SmsRecord::getCreateTime, beforeDate + " 00:00:00")
+                    .le(SmsRecord::getCreateTime, beforeDate + " 23:59:59"));
+            // 一天内超过10次单一手机号同类型,不再发短信
+            if (count > 10) {
+                throw new RemoteServiceException("今天发送短信次数超过10次,停止发送!");
+            }
+            //记录短信内容
+            SmsRecord smsRecord = new SmsRecord();
+            smsRecord.setPhone(mobile);
+            smsRecord.setContent(content);
+            smsRecord.setCreateTime(new Date());
+            smsRecord.insert();
+
+            //记录发送的code
+            redisUtil.set(constantStr + mobile, code, expireSec);
+        }
+    }
+
+    /**
+     * 验证手机号码两次发送的间隔,不能太短
+     *
+     * @param mobile 手机号码
+     * @throws
+     */
+    private void checkSendTime(String constantStr, String mobile) throws RemoteServiceException {
+        String key = constantStr + mobile;
+        long expire = redisUtil.getExpire(key);
+        if(Constant.SMS_EXPIRE - 60 < expire){
+            throw new RemoteServiceException("发送短信间隔时间太短,请耐心等候");
+        }
+
+    }
+
+    public String send(String mobile, String templateCode, HashMap<String, String> param) throws ClientException, com.aliyuncs.exceptions.ClientException {
+        if(!profiles.equals("prd")){
+            log.info("test send msg success mobile :{} ,param:{}",mobile,param);
+            return "";
+        }
+
+        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECERT);
+        IAcsClient client = new DefaultAcsClient(profile);
+
+        CommonRequest request = new CommonRequest();
+        request.setMethod(MethodType.POST);
+        request.setDomain("dysmsapi.aliyuncs.com");
+        request.setVersion("2017-05-25");
+        request.setAction("SendSms");
+        request.putQueryParameter("RegionId", "cn-hangzhou");
+        request.putQueryParameter("PhoneNumbers", mobile);
+        request.putQueryParameter("SignName", smsSignName);  // 需要在平台上添加
+        request.putQueryParameter("TemplateCode", templateCode);  // 模版id 需要在拼台上添加
+
+        String content = JSON.toJSONString(param);
+        log.info("短信发送的内容" + content + mobile);
+        request.putQueryParameter("TemplateParam", content);
+        CommonResponse response = client.getCommonResponse(request);
+        //打印返回数据
+        log.info("短信验证返回数据 :" + response.getData());
+
+        String dateRes = response.getData();
+        Map<String,Object> smsRsp = JSON.parseObject(dateRes);
+        //获取数据
+        String codeRes = smsRsp.get("Code").toString();
+        if(!codeRes.equals("OK")) {
+            log.error("短信发送失败,mobile:{}",mobile);
+        }
+        return content;
+    }
+
+
+}

+ 112 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/DailyImportSummaryLogic.java

@@ -1,10 +1,12 @@
 package com.gree.mall.manager.logic.settle.repair;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.ExcelData;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
 import com.gree.mall.manager.bean.settle.repair.*;
 import com.gree.mall.manager.commonmapper.CommonMapper;
@@ -19,6 +21,7 @@ import com.gree.mall.manager.plus.entity.*;
 import com.gree.mall.manager.plus.service.*;
 import com.gree.mall.manager.utils.CommonUtils;
 import com.gree.mall.manager.utils.DateUtils;
+import com.gree.mall.manager.utils.RedisUtil;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
 import lombok.RequiredArgsConstructor;
@@ -33,6 +36,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -54,6 +58,8 @@ public class DailyImportSummaryLogic {
     private final SettleDailyResidualInsuranceService settleDailyResidualInsuranceService;
     private final SettleDailyRemaineBuckleService settleDailyRemaineBuckleService;
     private final SettleDailyIncrDecrCostService settleDailyIncrDecrCostService;
+    private final RedisUtil redisUtil;
+    private final DailyTransferLogic dailyTransferLogic;
 
 
     public IPage<DailyImportSummaryVO> page(ZfireParamBean zfireParamBean) {
@@ -1177,4 +1183,110 @@ public class DailyImportSummaryLogic {
 
         return commonMapper.buckleList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
     }
+
+
+
+    /**
+     * 发放日结工资
+     */
+    @Transactional
+    public void issueSalary(String summaryBatchNo, List<String> summaryNumberList, String mobile, String code) throws Exception {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+        //验证手机验证码
+        Object validMessageCode = redisUtil.get(Constant.RedisPrefix.ISSUE_SAL_MOBILE_SMS + mobile);
+        if (validMessageCode == null || code == null) {
+            throw new RemoteServiceException("请先发送验证码");
+        }
+        if (!code.equals(validMessageCode.toString())) {
+            throw new RemoteServiceException("短信验证码输入错误");
+        }
+        summaryNumberList = dailyTransferLogic.issueCheck(summaryBatchNo, summaryNumberList, false, adminUser);
+        dailyTransferLogic.issueSalary(summaryBatchNo, summaryNumberList, false, adminUser);
+
+        redisUtil.del(Constant.RedisPrefix.ISSUE_SAL_MOBILE_SMS + mobile);
+    }
+
+    public List<DailySummaryDataBean> summaryList(String summaryBatchNo) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        List<DailySummaryDataBean> list = dailyMapper.summaryDayList(summaryBatchNo, adminUser.getCompanyWechatIds(), adminUser.getAdminWebsitIds());
+        return list;
+
+    }
+
+    public IPage<DailySummaryDataBean> cwSummaryList(String summaryBatchNo, String summaryStartTime, String summaryEndTime, String issueStartTime, String issueEndTime, Integer status, Integer pageNum, Integer pageSize) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        IPage<DailySummaryDataBean> page = dailyMapper.cwSummaryList(new Page(pageNum, pageSize),summaryBatchNo,summaryStartTime,summaryEndTime,issueStartTime,issueEndTime,status,
+                adminUser.getCompanyWechatIds(), adminUser.getAdminWebsitIds());
+        return page;
+    }
+
+    public IPage<SettleDailyIssueSummaryRecord> workerSummaryList(String summaryBatchNo, String summaryCommpany, String month, String status,
+                                                                  String websiteName, String serviceName, String idCard, String mobile, String websitNumber, Integer pageNo, Integer pageSize) {
+        if (StringUtils.isNotEmpty(month)) {
+            month = month.replaceAll("-", "");
+        }
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        return settleDailyIssueSummaryRecordService.lambdaQuery()
+                .eq(CollectionUtil.isNotEmpty(adminUser.getCompanyWechatIds()), SettleDailyIssueSummaryRecord::getCompanyWechatId, adminUser.getCompanyWechatIds())
+                .eq(CollectionUtil.isNotEmpty(adminUser.getAdminWebsitIds()), SettleDailyIssueSummaryRecord::getWebsitNumber, adminUser.getAdminWebsitIds())
+                .eq(StringUtils.isNotEmpty(summaryBatchNo), SettleDailyIssueSummaryRecord::getSummaryBatchNo, summaryBatchNo)
+                .eq(StringUtils.isNotEmpty(summaryCommpany), SettleDailyIssueSummaryRecord::getSummaryNumber, summaryCommpany)
+                .eq(StringUtils.isNotEmpty(month), SettleDailyIssueSummaryRecord::getMonth, month)
+                .eq(StringUtils.isNotEmpty(status), SettleDailyIssueSummaryRecord::getStatus, status)
+                .eq(StringUtils.isNotEmpty(websiteName), SettleDailyIssueSummaryRecord::getWebsitName, websiteName)
+                .eq(StringUtils.isNotEmpty(serviceName), SettleDailyIssueSummaryRecord::getServiceName, serviceName)
+                .eq(StringUtils.isNotEmpty(mobile), SettleDailyIssueSummaryRecord::getMobile, mobile)
+                .eq(StringUtils.isNotEmpty(idCard), SettleDailyIssueSummaryRecord::getIdCard, idCard)
+                .orderByDesc(SettleDailyIssueSummaryRecord::getCreateTime, SettleDailyIssueSummaryRecord::getServiceName)
+                .page(new Page<>(pageNo, pageSize));
+    }
+
+    public ExcelData workerSummaryExport(List<SettleDailyIssueSummaryRecord> dailyIssueSummaryRecords) {
+        String[] titles = new String[]{"工资条编号","发放月份","状态","所属网点","网点编号","服务人员","服务人员编号",
+                "身份证","手机号","本次维修结算费用","需扣回费用(应扣)","需扣回费用(已扣)","增减费用",
+                "工伤保险(应扣)","工伤保险(已扣)","残保金(应扣)","残保金(已扣)","暂扣款应扣","应发金额","备注"};
+        List<List<Object>> rows = new ArrayList<>();
+        for(SettleDailyIssueSummaryRecord bean : dailyIssueSummaryRecords){
+            List<Object> row = new ArrayList<>();
+            row.add(bean.getSalaryNo());
+            row.add(bean.getMonth());
+            row.add(CommonUtils.getIssueStatus(bean.getStatus()));
+            row.add(bean.getWebsitName());
+            row.add(bean.getWebsitNumber());
+            row.add(bean.getServiceName());
+            row.add(bean.getServiceNumber());
+            row.add(bean.getIdCard());
+            row.add(bean.getMobile());
+            row.add(bean.getRepairTotalAmount());
+            row.add(bean.getShouldReduceCost());
+            row.add(bean.getReduceCost());
+            row.add(bean.getIncrDecrCost());
+            row.add(bean.getShouldEmpInsuranceCost());
+            row.add(bean.getEmpInsuranceCost());
+            row.add(bean.getShouldResidualInsuranceCost());
+            row.add(bean.getResidualInsuranceCost());
+            row.add(bean.getWithholdCost());
+            row.add(bean.getIssueCost());
+            row.add(bean.getRemark());
+            // row.add(bean.getWithholdTotalCost());
+            // row.add(DateUtils.formatDate(bean.getCreateTime()));
+            rows.add(row);
+        }
+        ExcelData excelData = new ExcelData();
+        excelData.setRows(rows);
+        excelData.setTitles(Arrays.asList(titles));
+        return excelData;
+    }
+
+    public IPage<DailyWorkerIssueSalaryBean> workerDetailList(Integer issueSalaryId, Integer pageNum, Integer pageSize) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        return  dailyMapper.workerDetailList(new Page(pageNum, pageSize),issueSalaryId,adminUser.getCompanyWechatIds(),adminUser.getAdminWebsitIds());
+    }
 }

+ 598 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/DailyTransferLogic.java

@@ -0,0 +1,598 @@
+package com.gree.mall.manager.logic.settle.repair;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.settle.repair.DailyWokerBankCardMonthBean;
+import com.gree.mall.manager.bean.settle.repair.DailyWorkerBankCardBean;
+import com.gree.mall.manager.bean.settle.repair.cmc.BankCardInfoBean;
+import com.gree.mall.manager.bean.settle.repair.cmc.PayItem;
+import com.gree.mall.manager.bean.settle.repair.cmc.ReceivedItem;
+import com.gree.mall.manager.commonmapper.DailyMapper;
+import com.gree.mall.manager.constant.DailyConstant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.logic.settle.repair.cmc.CmcBankLogic;
+import com.gree.mall.manager.plus.entity.*;
+import com.gree.mall.manager.plus.service.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class DailyTransferLogic {
+
+    private final SettleDailyIssueTaskService settleDailyIssueTaskService;
+    private final SettleDailyBankCardBalanceService settleDailyBankCardBalanceService;
+    private final SettleDailyIssueSummaryMonthRecordService settleDailyIssueSummaryMonthRecordService;
+    private final SettleDailyIssueSummaryRecordService settleDailyIssueSummaryRecordService;
+    private final SettleDailyBankTransferRecordService settleDailyBankTransferRecordService;
+    private final DailyMapper dailyMapper;
+    private final CmcBankLogic cmcBankLogic;
+    private final CommonLogic commonLogic;
+
+    @Transactional
+    public List<String> issueCheck(String summaryBatchNo, List<String> summaryNumberList, boolean isMonth, AdminUserCom adminUser) {
+        Integer count = settleDailyIssueTaskService.lambdaQuery()
+                .eq(SettleDailyIssueTask::getSummaryBatchNo, summaryBatchNo)
+                .eq(SettleDailyIssueTask::getTaskStatus, 1)
+                .in(summaryNumberList != null && summaryNumberList.size() > 0, SettleDailyIssueTask::getSummaryNumber, summaryNumberList)
+                .count();
+        if (count > 0) {
+            throw new RemoteServiceException("当前汇总批次号已发放,请勿重复执行。");
+        }
+
+        //任务发发放表
+        List<SettleDailyIssueTask> list = new ArrayList<>();
+        if (summaryNumberList == null || summaryNumberList.size() == 0) {
+            summaryNumberList = new ArrayList<>();
+            List<Map<String, Object>> summaryMap = new ArrayList<>();
+            if (isMonth) {
+                summaryMap = dailyMapper.querySummaryMonthNumber(summaryBatchNo, adminUser.getAdminCompanyWechat().getCompanyWechatId());
+            } else {
+                summaryMap = dailyMapper.querySummaryNumber(summaryBatchNo, adminUser.getAdminCompanyWechat().getCompanyWechatId());
+            }
+
+            if (summaryMap.size() == 0) {
+                throw new RemoteServiceException("没有找到可执行结算单位。");
+            }
+            for (Map item : summaryMap) {
+                summaryNumberList.add(item.get("summaryNumber").toString());
+            }
+        }
+
+        if (summaryNumberList == null || summaryNumberList.size() == 0) {
+            throw new RemoteServiceException("没有可结算的单位");
+        }
+
+        for (String item : summaryNumberList) {
+            SettleDailyIssueTask issueTask = new SettleDailyIssueTask();
+            issueTask.setTaskStatus(1);
+            issueTask.setSummaryBatchNo(summaryBatchNo);
+            issueTask.setSummaryNumber(item);
+            issueTask.setIsMonth(isMonth);
+            issueTask.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+            issueTask.setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName());
+            list.add(issueTask);
+        }
+        settleDailyIssueTaskService.saveBatch(list);
+        return summaryNumberList;
+    }
+
+    /**
+     * 工资发放 (异步)
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void issueSalary(String summaryBatchNo, List<String> summaryNumberList, Boolean isMonth, AdminUserCom adminUser) {
+        String opName = adminUser.getNickName();
+        ThreadUtil.execute(() -> {
+            for (String summaryNumber : summaryNumberList) {
+                if (isMonth) {
+                    issueMonthBySummaryNumber(summaryBatchNo, summaryNumber, opName, adminUser);
+                } else {
+                    issueBySummaryNumber(summaryBatchNo, summaryNumber, opName, adminUser);
+                }
+            }
+        });
+    }
+
+    @Transactional
+    public void issueMonthBySummaryNumber(String summaryBatchNo, String summaryNumber, String opName, AdminUserCom adminUser) {
+        //查询当前账号授权列表
+        try {
+            //查询结算单位对应银行授权账号
+            SettleDailyBankCardBalance authBankCard = settleDailyBankCardBalanceService.lambdaQuery()
+                    .eq(SettleDailyBankCardBalance::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                    .eq(SettleDailyBankCardBalance::getSummaryNumber, summaryNumber)
+                    .one();
+            if (authBankCard == null) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                log.warn("查询授权账号失败");
+                return;
+            }
+            String bankCardId = authBankCard.getBankCardId();
+            String bankCardCode = authBankCard.getOpenBankOrgId();
+
+            List<BankCardInfoBean> beans = new ArrayList<>();
+            beans.add(new BankCardInfoBean(bankCardId, bankCardCode, "2", null));
+
+            String authBankId = authBankCard.getAuthAccountId();
+
+            //查询协议
+            Map<String, Object> protocolMap = cmcBankLogic.queryProtocol(new BankCardInfoBean(bankCardId, bankCardCode, null, authBankId), summaryNumber);
+            if (DailyConstant.CMC_RESPONSE_FAIL_CODE.equals(protocolMap.get("code").toString())) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                log.warn("查询授协议失败");
+                return;
+            }
+            List<Map<String, Object>> protocolList = (List<Map<String, Object>>) protocolMap.get("data");
+            String protocolStr = protocolList.get(0).get("cnvnbr").toString();
+            String ccynbrStr = protocolList.get(0).get("ccynbr").toString();
+            String bustypStr = protocolList.get(0).get("bustyp").toString();
+
+            //查询列表
+            List<DailyWokerBankCardMonthBean> bankList = dailyMapper.queryIssueSalaryMonthBankCardInfo(summaryBatchNo, summaryNumber, DailyConstant.ISSUE_STATUS_NOT, adminUser.getAdminCompanyWechat().getCompanyWechatId());
+            if (bankList == null || bankList.size() == 0) {
+                log.warn("没有可发放数据");
+                deleteTask(summaryBatchNo, summaryNumber);
+                return;
+            }
+
+            List<SettleDailyIssueSummaryMonthRecord> issueSummaryRecords = new ArrayList<>();
+            String queryDate = DateUtil.format(new Date(), "yyyyMMdd");
+            List<ReceivedItem> receiveList = new ArrayList<>();
+            BigDecimal totalIssueCost = bankList.stream().map(DailyWokerBankCardMonthBean::getMonthSendCost).reduce(BigDecimal.ZERO, BigDecimal::add);
+            PayItem payItem = new PayItem();
+
+            String issueBatchNo = commonLogic.generateNo("FF", "issueBatchNo", 15);
+            // 金额大于0才发放
+
+            payItem.setTtlamt(totalIssueCost.toString());
+            payItem.setTtlcnt(bankList.size() + "");
+            payItem.setCuramt(totalIssueCost.toString());
+            payItem.setCurcnt(bankList.size() + "");
+            payItem.setCnvnbr(protocolStr);
+            //BYBC 代发劳务收入BYBK 代发其他BYFN 代发奖金BYSA 代发工资BYTF 代发报销款
+            payItem.setAgctyp(bustypStr);
+            //10:人民币
+            payItem.setCcynbr(ccynbrStr);
+            //分行号
+            payItem.setBbknbr(bankCardCode);
+            payItem.setAccnbr(bankCardId);
+            //授权账号
+            payItem.setAutacc(authBankId);
+            String reqNo = commonLogic.generateNo("cmc", "requstNo", 15);
+            payItem.setYurref(reqNo);
+            payItem.setEptdat(queryDate);
+            payItem.setEpttim(DateUtil.format(new Date(), "HHmmss"));
+            payItem.setTrsrmk("月结工资");
+
+            for (DailyWokerBankCardMonthBean workBean : bankList) {
+                if (workBean.getMonthSendCost() != null && workBean.getMonthSendCost().doubleValue() > 0) {
+                    String itemReqNo = commonLogic.generateReqNo("1", "requstNo", 8);
+                    String depositBank = workBean.getDepositBank();
+                    String bankAddr = workBean.getBankAddr();
+                    String isCmcBank = "N";
+                    if (workBean.getDepositBank().contains("招商银行")) {
+                        isCmcBank = "Y";
+                        depositBank = "";
+                        bankAddr = "";
+                    }
+                    ReceivedItem receivedItem = new ReceivedItem(
+                            itemReqNo,
+                            workBean.getBankAccount(),
+                            workBean.getBankAccountName(),
+                            workBean.getMonthSendCost().toString(),
+                            isCmcBank,
+                            depositBank,
+                            bankAddr
+                    );
+                    receiveList.add(receivedItem);
+
+                    SettleDailyIssueSummaryMonthRecord record = new SettleDailyIssueSummaryMonthRecord();
+                    BeanUtils.copyProperties(workBean, record);
+                    record.setRequestNo(itemReqNo);
+                    record.setStatus(DailyConstant.ISSUE_STATUS_BANK_DO);
+                    record.setIssueBy(opName);
+                    record.setIssueTime(new Date());
+                    record.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+                    record.setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName());
+                    issueSummaryRecords.add(record);
+                }
+            }
+            if (receiveList.size() == 0) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                log.warn("kPay: 没有可转账的数据");
+                return;
+            }
+            Map<String, Object> payMap = cmcBankLogic.insteadIssue(payItem, receiveList, summaryNumber);
+            if (DailyConstant.CMC_RESPONSE_FAIL_CODE.equals(payMap.get("code").toString())) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                return;
+            }
+            //拿到流程实例号
+            List<Map<String, Object>> insteadIssueList = (List<Map<String, Object>>) payMap.get("data");
+            String reqnbr = insteadIssueList.get(0).get("reqnbr").toString();
+
+            //修改对应的状态为发放中
+            settleDailyIssueSummaryMonthRecordService.updateBatchById(issueSummaryRecords, 500);
+            //等待10S 查询转账转态
+            //Thread.sleep(1000 * 10);
+            Integer issueStatus = queryMonthTransferResult(issueSummaryRecords, bankList, reqnbr, queryDate, summaryNumber, adminUser);
+            //记录单次记录
+            saveCallApiRecord(issueBatchNo, totalIssueCost, issueStatus, opName, reqnbr, adminUser);
+            settleDailyIssueTaskService.lambdaUpdate()
+                    .set(SettleDailyIssueTask::getTaskStatus, 2)
+                    .set(SettleDailyIssueTask::getRequestNo, reqnbr)
+                    .eq(SettleDailyIssueTask::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                    .eq(SettleDailyIssueTask::getSummaryNumber, summaryNumber)
+                    .eq(SettleDailyIssueTask::getSummaryBatchNo, summaryBatchNo)
+                    .update();
+        } catch (Exception e) {
+            deleteTask(summaryBatchNo, summaryNumber);
+            log.info("【月结转账异常】 {} ", e);
+        }
+
+    }
+
+    @Transactional
+    public void issueBySummaryNumber(String summaryBatchNo, String summaryNumber, String opName, AdminUserCom adminUser) {
+        //查询当前账号授权列表
+        try {
+            //查询结算单位对应银行授权账号
+            SettleDailyBankCardBalance authBankCard = settleDailyBankCardBalanceService.lambdaQuery()
+                    .eq(SettleDailyBankCardBalance::getCompanyWechatId, adminUser.getAdminUserId())
+                    .eq(SettleDailyBankCardBalance::getSummaryNumber, summaryNumber)
+                    .one();
+            if (authBankCard == null) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                log.warn("查询授权账号失败");
+                //  throw new RemoteServiceException("查询授权账号失败");
+                return;
+            }
+
+
+            String bankCardId = authBankCard.getBankCardId();
+            String bankCardCode = authBankCard.getOpenBankOrgId();
+
+//            List<BankCardInfoBean> beans = new ArrayList<>();
+//            beans.add(new BankCardInfoBean(bankCardId, bankCardCode, "2", null));
+//
+//            Map<String, Object> authMap = cmcBankLogic.getAuthAccount(beans,summaryNumber);
+//            if (DailyConstant.CMC_RESPONSE_FAIL_CODE.equals(authMap.get("code").toString())) {
+//                deleteTask(summaryBatchNo,summaryNumber);
+//                log.warn("查询授权账号失败");
+//                //throw new RemoteServiceException("查询授权账号失败");
+//                return;
+//            }
+//            //拿到授权账号
+//            List<Map<String, Object>> authList = (List<Map<String, Object>>) authMap.get("data");
+            String authBankId = authBankCard.getAuthAccountId();
+
+            //查询协议
+            Map<String, Object> protocolMap = cmcBankLogic.queryProtocol(new BankCardInfoBean(bankCardId, bankCardCode, null, authBankId), summaryNumber);
+            if (DailyConstant.CMC_RESPONSE_FAIL_CODE.equals(protocolMap.get("code").toString())) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                log.warn("查询授协议失败");
+                //throw new RemoteServiceException("查询授协议失败");
+                return;
+            }
+            List<Map<String, Object>> protocolList = (List<Map<String, Object>>) protocolMap.get("data");
+            String protocolStr = protocolList.get(0).get("cnvnbr").toString();
+            String ccynbrStr = protocolList.get(0).get("ccynbr").toString();
+            String bustypStr = protocolList.get(0).get("bustyp").toString();
+
+            //查询列表
+            List<DailyWorkerBankCardBean> bankList = dailyMapper.queryIssueSalaryAndBankCardInfo(summaryBatchNo, summaryNumber, DailyConstant.ISSUE_STATUS_NOT, adminUser.getAdminCompanyWechat().getCompanyWechatId());
+
+            List<SettleDailyIssueSummaryRecord> issueSummaryRecords = new ArrayList<>();
+            String queryDate = DateUtil.format(new Date(), "yyyyMMdd");
+            List<ReceivedItem> receiveList = new ArrayList<>();
+            BigDecimal totalIssueCost = bankList.stream().map(DailyWorkerBankCardBean::getIssueCost).reduce(BigDecimal.ZERO, BigDecimal::add);
+            PayItem payItem = new PayItem();
+
+            String issueBatchNo = commonLogic.generateNo("FF", "issueBatchNo", 15);
+            // 金额大于0才发放
+            if (bankList != null && bankList.size() > 0) {
+                payItem.setTtlamt(totalIssueCost.toString());
+                payItem.setTtlcnt(bankList.size() + "");
+                payItem.setCuramt(totalIssueCost.toString());
+                payItem.setCurcnt(bankList.size() + "");
+                payItem.setCnvnbr(protocolStr);
+                //BYBC 代发劳务收入BYBK 代发其他BYFN 代发奖金BYSA 代发工资BYTF 代发报销款
+                payItem.setAgctyp(bustypStr);
+                //10:人民币
+                payItem.setCcynbr(ccynbrStr);
+                //分行号
+                payItem.setBbknbr(bankCardCode);
+                payItem.setAccnbr(bankCardId);
+                //授权账号
+                payItem.setAutacc(authBankId);
+                String reqNo = commonLogic.generateNo("cmc", "requstNo", 15);
+                payItem.setYurref(reqNo);
+                payItem.setEptdat(queryDate);
+                payItem.setEpttim(DateUtil.format(new Date(), "HHmmss"));
+                payItem.setTrsrmk("日结工资");
+
+                for (DailyWorkerBankCardBean workBean : bankList) {
+                    if (workBean.getIssueCost().doubleValue() > 0) {
+                        String itemReqNo = commonLogic.generateReqNo("1", "requstNo", 8);
+                        String depositBank = workBean.getDepositBank();
+                        String bankAddr = workBean.getBankAddr();
+                        String isCmcBank = "N";
+                        if (workBean.getDepositBank().contains("招商银行")) {
+                            isCmcBank = "Y";
+                            depositBank = "";
+                            bankAddr = "";
+                        }
+                        ReceivedItem receivedItem = new ReceivedItem(
+                                itemReqNo,
+                                workBean.getBankAccount(),
+                                workBean.getBankAccountName(),
+                                workBean.getIssueCost().toString(),
+                                isCmcBank,
+                                depositBank,
+                                bankAddr
+                        );
+                        receiveList.add(receivedItem);
+
+                        SettleDailyIssueSummaryRecord record = new SettleDailyIssueSummaryRecord();
+                        BeanUtils.copyProperties(workBean, record);
+                        record.setRequestNo(itemReqNo);
+                        record.setStatus(DailyConstant.ISSUE_STATUS_BANK_DO);
+                        record.setIssueBatchNo(issueBatchNo);
+                        record.setIssueBy(opName);
+                        record.setIssueTime(new Date());
+                        record.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+                        record.setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName());
+                        issueSummaryRecords.add(record);
+                    }
+
+                }
+            }
+            if (receiveList.size() == 0) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                log.warn("kPay: 日结没有可转账的数据");
+                //throw new RemoteServiceException("没有可转账的数据");
+                return;
+            }
+            Map<String, Object> payMap = cmcBankLogic.insteadIssue(payItem, receiveList, summaryNumber);
+            if (DailyConstant.CMC_RESPONSE_FAIL_CODE.equals(payMap.get("code").toString())) {
+                deleteTask(summaryBatchNo, summaryNumber);
+                log.warn("kPay: 待扣支付失败");
+                //throw new RemoteServiceException("待扣支付失败");
+                return;
+            }
+            //拿到流程实例号
+            List<Map<String, Object>> insteadIssueList = (List<Map<String, Object>>) payMap.get("data");
+            String reqnbr = insteadIssueList.get(0).get("reqnbr").toString();
+
+            //修改对应的状态为发放中
+            settleDailyIssueSummaryRecordService.updateBatchById(issueSummaryRecords, 500);
+            //等待10S 查询转账转态
+            //Thread.sleep(1000 * 10);
+            Integer issueStatus = queryTransferResult(issueSummaryRecords, bankList, reqnbr, queryDate, summaryNumber, adminUser);
+            //记录单次记录
+            saveCallApiRecord(issueBatchNo, totalIssueCost, issueStatus, opName, reqnbr, adminUser);
+            settleDailyIssueTaskService.lambdaUpdate()
+                    .set(SettleDailyIssueTask::getTaskStatus, 2)
+                    .set(SettleDailyIssueTask::getRequestNo, reqnbr)
+                    .eq(SettleDailyIssueTask::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                    .eq(SettleDailyIssueTask::getSummaryNumber, summaryNumber)
+                    .eq(SettleDailyIssueTask::getSummaryBatchNo, summaryBatchNo)
+                    .update();
+        } catch (Exception e) {
+            deleteTask(summaryBatchNo, summaryNumber);
+            log.warn("【日结批量经办异常】", e);
+        }
+
+    }
+
+    @Transactional
+    public void deleteTask(String summaryBatchNo, String summaryNumber) {
+        settleDailyIssueTaskService.lambdaUpdate()
+                .eq(SettleDailyIssueTask::getSummaryBatchNo, summaryBatchNo)
+                .eq(SettleDailyIssueTask::getSummaryNumber, summaryNumber)
+                .eq(SettleDailyIssueTask::getTaskStatus, 1)
+                .remove();
+    }
+
+    @Transactional
+    public Integer queryMonthTransferResult(List<SettleDailyIssueSummaryMonthRecord> issueSummaryRecords, List<DailyWokerBankCardMonthBean> bankList, String reqnbr, String queryDate, String summaryNumber, AdminUserCom adminUser) throws Exception {
+        Map<String, Object> payResultMap = cmcBankLogic.insteadResult(reqnbr, summaryNumber);
+        Integer issueStaus = DailyConstant.ISSUE_STATUS_BANK_DO;
+        if (DailyConstant.CMC_RESPONSE_SUCCESS_CODE.equals(payResultMap.get("code").toString())) {
+            List<Map<String, Object>> payResultList = (List<Map<String, Object>>) payResultMap.get("data");
+            List<SettleDailyIssueSummaryMonthRecord> transferSuccessList = new ArrayList<>();
+            List<SettleDailyIssueSummaryMonthRecord> transferFailedList = new ArrayList<>();
+            for (Map map : payResultList) {
+                //汇款业务状态
+                String transferResult = map.get("trssts").toString();
+                for (SettleDailyIssueSummaryMonthRecord issueSummaryRecord : issueSummaryRecords) {
+                    if (map.get("trsseq").toString().equals(issueSummaryRecord.getRequestNo())) {
+                        issueSummaryRecord.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+                        issueSummaryRecord.setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName());
+                        //转账成功的记录
+                        if (Arrays.asList(DailyConstant.TRANSFER_RESP_SUCCESS).contains(transferResult)) {
+                            issueSummaryRecord.setStatus(DailyConstant.ISSUE_STATUS_SUCCESS);
+                            issueSummaryRecord.setUpdateTime(new Date());
+                            //issueSummaryRecord.setEmpInsuranceCost(issueSummaryRecord.getShouldEmpInsuranceCost());
+                            //issueSummaryRecord.setResidualInsuranceCost(issueSummaryRecord.getShouldResidualInsuranceCost());
+                            //issueSummaryRecord.setReduceCost(issueSummaryRecord.getShouldReduceCost());
+                            issueSummaryRecord.setWithholdTotalCost(issueSummaryRecord.getWithholdCost());
+                            //issueSummaryRecord.setIssueTimeFmt(queryDate);
+                            issueSummaryRecord.setRemark("");
+
+                            transferSuccessList.add(issueSummaryRecord);
+                        }
+                        //失败的记录
+                        if (Arrays.asList(DailyConstant.TRANSFER_RESP_FAILED).contains(transferResult)) {
+                            issueSummaryRecord.setStatus(DailyConstant.ISSUE_STATUS_FAILED);
+                            issueSummaryRecord.setUpdateTime(new Date());
+                            issueSummaryRecord.setRemark(map.get("errtxt").toString());
+                            transferFailedList.add(issueSummaryRecord);
+                        }
+                    }
+                }
+            }
+            if (transferSuccessList.size() == bankList.size()) {
+                issueStaus = DailyConstant.ISSUE_STATUS_SUCCESS;
+            }
+            if (transferFailedList.size() == bankList.size()) {
+                issueStaus = DailyConstant.ISSUE_STATUS_FAILED;
+            }
+            if (transferSuccessList.size() > 0) {
+                settleDailyIssueSummaryMonthRecordService.updateBatchById(transferSuccessList, 500);
+            }
+
+            if (transferFailedList.size() > 0) {
+                settleDailyIssueSummaryMonthRecordService.updateBatchById(transferFailedList, 500);
+            }
+        }
+        return issueStaus;
+    }
+
+    @Transactional
+    public void saveCallApiRecord(String issueBatchNo, BigDecimal totalAmount, Integer issueStatus, String nickName, String reqnbr, AdminUserCom adminUser) {
+        SettleDailyBankTransferRecord record = new SettleDailyBankTransferRecord();
+        record.setCallApiTime(new Date());
+        record.setCallBackMessage("");
+        record.setCreateTime(new Date());
+        record.setCreateBy(nickName);
+        record.setDoTime(new Date());
+        record.setDoBy(nickName);
+        record.setCallStatus(1);
+        record.setReqNo(reqnbr);
+        record.setIssueStatus(issueStatus);
+        record.setIssueBatchNo(issueBatchNo);
+        record.setSummaryAmount(totalAmount);
+        record.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+        record.setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName());
+        record.insert();
+    }
+
+    @Transactional
+    public Integer queryTransferResult(List<SettleDailyIssueSummaryRecord> issueSummaryRecords, List<DailyWorkerBankCardBean> bankList, String reqnbr, String queryDate, String summaryNumber, AdminUserCom adminUser) throws Exception {
+        Map<String, Object> payResultMap = cmcBankLogic.insteadResult(reqnbr, summaryNumber);
+        Integer issueStaus = DailyConstant.ISSUE_STATUS_BANK_DO;
+        if (DailyConstant.CMC_RESPONSE_SUCCESS_CODE.equals(payResultMap.get("code").toString())) {
+            List<Map<String, Object>> payResultList = (List<Map<String, Object>>) payResultMap.get("data");
+            List<SettleDailyIssueSummaryRecord> transferSuccessList = new ArrayList<>();
+            List<SettleDailyIssueSummaryRecord> transferFailedList = new ArrayList<>();
+            for (Map map : payResultList) {
+                //汇款业务状态
+                String transferResult = map.get("trssts").toString();
+                for (SettleDailyIssueSummaryRecord issueSummaryRecord : issueSummaryRecords) {
+                    if (map.get("trsseq").toString().equals(issueSummaryRecord.getRequestNo())) {
+                        issueSummaryRecord.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+                        issueSummaryRecord.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyName());
+                        //转账成功的记录
+                        if (Arrays.asList(DailyConstant.TRANSFER_RESP_SUCCESS).contains(transferResult)) {
+                            issueSummaryRecord.setStatus(DailyConstant.ISSUE_STATUS_SUCCESS);
+                            issueSummaryRecord.setUpdateTime(new Date());
+                            issueSummaryRecord.setIssueTimeFmt(queryDate);
+                            //issueSummaryRecord.setEmpInsuranceCost(issueSummaryRecord.getShouldEmpInsuranceCost());
+                            //issueSummaryRecord.setResidualInsuranceCost(issueSummaryRecord.getShouldResidualInsuranceCost());
+                            //issueSummaryRecord.setReduceCost(issueSummaryRecord.getShouldReduceCost());
+                            issueSummaryRecord.setWithholdTotalCost(issueSummaryRecord.getWithholdCost());
+                            issueSummaryRecord.setRemark("");
+                            transferSuccessList.add(issueSummaryRecord);
+                        }
+                        //失败的记录
+                        if (Arrays.asList(DailyConstant.TRANSFER_RESP_FAILED).contains(transferResult)) {
+                            issueSummaryRecord.setStatus(DailyConstant.ISSUE_STATUS_FAILED);
+                            issueSummaryRecord.setUpdateTime(new Date());
+                            issueSummaryRecord.setRemark(map.get("errtxt").toString());
+                            transferFailedList.add(issueSummaryRecord);
+                        }
+                    }
+                }
+            }
+            if (transferSuccessList.size() == bankList.size()) {
+                issueStaus = DailyConstant.ISSUE_STATUS_SUCCESS;
+            }
+            if (transferFailedList.size() == bankList.size()) {
+                issueStaus = DailyConstant.ISSUE_STATUS_FAILED;
+            }
+            if (transferSuccessList.size() > 0) {
+                settleDailyIssueSummaryRecordService.updateBatchById(transferSuccessList, 500);
+            }
+
+            if (transferFailedList.size() > 0) {
+                settleDailyIssueSummaryRecordService.updateBatchById(transferFailedList, 500);
+            }
+        }
+        return issueStaus;
+    }
+
+    public void excute() {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        try {
+            List<SettleDailyIssueTask> tasks = settleDailyIssueTaskService.lambdaQuery()
+                    .eq(StringUtils.isNotBlank(adminUser.getCompanyWechatId()), SettleDailyIssueTask::getCompanyWechatId, adminUser.getCompanyWechatId())
+                    .eq(SettleDailyIssueTask::getTaskStatus, 2)
+                    .list();
+            if (tasks.size() == 0) {
+                log.info("【暂无可执行查询数据】");
+                return;
+            }
+
+            for (SettleDailyIssueTask task : tasks) {
+                if (task.getIsMonth()) {
+                    log.info("【月结查询】");
+                    List<SettleDailyIssueSummaryMonthRecord> items = settleDailyIssueSummaryMonthRecordService.lambdaQuery()
+                            .eq(SettleDailyIssueSummaryMonthRecord::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                            .eq(SettleDailyIssueSummaryMonthRecord::getSummaryBatchNo, task.getSummaryBatchNo())
+                            .eq(SettleDailyIssueSummaryMonthRecord::getSummaryNumber, task.getSummaryNumber())
+                            .eq(SettleDailyIssueSummaryMonthRecord::getStatus, DailyConstant.ISSUE_STATUS_BANK_DO).list();
+
+                    if (items.size() == 0) {
+                        //设置该笔查询状态为完结 taskStatus 1.新建 2.处理中 3.完成
+                        task.setTaskStatus(3).setUpdateTime(new Date());
+                        task.updateById();
+                        continue;
+                    }
+                    String queryDateEnd = DateUtil.format(new Date(), "yyyyMMdd");
+                    List<DailyWokerBankCardMonthBean> bankList = dailyMapper.queryIssueSalaryMonthBankCardInfo(task.getSummaryBatchNo(),
+                            task.getSummaryNumber(), DailyConstant.ISSUE_STATUS_BANK_DO, adminUser.getAdminCompanyWechat().getCompanyWechatId());
+                    this.queryMonthTransferResult(items, bankList, task.getRequestNo(), queryDateEnd,task.getSummaryNumber(), adminUser);
+
+                } else {
+                    log.info("【日结查询】");
+                    List<SettleDailyIssueSummaryRecord> items = settleDailyIssueSummaryRecordService.lambdaQuery()
+                            .eq(SettleDailyIssueSummaryRecord::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                            .eq(SettleDailyIssueSummaryRecord::getSummaryBatchNo, task.getSummaryBatchNo())
+                            .eq(SettleDailyIssueSummaryRecord::getSummaryNumber, task.getSummaryNumber())
+                            .eq(SettleDailyIssueSummaryRecord::getStatus, DailyConstant.ISSUE_STATUS_BANK_DO).list();
+
+                    if (items.size() == 0) {
+                        task.setTaskStatus(3).setUpdateTime(new Date());
+                        task.updateById();
+                        continue;
+                    }
+                    String queryDateEnd = DateUtil.format(new Date(), "yyyyMMdd");
+
+                    List<DailyWorkerBankCardBean> bankList = dailyMapper.queryIssueSalaryAndBankCardInfo(task.getSummaryBatchNo(),
+                            task.getSummaryNumber(), DailyConstant.ISSUE_STATUS_BANK_DO, adminUser.getAdminCompanyWechat().getCompanyWechatId());
+                    Integer status = this.queryTransferResult(items, bankList, task.getRequestNo(), queryDateEnd,task.getSummaryNumber(), adminUser);
+                    settleDailyBankTransferRecordService.lambdaUpdate()
+                            .set(SettleDailyBankTransferRecord::getIssueStatus,status)
+                            .eq(SettleDailyBankTransferRecord::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                            .eq(SettleDailyBankTransferRecord::getReqNo,task.getRequestNo())
+                            .update();
+                }
+                log.info("【查询转账结果完成】");
+            }
+        } catch (Exception e) {
+            log.info("【查询转账结果出错】:" + e);
+        }
+    }
+}

+ 19 - 5
mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/DailyWithholdLogic.java

@@ -1,6 +1,7 @@
 package com.gree.mall.manager.logic.settle.repair;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
 import com.gree.mall.manager.bean.settle.repair.DailyWithholdVO;
@@ -20,6 +21,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Objects;
 
 @Service
@@ -74,14 +76,14 @@ public class DailyWithholdLogic {
 
         SysDictCompany dict = sysDictCompanyService.lambdaQuery()
                 .eq(SysDictCompany::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
-                .eq(SysDictCompany::getDictCode, SysDictConstant.REPAIR_DAILY)
+                .eq(SysDictCompany::getDictType, SysDictConstant.REPAIR_DAILY)
                 .last("limit 1")
                 .one();
 
         if (Objects.isNull(dict)) {
             dict = new SysDictCompany();
             dict.setDictType(SysDictConstant.REPAIR_DAILY);
-            dict.setDictCode(SysDictConstant.REPAIR_DAILY);
+            dict.setDictCode(IdWorker.getIdStr());
             dict.setDictValue("0");
             dict.setRemark("维修日结算扣款配置-结算汇总暂扣款比例");
             dict.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
@@ -104,19 +106,31 @@ public class DailyWithholdLogic {
         }
         sysDictCompanyService.lambdaUpdate()
                 .eq(SysDictCompany::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
-                .eq(SysDictCompany::getDictCode, SysDictConstant.REPAIR_DAILY)
+                .eq(SysDictCompany::getDictType, SysDictConstant.REPAIR_DAILY)
                 .remove();
 
         SysDictCompany dict = new SysDictCompany();
         dict.setDictType(SysDictConstant.REPAIR_DAILY);
-        dict.setDictCode(SysDictConstant.REPAIR_DAILY);
+        dict.setDictCode(IdWorker.getIdStr());
         dict.setDictValue(String.valueOf(rate));
         dict.setRemark("维修日结算扣款配置-结算汇总暂扣款比例");
         dict.setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId());
-        dict.setCompanyName(adminUser.getAdminCompanyWechat().getCompanyWechatId());
+        dict.setCompanyName(adminUser.getAdminCompanyWechat().getCompanyName());
 
 
         dict.insert();
     }
 
+    public List<SysDictCompany> getConfig(String code) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+
+        return sysDictCompanyService.lambdaQuery()
+                .eq(SysDictCompany::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                .eq(SysDictCompany::getDictType, code)
+                .list();
+    }
 }

+ 16 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/RepairSettleAccountLogic.java

@@ -1,15 +1,18 @@
 package com.gree.mall.manager.logic.settle.repair;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.lang.Validator;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
 import com.gree.mall.manager.bean.settle.repair.DailyBankAccountVO;
 import com.gree.mall.manager.commonmapper.CommonMapper;
+import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.enums.ExamineStatusEnum;
 import com.gree.mall.manager.enums.UserTypeEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.logic.common.SMSLogic;
 import com.gree.mall.manager.plus.entity.AdminWebsit;
 import com.gree.mall.manager.plus.entity.SettleDailyBankAccount;
 import com.gree.mall.manager.plus.entity.User;
@@ -45,6 +48,7 @@ public class RepairSettleAccountLogic {
     private final UserService userService;
     private final WebsitUserService websitUserService;
     private final AdminWebsitService adminWebsitService;
+    private final SMSLogic smsLogic;
 
     public IPage<DailyBankAccountVO> page(ZfireParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
@@ -251,4 +255,16 @@ public class RepairSettleAccountLogic {
         if (CollectionUtil.isNotEmpty(importList))
             settleDailyBankAccountService.saveBatch(importList);
     }
+
+    public void sendMsg(String mobile, String type) throws Exception  {
+        if (!Validator.isMobile(mobile)) {
+            throw new RemoteServiceException("手机号格式不正确。");
+        }
+        // 向手机号发送验证码
+        String sendType = Constant.RedisPrefix.BALANCE_SEL_MOBILE_SMS;
+        if(type != null && type.equals("issue")){
+            sendType = Constant.RedisPrefix.ISSUE_SAL_MOBILE_SMS;
+        }
+        smsLogic.sendSms(sendType, mobile, "BALANCE_SEL", Constant.SMS_EXPIRE);
+    }
 }

+ 378 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/settle/repair/cmc/CmcBankLogic.java

@@ -0,0 +1,378 @@
+package com.gree.mall.manager.logic.settle.repair.cmc;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.gree.mall.manager.bean.settle.repair.cmc.*;
+import com.gree.mall.manager.plus.entity.SettleDailySecretKey;
+import com.gree.mall.manager.plus.service.SettleDailySecretKeyService;
+import com.gree.mall.manager.utils.CommonUtils;
+import com.gree.mall.manager.utils.sm4.DCHelper;
+import com.gree.mall.manager.utils.sm4.SMHttpTool;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class CmcBankLogic {
+
+    @Value("${cmc.bank.url}")
+    private String requestUrl;
+
+    private String publicKey;
+
+    private String privateKey;
+
+    private String sm4key;
+
+    private String userId;
+
+    @Autowired
+    SettleDailySecretKeyService settleDailySecretKeyService;
+
+    //联动代发明细查询
+    private final String CMC_TRANSFER_RESULT = "NTLKATLD";
+    //联动代发账号已签约代发协议列表查询
+    private final String CMC_QUERY_PROTOCOL = "NTLKACVD";
+    //代发经办
+    private final String CMC_DAIFA = "NTLKAOPD";
+    //批量获取账户余额
+    private final String CMC_GET_BALANCE_CODE = "NTQADINF";
+    //联动支付经办
+    private final String CMC_GET_K_PAY = "NTOPRLKP";
+    //查询可经办业务列表 NTLKPCTL
+    private final String CMC_CAN_DO = "NTLKPCTL";
+    //查询授权帐号列表 NTLPALST
+    private final String CMC_AUTH_ACCOUNT = "NTLPALST";
+
+    //联动支付综合查询 NTQRYLKP
+    private final String CMC_GET_PAY_RESULT = "NTQRYLKP";
+    // 联动代发业务查询NTLKAQRD
+    private final String CMC_DAIFA_SEL = "NTLKAQRD";
+
+    public Map<String, Object> doRequestWithParams(JsonObject jsonObject, String funCode) throws Exception {
+        return SMHttpTool.doProcess(jsonObject, funCode, requestUrl, publicKey, privateKey, sm4key, userId);
+    }
+
+    /**
+     * @param list bankOrgCode: 分行代码 bankAccount:银行卡号
+     * @return
+     * @throws Exception
+     */
+    public Map<String, Object> getAccountBalance(List<BankCardInfoBean> list, String summaryNumber) throws Exception {
+        log.info("【查询银行卡余额开始------】");
+        putSecretKey(summaryNumber);
+        JsonArray array = new JsonArray();
+        for (BankCardInfoBean bean : list) {
+            JsonObject item = new JsonObject();
+            item.addProperty("bbknbr", bean.getBankOrgCode());
+            item.addProperty("accnbr", bean.getBankAccount());
+            array.add(item);
+        }
+        Map<String, Object> result = this.doRequestWithParams(putParams("ntqadinfx", array, CMC_GET_BALANCE_CODE), CMC_GET_BALANCE_CODE);
+        log.info("【查询银行卡余额结束------】");
+        return result;
+    }
+
+    /**
+     * 查询可经办业务列表
+     *
+     * @param busmod 业务模式编号
+     * @return
+     * @throws Exception
+     */
+    public Map<String, Object> getCanDo(String busmod, String summaryNumber) throws Exception {
+        log.info("【查询可经办业务列表开始------】");
+        putSecretKey(summaryNumber);
+        JsonArray array = new JsonArray();
+        JsonObject item = new JsonObject();
+        item.addProperty("busmod", busmod);
+        array.add(item);
+        Map<String, Object> result = doResult(this.doRequestWithParams(putParams("ntlkpctlx1", array, CMC_CAN_DO), CMC_CAN_DO), "ntlkpctlz1");
+        log.info("【查询可经办业务列表结束------】");
+        return result;
+    }
+
+    /**
+     * 查询授权业务列表
+     *
+     * @param list 业务模式编号 summaryNumber 结算单位编号
+     * @return
+     * @throws Exception
+     */
+    public Map<String, Object> getAuthAccount(List<BankCardInfoBean> list, String summaryNumber) throws Exception {
+        log.info("【查询授权业务列表开始------】");
+        putSecretKey(summaryNumber);
+        JsonArray array = new JsonArray();
+        for (BankCardInfoBean bean : list) {
+            JsonObject item = new JsonObject();
+            item.addProperty("bbknbr", bean.getBankOrgCode());
+            item.addProperty("accnbr", bean.getBankAccount());
+            item.addProperty("auttyp", bean.getAuthType());
+            array.add(item);
+        }
+        Map<String, Object> result = doResult(this.doRequestWithParams(putParams("ntlpalstx1", array, CMC_AUTH_ACCOUNT), CMC_AUTH_ACCOUNT), "ntlpalstz1");
+        log.info("【查询授权业务列表结束------】");
+        return result;
+    }
+
+
+    /**
+     * 企银支付批量经办 (废弃暂时不使用)
+     *
+     * @param
+     * @return
+     * @throws Exception
+     */
+    @Deprecated
+    public Map<String, Object> kPay(LinkPayBean linkPayBean, String summaryNumber) {
+        putSecretKey(summaryNumber);
+        log.info("【企银支付批量经办开始】");
+        Map<String, Object> result = new HashMap<>();
+        try {
+            JsonObject obj = new JsonObject();
+            JsonObject req = new JsonObject();
+            JsonObject body = new JsonObject();
+            JsonObject head = new JsonObject();
+            head.addProperty("funcode", CMC_GET_K_PAY);
+            head.addProperty("userid", userId);
+            head.addProperty("reqid", DCHelper.getTime() + "0000001");
+
+            JsonArray bmdArray = new JsonArray();
+            JsonArray payArray = new JsonArray();
+
+            for (ModBean mod : linkPayBean.getModList()) {
+                JsonObject item = new JsonObject();
+                item.addProperty("busMod", mod.getBusmod());
+                bmdArray.add(item);
+            }
+
+            for (PayBean pay : linkPayBean.getPayList()) {
+                JsonObject item = new JsonObject();
+                item.addProperty("yurref", pay.getYurref());
+                item.addProperty("dbtbbk", pay.getDbtbbk());
+                item.addProperty("dbtacc", pay.getDbtacc());
+                item.addProperty("auteac", pay.getAuteac());
+                item.addProperty("crtacc", pay.getCrtacc());
+                item.addProperty("crtnam", pay.getCrtnam());
+                item.addProperty("crtadr", pay.getCrtadr());
+                item.addProperty("trsamt", pay.getTrsamt());
+                item.addProperty("busnar", pay.getBusnar());
+                item.addProperty("trstyp", "100001");
+                payArray.add(item);
+            }
+
+            body.add("ntbusmody", bmdArray);
+            body.add("ntoprlkpx1", payArray);
+            req.add("head", head);
+            req.add("body", body);
+            obj.add("request", req);
+
+            result = doResult(this.doRequestWithParams(obj, CMC_GET_K_PAY), "ntoprrtnz");
+        } catch (Exception e) {
+            log.info("【KPay】: {}", e);
+            result.put("code", "201");
+        }
+        return result;
+    }
+
+
+    /**
+     * 联动支付综合查询 (废弃暂不使用,单个转账)
+     *
+     * @param
+     * @return
+     * @throws Exception
+     */
+    @Deprecated
+    public Map<String, Object> kPayResult(List<PayResultBean> payResults, String summaryNumber) throws Exception {
+        putSecretKey(summaryNumber);
+        log.info("【联动支付综合查询开始】" + summaryNumber);
+
+        JsonArray payResultArray = new JsonArray();
+        for (PayResultBean resultBean : payResults) {
+            JsonObject item = new JsonObject();
+            item.addProperty("bgndat", resultBean.getBgndat());
+            item.addProperty("enddat", resultBean.getEnddat());
+            item.addProperty("refkey", resultBean.getRefkey());
+            payResultArray.add(item);
+        }
+
+        Map<String, Object> result = doResult(this.doRequestWithParams(putParams("ntqrylkpy1", payResultArray, CMC_QUERY_PROTOCOL), CMC_QUERY_PROTOCOL), "ntqrylkpz1");
+        log.info("【联动代发账号已签约代发协议列表查询 结束】");
+        return result;
+    }
+
+
+    /**
+     * 联动代发账号已签约代发协议列表查询 NTLKACV
+     */
+    public Map<String, Object> queryProtocol(BankCardInfoBean cardInfoBean, String summaryNumber) throws Exception {
+        putSecretKey(summaryNumber);
+        log.info("【联动代发账号已签约代发协议列表查询 开始】");
+        JsonArray array = new JsonArray();
+        JsonObject item = new JsonObject();
+        item.addProperty("bbknbr", cardInfoBean.getBankOrgCode());
+        item.addProperty("accnbr", cardInfoBean.getBankAccount());
+        item.addProperty("autacc", cardInfoBean.getAuthBankAccount());
+        array.add(item);
+        Map<String, Object> result = doResult(this.doRequestWithParams(putParams("ntlkacvdx1", array, CMC_QUERY_PROTOCOL), CMC_QUERY_PROTOCOL), "ntlkacvdz1");
+        log.info("【联动代发账号已签约代发协议列表查询 结束】");
+        return result;
+    }
+
+    /**
+     * 组装
+     *
+     * @return
+     */
+    public JsonObject putParams(String bodyName, JsonArray array, String method) {
+
+        JsonObject head = new JsonObject();
+        head.addProperty("funcode", method);
+        head.addProperty("userid", userId);
+        head.addProperty("reqid", DCHelper.getTime() + "0000001");
+
+        JsonObject obj = new JsonObject();
+        JsonObject req = new JsonObject();
+        JsonObject body = new JsonObject();
+
+        body.add(bodyName, array);
+        req.add("head", head);
+        req.add("body", body);
+        obj.add("request", req);
+        return obj;
+    }
+
+    /**
+     * 组装请求码值
+     */
+    public Map<String, Object> doResult(Map<String, Object> response, String bodyName) {
+        Map<String, Object> result = new HashMap<>();
+        JSONObject respHead = JSONObject.parseObject(response.get("head").toString());
+        if (respHead != null && respHead.get("resultcode").equals("SUC0000")) {
+            Map<String, Map<String, Object>> respBody = (Map<String, Map<String, Object>>) response.get("body");
+            result.put("code", "200");
+            result.put("data", respBody.get(bodyName));
+        } else {
+            result.put("code", "201");
+        }
+        // log.info(bodyName + ":"+ result);
+        return result;
+    }
+
+
+    /**
+     * 代发经办 BB6BTHHL
+     */
+    public Map<String, Object> insteadIssue(PayItem payItem, List<ReceivedItem> receivedItems, String summaryNumber) throws Exception {
+        String busmod = putSecretKey(summaryNumber);
+        log.info("【代发经办开始...】");
+        JsonObject obj = new JsonObject();
+        JsonObject req = new JsonObject();
+        JsonObject body = new JsonObject();
+        JsonObject head = new JsonObject();
+        head.addProperty("funcode", CMC_DAIFA);
+        head.addProperty("userid", userId);
+        head.addProperty("reqid", DCHelper.getTime() + "0000001");
+
+        //经办业务列表
+        JsonArray bmdArray = new JsonArray();
+        JsonObject item = new JsonObject();
+        item.addProperty("buscod", "N39010");
+        item.addProperty("busmod", busmod);
+        bmdArray.add(item);
+
+        JsonArray payArray = new JsonArray();
+        JsonObject payItemJson = new JsonObject();
+        Map<String, Object> payItemMap = CommonUtils.objectToMap(payItem);
+        for (Map.Entry<String, Object> entry : payItemMap.entrySet()) {
+            if (entry.getValue() != null) {
+                payItemJson.addProperty(entry.getKey(), entry.getValue().toString());
+            }
+        }
+        payArray.add(payItemJson);
+
+        JsonArray recArray = new JsonArray();
+        for (ReceivedItem receive : receivedItems) {
+            JsonObject recItem = new JsonObject();
+            Map<String, Object> receiveMap = CommonUtils.objectToMap(receive);
+            for (Map.Entry<String, Object> entry : receiveMap.entrySet()) {
+                if (entry.getValue() != null) {
+                    recItem.addProperty(entry.getKey(), entry.getValue().toString());
+                }
+            }
+            recArray.add(recItem);
+        }
+
+        body.add("ntbusmody", bmdArray);
+        body.add("ntlkaopdx1", payArray);
+        body.add("ntlkaopdx2", recArray);
+        req.add("head", head);
+        req.add("body", body);
+        obj.add("request", req);
+
+        Map<String, Object> result = doResult(this.doRequestWithParams(obj, CMC_DAIFA), "ntlkaopdz1");
+        log.info("【代发经办结束...】");
+        return result;
+
+    }
+
+
+    /**
+     * 10.联动代发明细查询NTLKATLD
+     *
+     * @return
+     * @throws Exception
+     */
+    public Map<String, Object> insteadResult(String reqnbr, String summaryNumber) throws Exception {
+        putSecretKey(summaryNumber);
+        log.info("【联动代发明细查询 开始】");
+        JsonArray array = new JsonArray();
+        JsonObject item = new JsonObject();
+        item.addProperty("reqnbr", reqnbr);
+        array.add(item);
+        Map<String, Object> result = doResult(this.doRequestWithParams(putParams("ntlkatldy1", array, CMC_TRANSFER_RESULT), CMC_TRANSFER_RESULT), "ntlkatldz1");
+        log.info("【联动代发明细查询 结束】");
+        return result;
+    }
+
+    /**
+     * 联动代发业务查询 NTLKAQRD
+     *
+     * @return
+     * @throws Exception
+     */
+    public Map<String, Object> instead9(String beginDate, String endDate, String summaryNumber) throws Exception {
+        putSecretKey(summaryNumber);
+        log.info("【联动代发业务查询 开始】");
+        JsonArray array = new JsonArray();
+        JsonObject item = new JsonObject();
+        item.addProperty("datflg", "A");
+        item.addProperty("begdat", beginDate);
+        item.addProperty("enddat", endDate);
+        array.add(item);
+        Map<String, Object> result = doResult(this.doRequestWithParams(putParams("ntlkaqrdy1", array, CMC_DAIFA_SEL), CMC_DAIFA_SEL), "ntlkaqrdz1");
+        log.info("【联动代发业务查询 结束】");
+        return result;
+    }
+
+    //根据不同公司选择秘钥
+    public String putSecretKey(String summaryNumber) {
+        SettleDailySecretKey secretKey = settleDailySecretKeyService.lambdaQuery()
+                .eq(SettleDailySecretKey::getSummaryNumber, summaryNumber)
+                .one();
+        publicKey = secretKey.getPublicKey();
+        privateKey = secretKey.getPrivateKey();
+        sm4key = secretKey.getSm4Key();
+        userId = secretKey.getUid();
+        return secretKey.getBusMod();
+    }
+
+}

+ 23 - 3
mall-server-api/src/main/java/com/gree/mall/manager/utils/CommonUtils.java

@@ -3,6 +3,7 @@ package com.gree.mall.manager.utils;
 
 import com.gree.mall.manager.bean.admin.AdminWebsitBean;
 import com.gree.mall.manager.commonmapper.WebsitMapper;
+import com.gree.mall.manager.constant.DailyConstant;
 import com.gree.mall.manager.plus.entity.AdminUser;
 import com.gree.mall.manager.plus.service.AdminUserService;
 import org.apache.commons.lang3.StringUtils;
@@ -16,11 +17,13 @@ import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.reflect.Field;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.zip.ZipEntry;
@@ -384,9 +387,26 @@ public class CommonUtils {
         }
     }
 
+    public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        Class<?> clazz = obj.getClass();
+        for (Field field : clazz.getDeclaredFields()) {
+            field.setAccessible(true);
+            String fieldName = field.getName();
+            Object value = field.get(obj);
+            map.put(fieldName, value);
+        }
+        return map;
+    }
 
-
-
-
+    public static String getIssueStatus(Integer status){
+        if(DailyConstant.ISSUE_STATUS_NOT.equals(status))
+            return "未发放";
+        if(DailyConstant.ISSUE_STATUS_SUCCESS.equals(status))
+            return "已发放";
+        if(DailyConstant.ISSUE_STATUS_BANK_DO.equals(status))
+            return "银行受理中";
+        return "";
+    }
 
 }

+ 133 - 0
mall-server-api/src/main/java/com/gree/mall/manager/utils/sm4/DCCryptor.java

@@ -0,0 +1,133 @@
+package com.gree.mall.manager.utils.sm4;
+
+import org.bouncycastle.asn1.*;
+import org.bouncycastle.crypto.params.ECDomainParameters;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+import org.bouncycastle.crypto.params.ParametersWithID;
+import org.bouncycastle.crypto.signers.SM2Signer;
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.bouncycastle.math.ec.ECPoint;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.ByteArrayInputStream;
+import java.math.BigInteger;
+import java.util.Enumeration;
+
+/**
+ * 示例代码,仅供参考
+ */
+public class DCCryptor {
+
+    public static byte[] CMBSM4EncryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4EncryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 1);
+    }
+
+    public static byte[] CMBSM4DecryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4DecryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 2);
+    }
+
+    public static byte[] CMBSM2SignWithSM3(byte[] id, byte privkey[], byte msg[]) throws Exception {
+        if (privkey == null || msg == null) {
+            throw new Exception("CMBSM2SignWithSM3 input error");
+        }
+        ECPrivateKeyParameters privateKey = encodePrivateKey(privkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(privateKey, id);
+        signer.init(true, parameters);
+        signer.update(msg, 0, msg.length);
+        return decodeDERSignature(signer.generateSignature());
+    }
+
+    public static boolean CMBSM2VerifyWithSM3(byte[] id, byte pubkey[], byte msg[], byte signature[]) throws Exception {
+
+        if (pubkey == null || msg == null || signature == null) {
+            throw new Exception("CMBSM2VerifyWithSM3 input error");
+        }
+        ECPublicKeyParameters publicKey = encodePublicKey(pubkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(publicKey, id);
+        signer.init(false, parameters);
+        signer.update(msg, 0, msg.length);
+        return signer.verifySignature(encodeDERSignature(signature));
+    }
+
+    private static byte[] CMBSM4Crypt(byte key[], byte iv[], byte input[], int mode) throws Exception {
+        SecretKeySpec spec = new SecretKeySpec(key, "SM4");
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME);
+        cipher.init(mode, spec, ivParameterSpec);
+        return cipher.doFinal(input);
+    }
+
+    private static ECPrivateKeyParameters encodePrivateKey(byte[] value) {
+        BigInteger d = new BigInteger(1, value);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPrivateKeyParameters(d, ecParameters);
+    }
+
+    public static ECPublicKeyParameters encodePublicKey(byte[] value) {
+        byte[] x = new byte[32];
+        byte[] y = new byte[32];
+        System.arraycopy(value, 1, x, 0, 32);
+        System.arraycopy(value, 33, y, 0, 32);
+        BigInteger X = new BigInteger(1, x);
+        BigInteger Y = new BigInteger(1, y);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECPoint Q = spec.getCurve().createPoint(X, Y);
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPublicKeyParameters(Q, ecParameters);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static byte[] decodeDERSignature(byte[] signature) throws Exception {
+        ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(signature));
+        ASN1Sequence primitive = (ASN1Sequence) stream.readObject();
+        Enumeration<ASN1Integer> enumeration = primitive.getObjects();
+        BigInteger R = enumeration.nextElement().getValue();
+        BigInteger S = enumeration.nextElement().getValue();
+        byte[] bytes = new byte[64];
+        byte[] r = format(R.toByteArray());
+        byte[] s = format(S.toByteArray());
+        System.arraycopy(r, 0, bytes, 0, 32);
+        System.arraycopy(s, 0, bytes, 32, 32);
+        return bytes;
+    }
+
+    private static byte[] encodeDERSignature(byte[] signature) throws Exception {
+        byte[] r = new byte[32];
+        byte[] s = new byte[32];
+        System.arraycopy(signature, 0, r, 0, 32);
+        System.arraycopy(signature, 32, s, 0, 32);
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        vector.add(new ASN1Integer(new BigInteger(1, r)));
+        vector.add(new ASN1Integer(new BigInteger(1, s)));
+        return (new DERSequence(vector)).getEncoded();
+    }
+
+    private static byte[] format(byte[] value) {
+        if (value.length == 32) {
+            return value;
+        } else {
+            byte[] bytes = new byte[32];
+            if (value.length > 32) {
+                System.arraycopy(value, value.length - 32, bytes, 0, 32);
+            } else {
+                System.arraycopy(value, 0, bytes, 32 - value.length, value.length);
+            }
+            return bytes;
+        }
+    }
+
+}

+ 168 - 0
mall-server-api/src/main/java/com/gree/mall/manager/utils/sm4/DCHelper.java

@@ -0,0 +1,168 @@
+package com.gree.mall.manager.utils.sm4;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyStore;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 示例代码,仅供参考
+ */
+public class DCHelper {
+
+    public static String serialJsonOrdered(JsonObject json) throws Exception {
+        StringBuilder appender = new StringBuilder();
+        appender.append("{");
+        Iterator<String> keys = new TreeSet<>(json.keySet()).iterator();
+        boolean isFirstEle = true;
+        while (keys.hasNext()) {
+            if (!isFirstEle) {
+                appender.append(",");
+            }
+            String key = keys.next();
+            Object val = json.get(key);
+            if (val instanceof JsonObject) {
+                appender.append("\"").append(key).append("\":");
+                appender.append(serialJsonOrdered((JsonObject) val));
+            } else if (val instanceof JsonArray) {
+                JsonArray jarray = (JsonArray) val;
+                appender.append("\"").append(key).append("\":[");
+                boolean isFirstArrEle = true;
+                for (int i = 0; i < jarray.size(); i++) {
+                    if (!isFirstArrEle) {
+                        appender.append(",");
+                    }
+                    Object obj = jarray.get(i);
+                    if (obj instanceof JsonObject) {
+                        appender.append(serialJsonOrdered((JsonObject) obj));
+                    } else {
+                        appender.append(obj.toString());
+                    }
+                    isFirstArrEle = false;
+                }
+                appender.append("]");
+            } else {
+                String value = val.toString();
+                appender.append("\"").append(key).append("\":").append(value);
+            }
+            isFirstEle = false;
+        }
+        appender.append("}");
+        return appender.toString();
+    }
+
+    public static String getTime() {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        return dateFormat.format(new Date());
+    }
+
+    public static String doPostForm(String httpUrl, Map<String, String> param) throws Exception {
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        OutputStream os = null;
+        BufferedReader br = null;
+        String result = null;
+        try {
+            URL url = new URL(httpUrl);
+            SSLContext sslcontext;
+            sslcontext = SSLContext.getInstance("SSL");
+            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            tmf.init((KeyStore) null);
+            X509TrustManager defaultTm = null;
+            for (TrustManager tm : tmf.getTrustManagers()) {
+                if (tm instanceof X509TrustManager) {
+                    defaultTm = (X509TrustManager) tm;
+                    break;
+                }
+            }
+            sslcontext.init(null, new TrustManager[] { defaultTm }, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
+
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestMethod("POST");
+            connection.setConnectTimeout(15000);
+            connection.setReadTimeout(60000);
+            connection.setInstanceFollowRedirects(true);
+
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+
+            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            os = connection.getOutputStream();
+            os.write(createLinkString(param).getBytes());
+            if (connection.getResponseCode() != 200) {
+                is = connection.getErrorStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                result = sbf.toString();
+            } else {
+                is = connection.getInputStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                boolean firstLine = true;
+                while ((temp = br.readLine()) != null) {
+                    if (!firstLine) {
+                        firstLine = false;
+                        sbf.append("\r\n");
+                    }
+                    sbf.append(temp);
+                }
+                result = sbf.toString();
+            }
+        } finally {
+            if (null != br) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != os) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != is) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            connection.disconnect();
+        }
+        return result;
+    }
+
+    private static String createLinkString(Map<String, String> params) throws Exception {
+        ArrayList<String> keys = new ArrayList<>(params.keySet());
+        Collections.sort(keys);
+
+        StringBuilder prestr = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            if (i == keys.size() - 1) {
+                prestr.append(key).append("=").append(value);
+            } else {
+                prestr.append(key).append("=").append(value).append("&");
+            }
+        }
+        return prestr.toString();
+    }
+
+}

+ 99 - 0
mall-server-api/src/main/java/com/gree/mall/manager/utils/sm4/SMHttpTool.java

@@ -0,0 +1,99 @@
+package com.gree.mall.manager.utils.sm4;
+
+import com.alibaba.fastjson.JSON;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.Security;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+public class SMHttpTool {
+
+    private static Base64.Encoder encoder = Base64.getEncoder();
+    private static Base64.Decoder decoder = Base64.getDecoder();
+    // 采用国密算法
+    private static final String ALG_SM = "SM";
+
+    /**
+     *
+     * @param jObject 请求头及参数
+     * @param bankUrl  请求地址
+     * @param bankPubkey 公钥
+     * @param bankPrivkey 私钥
+     * @param sm4key  对称加密秘钥
+     * @param uid  分配账号
+     * @return 请求返回结果
+     * @throws Exception
+     */
+    public static Map<String,Object> doProcess(JsonObject jObject,String apiCode,String bankUrl,String bankPubkey,String bankPrivkey,String sm4key,String uid) throws Exception {
+        // 引入BC库
+        Security.addProvider(new BouncyCastleProvider());
+        JsonObject object = new JsonObject();
+        // 签名
+        object.addProperty("sigdat", "__signature_sigdat__");
+        object.addProperty("sigtim", DCHelper.getTime());
+        jObject.add("signature", object);
+        String source = DCHelper.serialJsonOrdered(jObject);
+        log.info("请求银行签名原文: " + source);
+        byte[] signature1 = DCCryptor.CMBSM2SignWithSM3(getID_IV(uid), decoder.decode(bankPrivkey), source.getBytes(StandardCharsets.UTF_8));
+        String sigdat1 = new String(encoder.encode(signature1));
+      //  System.out.println("签名结果: " + sigdat1);
+        object.addProperty("sigdat", sigdat1);
+
+        // SM4-CBC加密
+        String plaintxt = jObject.toString();
+       // System.out.println("加密前req:  " + plaintxt);
+        byte[] enInput = DCCryptor.CMBSM4EncryptWithCBC(sm4key.getBytes(), getID_IV(uid), plaintxt.getBytes(StandardCharsets.UTF_8));
+
+        String req = new String(encoder.encode(enInput));
+      //  System.out.println("加密后req:  " + req);
+
+        // 发送请求
+        HashMap<String, String> map = new HashMap<>();
+        map.put("UID", uid);
+        map.put("ALG", ALG_SM);
+        map.put("DATA", URLEncoder.encode(req, "utf-8"));
+        map.put("FUNCODE", apiCode);
+        String res = DCHelper.doPostForm(bankUrl, map);
+       // System.out.println("res:  " + res);
+        try {
+            decoder.decode(res);
+        } catch (Exception e) {
+            log.error("访问返回错误.返回结果{}" ,res);
+            return null;
+        }
+
+        // 解密请求
+        String resplain = new String(DCCryptor.CMBSM4DecryptWithCBC(sm4key.getBytes(), getID_IV(uid), decoder.decode(res)), StandardCharsets.UTF_8);
+        log.info("请求银行返回解密结果: " + resplain);
+
+        // 验签
+        JsonObject object2 = new GsonBuilder().create().fromJson(resplain, JsonObject.class);
+        JsonObject object3 = object2.getAsJsonObject("signature");
+        String resSign = object3.get("sigdat").getAsString();
+        object3.addProperty("sigdat", "__signature_sigdat__");
+        object2.add("signature", object3);
+        String resSignSource = DCHelper.serialJsonOrdered(object2);
+        boolean verify = DCCryptor.CMBSM2VerifyWithSM3(getID_IV(uid), decoder.decode(bankPubkey), resSignSource.getBytes(StandardCharsets.UTF_8), decoder.decode(resSign));
+        if(verify){
+            return (Map) JSON.parseObject(resSignSource).get("response");
+        } else {
+            log.info("返回结果验签失败");
+            return null;
+        }
+    }
+
+    private static byte[] getID_IV(String uid) {
+        String userid = uid + "0000000000000000";
+        return userid.substring(0, 16).getBytes();
+    }
+
+
+}

+ 4 - 2
mall-server-api/src/main/resources/mapper/CommonMapper.xml

@@ -1186,11 +1186,13 @@
             JOIN (
                 SELECT
                     u.id_card,
-                    wb.worker_number
+                    wb.worker_number,
+                    u.nick_name
                 FROM
                     user u, websit_user wb
                 WHERE
-                    u.user_id = wb.user_id
+                    u.company_wechat_id = wb.company_wechat_id
+                    AND u.user_id = wb.user_id
                     AND u.apply_type = 'WORKER'
                     AND wb.examine_status = 'OK'
             ) aa ON a.worker_number = aa.worker_number

+ 211 - 0
mall-server-api/src/main/resources/mapper/DailyMapper.xml

@@ -95,4 +95,215 @@
         group by
         service_number,websit_number
     </select>
+    <select id="querySummaryNumber" resultType="java.util.Map">
+        select distinct summary_number as summaryNumber  from  settle_daily_issue_summary_record  where company_wechat_id = #{companyWechatId} AND summary_batch_no= #{summaryBatchNo} and status in (1,4)
+    </select>
+
+    <select id="querySummaryMonthNumber" resultType="java.util.Map">
+        select distinct summary_number as summaryNumber  from  settle_daily_issue_summary_record  where company_wechat_id = #{companyWechatId} AND summary_batch_no= #{summaryBatchNo} and status in (1,4)
+    </select>
+
+    <select id="queryIssueSalaryMonthBankCardInfo"
+            resultType="com.gree.mall.manager.bean.settle.repair.DailyWokerBankCardMonthBean">
+        SELECT * FROM settle_daily_issue_summary_month_record a
+        JOIN (
+            SELECT
+                u.id_card,
+                wb.worker_number,
+                u.nick_name
+            FROM
+                user u, websit_user wb
+            WHERE
+                u.company_wechat_id = wb.company_wechat_id
+                AND u.user_id = wb.user_id
+                AND u.apply_type = 'WORKER'
+                AND wb.examine_status = 'OK'
+        ) aa ON a.service_number = aa.worker_number
+        JOIN settle_daily_bank_account b ON aa.id_card = b.idcard
+        WHERE
+        a.company_wechat_id = #{companyWechatId}
+        AND a.status IN(1,4)
+          AND is_month_calculate = 1
+
+        <if test="summaryBatchNo != null and summaryBatchNo !=''">
+            AND a.summary_batch_no = #{summaryBatchNo}
+        </if>
+
+        <if test="summaryNumber != null and summaryNumber !=''">
+            AND a.summary_number = #{summaryNumber}
+        </if>
+    </select>
+
+    <select id="queryIssueSalaryAndBankCardInfo" resultType="com.gree.mall.manager.bean.settle.repair.DailyWorkerBankCardBean">
+        select  a.*,b.* from  settle_daily_issue_summary_record a
+        JOIN (
+            SELECT
+                u.id_card,
+                wb.worker_number,
+                u.nick_name
+            FROM
+                user u, websit_user wb
+            WHERE
+                u.company_wechat_id = wb.company_wechat_id
+                AND u.user_id = wb.user_id
+                AND u.apply_type = 'WORKER'
+                AND wb.examine_status = 'OK'
+        ) aa ON a.service_number = aa.worker_number
+        join settle_daily_bank_account b  on  aa.id_card = b.idcard
+        where
+            a.company_wechat_id = #{companyWechatId}
+            AND a.status in (1,4) and a.issue_cost > 0
+            and a.service_name = aa.nick_name
+            <if test="summaryBatchNo != null and summaryBatchNo !=''">
+                and a.summary_batch_no = #{summaryBatchNo}
+            </if>
+
+            <if test="summaryNumber != null and summaryNumber !=''">
+                and a.summary_number = #{summaryNumber}
+            </if>
+        group by a.id
+    </select>
+
+    <select id="summaryDayList" resultType="com.gree.mall.manager.bean.settle.repair.DailySummaryDataBean">
+        SELECT
+        id AS 'issueSalaryId',
+        summary_batch_no,
+        month,
+        COUNT(DISTINCT (service_number)) AS 'summaryNum',
+        SUM(repair_count) AS 'summaryOrderNum',
+        SUM(repair_total_amount) AS 'totalRepairCostC',
+        IF(FIND_IN_SET('4', GROUP_CONCAT(DISTINCT status)) > 0 || FIND_IN_SET('1', GROUP_CONCAT(DISTINCT status)) > 0, 1, status) AS 'status',
+        issue_time,
+        issue_by,
+        SUM(should_reduce_cost) AS 'reduceCostC',
+        SUM(incr_decr_cost) AS 'incrDecrCostC',
+        SUM(should_emp_insurance_cost) AS 'injuryCostC',
+        SUM(should_residual_insurance_cost) AS 'residualCostC',
+        SUM(withhold_cost) AS 'withholdCostC',
+        SUM(issue_cost) AS 'issueCostC',
+        summary_number,
+        summary_name
+        FROM
+        settle_daily_issue_summary_record a
+        <where>
+            <if test="companyWechatIds != null and companyWechatIds.size > 0">
+                AND a.company_wechat_id IN
+                <foreach item="item" index="index" collection="companyWechatIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="adminWebsitIds != null and adminWebsitIds.size > 0">
+                AND a.websit_number IN
+                <foreach item="item" index="index" collection="adminWebsitIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="summaryBatchNo != null and summaryBatchNo != ''">
+                AND summary_batch_no = #{summaryBatchNo}
+            </if>
+        </where>
+        GROUP BY
+        summary_number
+    </select>
+
+    <select id="cwSummaryList" resultType="com.gree.mall.manager.bean.settle.repair.DailySummaryDataBean">
+        select
+        t.*
+        from
+        (select
+        summary_batch_no,
+        month,
+        count(distinct(service_number)) 'summaryNum',
+        sum(repair_count) 'summaryOrderNum',
+        sum(repair_total_amount) 'totalRepairCostC',
+        sum(issue_cost) 'issueCostC',
+        if(find_in_set('4',group_concat(distinct if(issue_cost>0,status,2))) > 0 || find_in_set('1',group_concat(distinct if(issue_cost>0,status,2))) > 0  ,1,status) 'status',
+        status 'groupStatus',
+        summary_by,
+        summary_time,
+        issue_time,
+        issue_by,
+        create_time
+        from
+        settle_daily_issue_summary_record a
+        <where>
+            <if test="companyWechatIds != null and companyWechatIds.size > 0">
+                AND a.company_wechat_id IN
+                <foreach item="item" index="index" collection="companyWechatIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="adminWebsitIds != null and adminWebsitIds.size > 0">
+                AND a.websit_number IN
+                <foreach item="item" index="index" collection="adminWebsitIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="summaryStartTime != null and summaryStartTime !='' and summaryEndTime != null and summaryEndTime != ''">
+                and summary_time between #{summaryStartTime} and concat(#{summaryEndTime},' 23:59:59')
+            </if>
+
+            <if test="issueStartTime != null and issueStartTime !='' and issueEndTime != null and issueEndTime != ''">
+                and issue_time between #{issueStartTime} and concat(#{issueEndTime},' 23:59:59')
+            </if>
+
+            <if test="summaryBatchNo != null and summaryBatchNo != ''">
+                and summary_batch_no = #{summaryBatchNo}
+            </if>
+
+        </where>
+        group by
+        summary_batch_no
+        ) t
+        <where>
+            <if test="status !='' and status != null">
+                t.status = #{status}
+            </if>
+
+        </where>
+
+        order by t.create_time desc
+    </select>
+
+    <select id="workerDetailList" resultType="com.gree.mall.manager.bean.settle.repair.DailyWorkerIssueSalaryBean">
+        select
+        a.*,b.bank_account ,b.bank_account_name,deposit_bank,c.issue_time ,c.issue_by,c.status as issueStatus,c.`month`
+        from settle_daily_import_summary_item a
+        left JOIN (
+            SELECT
+                u.id_card,
+                wb.worker_number,
+                u.nick_name
+            FROM
+                user u, websit_user wb
+            WHERE
+                u.company_wechat_id = wb.company_wechat_id
+                AND u.user_id = wb.user_id
+                AND u.apply_type = 'WORKER'
+                AND wb.examine_status = 'OK'
+        ) aa ON a.worker_number = aa.worker_number
+        left join settle_daily_bank_account b  on  aa.id_card = b.idcard
+        left join settle_daily_issue_summary_record c  on c.id  = a.issue_salary_id
+
+        <where>
+
+            <if test="companyWechatIds != null and companyWechatIds.size > 0">
+                AND a.company_wechat_id IN
+                <foreach item="item" index="index" collection="companyWechatIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="adminWebsitIds != null and adminWebsitIds.size > 0">
+                AND a.websit_number IN
+                <foreach item="item" index="index" collection="adminWebsitIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+
+            <if test="issueSalaryId != null and issueSalaryId != ''">
+                and  a.issue_salary_id = #{issueSalaryId}
+            </if>
+        </where>
+
+    </select>
 </mapper>