瀏覽代碼

Merge remote-tracking branch 'origin/develop' into develop

FengChaoYu 7 月之前
父節點
當前提交
049b91b641

+ 2 - 1
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/controller/pay/PayOrderController.java

@@ -130,8 +130,9 @@ public class PayOrderController {
                 throw new RemoteServiceException("系统繁忙,请稍后再试");
             }
             String ip = IpUtil.getIpAddr(request);
-            Boolean payStatus = payOrderLogic.paid(orderId, authCode, ip, payType);
             payOrderLogic.upIsPay(orderId);
+            Boolean payStatus = payOrderLogic.paid(orderId, authCode, ip, payType);
+
             return ResponseHelper.success(payStatus);
         } finally {
             obtain.unlock();

+ 20 - 0
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/logic/order/PayOrderLogic.java

@@ -480,6 +480,10 @@ public class PayOrderLogic {
 
        // this.addSettlementWorker(workerOrder,workerOrderItems);
 
+        /**
+         *
+         * 改这个辅材必须定时任务也改逻辑   搜  // 定时任务辅材逻辑
+        * */
 
         // 配件扣库存
         try {
@@ -1130,9 +1134,25 @@ public class PayOrderLogic {
     }
 
     public void upIsPay(String orderId) {
+        CurrentCompanyWechat currentCompanyWechat = commonLogic.getCurrentCompanyWechat();
+
         WorkerOrder workerOrder = workerOrderService.getById(orderId);
+
+        AdminWebsit adminWebsit = adminWebsitService.getById(workerOrder.getWebsitId());
+
+        if (StringUtil.isEmpty(adminWebsit.getPayWorkerCodeId()))
+            throw new RemoteServiceException("网点支付配置未配置");
+
+
+
+        if (!workerOrder.getPayStatus().equals("WAIT")){
+            throw new RemoteServiceException("订单已取消支付");
+        }
+
+        workerOrder.setConfigId(adminWebsit.getPayWorkerCodeId());
         workerOrder.setPayState(IsYesNoEnum.YES.getKey());
         workerOrder.setPayStateTime(new Date());
+        workerOrder.setOpenId(currentCompanyWechat.getUser().getMiniOpenId());
         workerOrder.updateById();
     }
 }

+ 68 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/SalesCustomerPartsBean.java

@@ -0,0 +1,68 @@
+package com.gree.mall.manager.bean;
+
+
+import com.gree.mall.manager.inf.ValidGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+@Data
+@ApiModel
+public class SalesCustomerPartsBean {
+
+    @ApiModelProperty(value = "商户编号", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "商户编号不能空")
+    private String companyWechatId;
+
+    @ApiModelProperty(value = "商户名称", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "商户名称不能空")
+    private String companyWechatName;
+
+    @ApiModelProperty(value = "维修标识 INNER=保内 OUTSIDE=保外", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "维修标识不能空")
+    private String repairFlag;
+
+    @ApiModelProperty(value = "接收网点编号", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "接收网点编号不能空")
+    private String receiveWebsitId;
+
+    @ApiModelProperty("接收配件网点编号")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "接收配件网点编号不能空")
+    private String receivePartsWebsitId;
+
+    @ApiModelProperty(value = "师傅身份证", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "师傅身份证不能空")
+    private String identity;
+
+    @ApiModelProperty(value = "师傅编号", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "师傅编号不能空")
+    private String workerId;
+
+    @ApiModelProperty(value = "师傅名称", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "师傅名称不能空")
+    private String workerName;
+
+    @ApiModelProperty(value = "工单编号", required = true)
+//    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "工单编号不能空")
+    private String workOrderNo;
+
+    @ApiModelProperty(value = "用户名称", required = true)
+//    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "用户名称不能空")
+    private String customerName;
+
+    @ApiModelProperty(value = "用户电话", required = true)
+//    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "用户电话不能空")
+    private String customerTel;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("明细")
+    @NotEmpty(groups = { ValidGroup.Add.class,ValidGroup.Edit.class }, message = "明细不能空")
+    private List<SalesCustomerPartsItemBean> items;
+
+}

+ 62 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/SalesCustomerPartsItemBean.java

@@ -0,0 +1,62 @@
+package com.gree.mall.manager.bean;
+
+
+import com.gree.mall.manager.inf.ValidGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel
+public class SalesCustomerPartsItemBean {
+
+    @ApiModelProperty(value = "新配件编码", required = true)
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "新配件编码不能空")
+    private String partsNumber;
+
+    @ApiModelProperty(value = "数量", required = true)
+    @NotNull(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "数量不能空")
+    private BigDecimal qty;
+
+    @ApiModelProperty("旧配件编号")
+    private String oldPartsNumber;
+
+    @ApiModelProperty("旧配件名称")
+    private String oldPartsName;
+
+    @ApiModelProperty("收费明细id")
+    private String workerOrderItemId;
+
+//    @ApiModelProperty(value = "维修记录编号")
+//    private String repairRecordNumber;
+//
+//    @ApiModelProperty(value = "机器条形码", required = true)
+//    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "机器条形码不能空")
+//    private String machineBarcode;
+
+//    @ApiModelProperty(value = "修复时间", required = true)
+//    @NotNull(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "修复时间不能空")
+//    private Date repairTime;
+
+//    @ApiModelProperty("旧压缩机编号")
+//    private String oldCompressNumber;
+//
+//    @ApiModelProperty("新压缩机编号")
+//    private String newCompressNumber;
+//
+//    @ApiModelProperty("配件条码")
+//    private String partsBarcode;
+//
+//    @ApiModelProperty("安装日期")
+//    private Date installTime;
+//
+//    @ApiModelProperty("自编码")
+//    private String customNo;
+
+//    @ApiModelProperty("备注")
+//    private String remark;
+}

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

@@ -0,0 +1,31 @@
+package com.gree.mall.manager.bean;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@ApiModel
+@Data
+public class WorkerNormStockBean {
+
+    @ApiModelProperty("收费标准编号")
+    private String normId;
+    @ApiModelProperty("师傅辅材编号")
+    private String workerGoodsId;
+    @ApiModelProperty("定义1比N扣减数量")
+    private BigDecimal qty;
+    @ApiModelProperty("师傅辅材名称")
+    private String goodsName;
+    @ApiModelProperty("师傅辅材名称")
+    private String salesUnit;
+    @ApiModelProperty("是否小件")
+    private Boolean isSmall;
+    @ApiModelProperty("库存数量")
+    private BigDecimal stockQty;
+    @ApiModelProperty("实际要扣减数量")
+    private BigDecimal realQty;
+    @ApiModelProperty("收费标准单价")
+    private BigDecimal normPrice;
+}

+ 101 - 5
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/OldRefundManageItemBean.java

@@ -1,12 +1,108 @@
 package com.gree.mall.manager.bean.material.worker;
 
-import com.gree.mall.manager.plus.entity.WebsitPartsOldRefundManageItem;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.gree.mall.manager.inf.ValidGroup;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 
-@EqualsAndHashCode(callSuper = true)
-@ApiModel
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+import java.util.Date;
+
 @Data
-public class OldRefundManageItemBean extends WebsitPartsOldRefundManageItem {
+@ApiModel
+@JsonIgnoreProperties(value = {"id"}, allowGetters = true)
+public class OldRefundManageItemBean {
+
+    @Null(groups = {ValidGroup.Add.class}, message = "id必须为空")
+    private String id;
+
+    @ApiModelProperty("申请单号")
+    @TableField("applyNo")
+    private String applyNo;
+
+    @ApiModelProperty("旧配件编码")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "旧配件编码不能空")
+    private String oldPartsNumber;
+
+    @ApiModelProperty("旧配件名称")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "旧配件名称不能空")
+    private String oldPartsName;
+
+    @ApiModelProperty("旧配件物料组名称")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "旧配件物料组名称不能空")
+    private String oldMaterialGroupName;
+
+    @ApiModelProperty("旧配件单位名称")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "旧配件单位不能空")
+    private String oldGoodsStockUnit;
+
+    @ApiModelProperty("数量")
+    @NotNull(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "数量不能空")
+    private BigDecimal qty;
+
+    @ApiModelProperty("旧件图片地址")
+    private String oldImage;
+
+    @ApiModelProperty("铭牌")
+    private String tab;
+
+    @ApiModelProperty("新配件编码")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "新配件编码不能空")
+    private String newPartsNumber;
+
+    @ApiModelProperty("新配件名称")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "新配件名称不能空")
+    private String newPartsName;
+
+    @ApiModelProperty("新配件物料组名称")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "新配件物料组名称不能空")
+    private String newMaterialGroupName;
+
+    @ApiModelProperty("新配件单位")
+    @NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class}, message = "新配件单位不能空")
+    private String newGoodsStockUnit;
+
+    @ApiModelProperty("维修记录编号")
+    private String repairRecordNumber;
+
+    @ApiModelProperty("机器条形码")
+    private String machineBarcode;
+
+    @ApiModelProperty("修复时间")
+    private Date repairTime;
+
+    @ApiModelProperty("旧压缩机编号")
+    private String oldCompressNumber;
+
+    @ApiModelProperty("新压缩机编号")
+    private String newCompressNumber;
+
+    @ApiModelProperty("配件条码")
+    private String partsBarcode;
+
+    @ApiModelProperty("安装日期")
+    private Date installTime;
+
+    @ApiModelProperty("自编码")
+    private String customNo;
+
+    @ApiModelProperty("是否备用件 false=否 true=是")
+    private Boolean isBackup;
+
+    @ApiModelProperty("是否备用件")
+    private String isBackupName;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("收费明细id")
+    private String workerOrderItemId;
 }

+ 9 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java

@@ -2,6 +2,7 @@ package com.gree.mall.manager.commonmapper;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.WorkerNormStockBean;
 import com.gree.mall.manager.bean.engin.EnginPayManageGatherVO;
 import com.gree.mall.manager.bean.engin.EnginPayManageVO;
 import com.gree.mall.manager.bean.material.base.*;
@@ -495,4 +496,12 @@ public interface MaterialMapper {
      * @return
      */
     IPage<WebsitPartsCreditItemVO> websitPartsCreditItemPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 收费标准师傅库存
+     * @param goodsId
+     * @param workerId
+     * @return
+     */
+    List<WorkerNormStockBean> queryWorkerStockQty(@Param("goodsId") String goodsId, @Param("workerId") String workerId);
 }

+ 20 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/PolicyOrderStutasEnum.java

@@ -0,0 +1,20 @@
+package com.gree.mall.manager.enums;
+
+
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.Getter;
+
+@Getter
+public enum  PolicyOrderStutasEnum implements BaseEnum {
+    WAIT("WAIT","未支付"),
+    DSX("DSX","待生效"),
+    BZZ("BZZ","保障中"),
+    YSX("YSX","已生效"),
+    ;
+
+    PolicyOrderStutasEnum(String key, String remark) {
+        this.key=key;this.remark = remark;
+    }
+    private String key;
+    private String remark;
+}

+ 14 - 0
mall-server-api/src/main/java/com/gree/mall/manager/inf/ValidGroup.java

@@ -0,0 +1,14 @@
+package com.gree.mall.manager.inf;
+
+/**
+ * 校验分组
+ */
+public interface ValidGroup {
+    interface Add {
+
+    }
+
+    interface Edit {
+
+    }
+}

+ 12 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/policy/AgreementLogic.java

@@ -485,6 +485,8 @@ public class AgreementLogic {
                 mailboxSendRecordPolicies.add(mailboxSendRecordPolicy);
 
                 policyOrder.setIsSend(IsYesNoEnum.YES.getKey());
+                policyOrder.setSendTime(new Date());
+                policyOrder.setSendBatch(mailboxSendRecord.getSendBatch());
                 policyOrder.updateById();
             }
 
@@ -550,6 +552,8 @@ public class AgreementLogic {
                 mailboxSendRecordPolicies.add(mailboxSendRecordPolicy);
 
                 policyOrder.setIsSend(IsYesNoEnum.YES.getKey());
+                policyOrder.setSendTime(new Date());
+                policyOrder.setSendBatch(mailboxSendRecord.getSendBatch());
                 policyOrder.updateById();
             }
 
@@ -611,6 +615,8 @@ public class AgreementLogic {
                     mailboxSendRecordPolicies.add(mailboxSendRecordPolicy);
 
                     policyOrder.setIsSend(IsYesNoEnum.YES.getKey());
+                    policyOrder.setSendTime(new Date());
+                    policyOrder.setSendBatch(mailboxSendRecord.getSendBatch());
                     policyOrder.updateById();
                 }
 
@@ -677,6 +683,8 @@ public class AgreementLogic {
                             .in(PolicyOrder::getId, policyOrderId)
                             .le(PolicyOrder::getStartTime, new Date())
                             .ge(PolicyOrder::getEndTime, new Date())
+                            .set(PolicyOrder::getIsReceipt, IsYesNoEnum.YES.getKey())
+                            .set(PolicyOrder::getReceiptTime, new Date())
                             .set(PolicyOrder::getPolicyOrderStatus, PolicyOrderEmStutasEnum.BZZ.getKey()).update();
                     workerPolicyService.lambdaUpdate()
                             .in(WorkerPolicy::getOrderId, policyOrderId)
@@ -693,6 +701,8 @@ public class AgreementLogic {
                             .in(PolicyOrder::getId, policyOrderId)
                             .set(PolicyOrder::getStartTime, DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), 1)))
                             .set(PolicyOrder::getEndTime, DateUtil.endOfDay(DateUtil.offsetMonth(new Date(), 12)))
+                            .set(PolicyOrder::getIsReceipt, IsYesNoEnum.YES.getKey())
+                            .set(PolicyOrder::getReceiptTime, new Date())
                             .set(PolicyOrder::getPolicyOrderStatus, PolicyOrderEmStutasEnum.DSX.getKey()).update();
 
 
@@ -726,6 +736,8 @@ public class AgreementLogic {
                     //将今天的工伤险都收到回执
                     policyOrderService.lambdaUpdate()
                             .in(PolicyOrder::getId, policyOrderId)
+                            .set(PolicyOrder::getIsReceipt, IsYesNoEnum.YES.getKey())
+                            .set(PolicyOrder::getReceiptTime, new Date())
                             .set(PolicyOrder::getPolicyOrderStatus, PolicyOrderEmStutasEnum.DSX.getKey()).update();
                 }
 

+ 6 - 2
mall-server-api/src/main/java/com/gree/mall/manager/logic/policy/WorkerManagerLogic.java

@@ -161,6 +161,8 @@ public class WorkerManagerLogic {
 
         WebsitUser websitUser = websitUserService.getById(id);
 
+        AdminWebsit adminWebsit = adminWebsitService.getById(websitUser.getWebsitId());
+
         WorkerManagerDetail workerManagerDetail = BeanUtil.toBean(websitUser, WorkerManagerDetail.class);
 
         workerManagerDetail.setUser(userService.getById(workerManagerDetail.getUserId()));
@@ -172,6 +174,8 @@ public class WorkerManagerLogic {
         workerManagerDetail.setWorkerImgs(list);
         workerManagerDetail.setWorkerPolicies(workerPolicies);
 
+        workerManagerDetail.setWebsitName(adminWebsit.getName());
+
         return workerManagerDetail;
 
     }
@@ -562,7 +566,7 @@ public class WorkerManagerLogic {
                 }
             }
 
-            if (workerPolicies.stream().filter(item -> item.getStatus().equals("BZZ")).count() < 1) {
+            if (workerPoliciesIn.stream().filter(item -> item.getStatus().equals("BZZ")).count() < 1) {
                 throw new RemoteServiceException("工伤险必须有生效的保险");
             }
 
@@ -587,7 +591,7 @@ public class WorkerManagerLogic {
                 }
             }
 
-            if (workerPolicies.stream().filter(item -> item.getStatus().equals("BZZ")).count() < 1) {
+            if (workerPoliciesEm.stream().filter(item -> item.getStatus().equals("BZZ")).count() < 1) {
                 throw new RemoteServiceException("雇主险必须有生效的保险");
             }
         }

+ 124 - 30
mall-server-api/src/main/java/com/gree/mall/manager/logic/user/UserLogic.java

@@ -20,6 +20,7 @@ import com.gree.mall.manager.bean.user.UserWxBean;
 import com.gree.mall.manager.bean.user.UserWxCustomerBean;
 import com.gree.mall.manager.commonmapper.*;
 import com.gree.mall.manager.enums.ExamineStatusEnum;
+import com.gree.mall.manager.enums.PolicyOrderStutasEnum;
 import com.gree.mall.manager.enums.UserTypeEnum;
 import com.gree.mall.manager.enums.admin.AdminWebsitTypeEnum;
 import com.gree.mall.manager.enums.base.BaseEnum;
@@ -281,35 +282,7 @@ public class UserLogic {
             UserWait userWait = new UserWait();
             userWait.setUserType(userTypeEnum.getKey());
             userWait.setMobile(mobile);
-            if (Objects.nonNull(adminWebsit)) {
-                userWait.setWebsitId(adminWebsit.getWebsitId());
-                userWait.setWebsitName(adminWebsit.getName());
-                //入驻已存在的师傅到网点
-                User worker = userService.lambdaQuery()
-                        .eq(User::getMobile, mobile)
-                        .eq(User::getType, UserTypeEnum.WORKER.getKey())
-                        .last("limit 1")
-                        .one();
-                if (Objects.nonNull(worker)) {
-                    this.saveWebsitUser(adminWebsit.getWebsitId(), worker, brank, workerNumber, "系统导入初始化");
-                }
-            }
 
-            userWait.setName(name);
-            userWait.setIdcard(idcard);
-            userWait.setIdCardStartTime(DateUtil.parse(idcardStartTime, "yyyy/MM/dd"));
-            userWait.setIdCardEndTime(DateUtil.parse(idcardEndTime, "yyyy/MM/dd"));
-            userWait.setCompanyWechatId(adminUser.getCompanyWechatId());
-            userWait.setCompanyWechatName(adminUser.getCompanyName());
-            userWait.setBankAccount(brank);
-            userWait.setWorkerNumber(workerNumber);
-
-            if (!StringUtil.isEmpty(hightNumber)) {
-                userWait.setNumber(hightNumber);
-                userWait.setStartTime(DateUtil.parse(hightStartTime, "yyyy/MM/dd"));
-                userWait.setEndTime(DateUtil.parse(hightEndTime, "yyyy/MM/dd"));
-                userWait.setHightExamineTime(DateUtil.parse(hightExamineTime, "yyyy/MM/dd"));
-            }
 
             if (adminWebsit.getInsureType().equals("意外险,工伤险")) {
 
@@ -356,6 +329,38 @@ public class UserLogic {
                 userWait.setInPolicyOrder(in_policy_order);
             }
 
+            if (Objects.nonNull(adminWebsit)) {
+                userWait.setWebsitId(adminWebsit.getWebsitId());
+                userWait.setWebsitName(adminWebsit.getName());
+                //入驻已存在的师傅到网点
+                User worker = userService.lambdaQuery()
+                        .eq(User::getMobile, mobile)
+                        .eq(User::getType, UserTypeEnum.WORKER.getKey())
+                        .last("limit 1")
+                        .one();
+                if (Objects.nonNull(worker)) {
+                    this.saveWebsitUser(adminWebsit.getWebsitId(), worker, brank, workerNumber, "系统导入初始化",userWait);
+                }
+            }
+
+            userWait.setName(name);
+            userWait.setIdcard(idcard);
+            userWait.setIdCardStartTime(DateUtil.parse(idcardStartTime, "yyyy/MM/dd"));
+            userWait.setIdCardEndTime(DateUtil.parse(idcardEndTime, "yyyy/MM/dd"));
+            userWait.setCompanyWechatId(adminUser.getCompanyWechatId());
+            userWait.setCompanyWechatName(adminUser.getCompanyName());
+            userWait.setBankAccount(brank);
+            userWait.setWorkerNumber(workerNumber);
+
+            if (!StringUtil.isEmpty(hightNumber)) {
+                userWait.setNumber(hightNumber);
+                userWait.setStartTime(DateUtil.parse(hightStartTime, "yyyy/MM/dd"));
+                userWait.setEndTime(DateUtil.parse(hightEndTime, "yyyy/MM/dd"));
+                userWait.setHightExamineTime(DateUtil.parse(hightExamineTime, "yyyy/MM/dd"));
+            }
+
+
+
             userWaits.add(userWait);
         }
         userWaitService.saveBatch(userWaits);
@@ -517,7 +522,7 @@ public class UserLogic {
         if (StringUtils.isNotBlank(websitId)) {
 
             User user = userService.getById(userId);
-            this.saveWebsitUser(websitId, user, userApplyBean.getBankAccount(), userApplyBean.getWorkerNumber(), "系统手动设置");
+          //  this.saveWebsitUser(websitId, user, userApplyBean.getBankAccount(), userApplyBean.getWorkerNumber(), "系统手动设置");
         }
 
         userService.lambdaUpdate()
@@ -548,7 +553,7 @@ public class UserLogic {
     }
 
     @Transactional
-    public void saveWebsitUser(String websitId, User user, String bankAccount, String workerNumber, String remark) {
+    public void saveWebsitUser(String websitId, User user, String bankAccount, String workerNumber, String remark,UserWait userWait) {
         // 用户师傅编号不为空并且师傅编号与传入师傅编号不一致,抛错
         if (StringUtils.isNotBlank(user.getWorkerNumber())
                 && !StringUtils.equals(user.getWorkerNumber(), workerNumber)) {
@@ -560,10 +565,12 @@ public class UserLogic {
                 .eq(WebsitUser::getUserId, user.getUserId())
                 .eq(WebsitUser::getWebsitId, websitId)
                 .remove();
+        AdminWebsit adminWebsit = adminWebsitService.getById(websitId);
         // 重新插入网点师傅记录
         WebsitUser websitUser = new WebsitUser();
         websitUser.setWebsitId(websitId);
         websitUser.setUserId(user.getUserId());
+        websitUser.setWebsitName(adminWebsit.getName());
         websitUser.setCompanyWechatId(user.getCompanyWechatId());
         websitUser.setCompanyWechatName(user.getCompanyName());
         websitUser.setExamineStatus(ExamineStatusEnum.OK.toString());
@@ -576,6 +583,93 @@ public class UserLogic {
             user.setWorkerNumber(workerNumber)
                     .updateById();
         }
+
+
+        //新意外增保险
+        if (!StringUtil.isEmpty(userWait.getPolicyOrder())){
+            WorkerPolicy workerPolicy = new WorkerPolicy();
+            workerPolicy.setWorkerId(websitUser.getWorkerNumber());
+            workerPolicy.setType("LINE");
+            workerPolicy.setOrderId(userWait.getPolicyOrder());
+            workerPolicy.setPolicyName(userWait.getPolicyName());
+            workerPolicy.setCompany(userWait.getCompany());
+            workerPolicy.setPolicyOrder(userWait.getPolicyOrder());
+            workerPolicy.setPolicyType("AC");
+            workerPolicy.setStartTime(userWait.getPolicyStartTime());
+            workerPolicy.setEndTime(userWait.getPolicyEndTime());
+            workerPolicy.setWebsitUserId(websitUser.getId());
+            workerPolicy.setWebsitId(websitUser.getWebsitId());
+            workerPolicy.setWebsitName(websitUser.getWebsitName());
+            workerPolicy.setWorkerName(user.getNickName());
+
+            if (new Date().after(userWait.getPolicyStartTime()) && new Date().before(userWait.getPolicyEndTime()))
+                workerPolicy.setStatus(PolicyOrderStutasEnum.BZZ.getKey());
+            else if (new Date().after(userWait.getPolicyEndTime()))
+                workerPolicy.setStatus(PolicyOrderStutasEnum.YSX.getKey());
+            else {
+                workerPolicy.setStatus(PolicyOrderStutasEnum.DSX.getKey());
+            }
+            workerPolicy.insert();
+        }
+
+
+        //新增雇主保险
+        if (!StringUtil.isEmpty(userWait.getEmPolicyOrder())){
+            WorkerPolicy workerPolicy = new WorkerPolicy();
+            workerPolicy.setWorkerId(websitUser.getWorkerNumber());
+            workerPolicy.setType("LINE");
+            workerPolicy.setOrderId(userWait.getEmPolicyOrder());
+            workerPolicy.setPolicyName(userWait.getEmPolicyName());
+            workerPolicy.setCompany(userWait.getEmCompany());
+            workerPolicy.setPolicyOrder(userWait.getEmPolicyOrder());
+            workerPolicy.setPolicyType("EM");
+            workerPolicy.setStartTime(userWait.getEmPolicyStartTime());
+            workerPolicy.setEndTime(userWait.getEmPolicyEndTime());
+            workerPolicy.setWebsitUserId(websitUser.getId());
+            workerPolicy.setWebsitId(websitUser.getWebsitId());
+            workerPolicy.setWebsitName(websitUser.getWebsitName());
+            workerPolicy.setWorkerName(user.getNickName());
+
+            if (new Date().after(workerPolicy.getStartTime()) && new Date().before(workerPolicy.getEndTime()))
+                workerPolicy.setStatus(PolicyOrderStutasEnum.BZZ.getKey());
+            else if (new Date().after(workerPolicy.getEndTime()))
+                workerPolicy.setStatus(PolicyOrderStutasEnum.YSX.getKey());
+            else {
+                workerPolicy.setStatus(PolicyOrderStutasEnum.DSX.getKey());
+            }
+
+            workerPolicy.insert();
+        }
+
+
+        //新增工伤保险
+        if (!StringUtil.isEmpty(userWait.getInPolicyOrder())){
+            WorkerPolicy workerPolicy = new WorkerPolicy();
+            workerPolicy.setWorkerId(websitUser.getWorkerNumber());
+            workerPolicy.setType("LINE");
+            workerPolicy.setOrderId(userWait.getInPolicyOrder());
+            workerPolicy.setPolicyName(userWait.getInPolicyName());
+            workerPolicy.setCompany(userWait.getInCompany());
+            workerPolicy.setPolicyOrder(userWait.getInPolicyOrder());
+            workerPolicy.setPolicyType("IN");
+            workerPolicy.setStartTime(userWait.getInPolicyStartTime());
+            workerPolicy.setEndTime(userWait.getInPolicyEndTime());
+            workerPolicy.setWebsitUserId(websitUser.getId());
+            workerPolicy.setWebsitId(websitUser.getWebsitId());
+            workerPolicy.setWebsitName(websitUser.getWebsitName());
+            workerPolicy.setWorkerName(user.getNickName());
+
+            if (new Date().after(workerPolicy.getStartTime()) && new Date().before(workerPolicy.getEndTime()))
+                workerPolicy.setStatus(PolicyOrderStutasEnum.BZZ.getKey());
+            else if (new Date().after(workerPolicy.getEndTime()))
+                workerPolicy.setStatus(PolicyOrderStutasEnum.YSX.getKey());
+            else {
+                workerPolicy.setStatus(PolicyOrderStutasEnum.DSX.getKey());
+            }
+
+            workerPolicy.insert();
+        }
+
     }
 
 

+ 1059 - 31
mall-server-api/src/main/java/com/gree/mall/manager/logic/websit/SettlementOrderLogic.java

@@ -1,40 +1,65 @@
 package com.gree.mall.manager.logic.websit;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.gree.mall.manager.bean.SalesCustomerPartsBean;
+import com.gree.mall.manager.bean.SalesCustomerPartsItemBean;
+import com.gree.mall.manager.bean.WorkerNormStockBean;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.material.stock.WorkerStockDTO;
+import com.gree.mall.manager.bean.material.worker.OldRefundManageBean;
+import com.gree.mall.manager.bean.material.worker.OldRefundManageItemBean;
 import com.gree.mall.manager.bean.websit.SettlementOrderDetail;
 import com.gree.mall.manager.bean.websit.SettlementOrderLogicVO;
 import com.gree.mall.manager.bean.websit.WorkerSettlementLineVO;
 import com.gree.mall.manager.bean.websit.WorkerSettlementVO;
+import com.gree.mall.manager.commonmapper.MaterialGoodsStockCMapper;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
 import com.gree.mall.manager.commonmapper.WebsitSalesRetCMapper;
-import com.gree.mall.manager.enums.IsYesNoEnum;
-import com.gree.mall.manager.enums.SettlementPayTypeEnum;
-import com.gree.mall.manager.enums.SettlementStatusEnum;
-import com.gree.mall.manager.enums.SettlementStatusNewEnum;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.enums.*;
+import com.gree.mall.manager.enums.material.*;
 import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.inf.ValidGroup;
 import com.gree.mall.manager.logic.common.CommonLogic;
 import com.gree.mall.manager.logic.common.WechatLogic;
 import com.gree.mall.manager.plus.entity.*;
 import com.gree.mall.manager.plus.service.*;
+import com.gree.mall.manager.utils.StringUtil;
+import com.gree.mall.manager.utils.ValidateUtil;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.extern.log4j.Log4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.redis.util.RedisLockRegistry;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+import springfox.documentation.annotations.ApiIgnore;
 
+import javax.validation.ValidationException;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
+@Log4j
 public class SettlementOrderLogic {
 
     @Autowired
@@ -44,6 +69,9 @@ public class SettlementOrderLogic {
     CommonLogic commonLogic;
 
     @Autowired
+    WebsitNormChargeService websitNormChargeService;
+
+    @Autowired
     SettlementOrderService settlementOrderService;
 
     @Autowired
@@ -61,6 +89,52 @@ public class SettlementOrderLogic {
     @Autowired
     WechatLogic wechatLogic;
 
+    @Autowired
+    WorkerOrderItemService workerOrderItemService;
+
+    @Autowired
+    PgOrderBaseService pgOrderBaseService;
+
+    @Autowired
+    AdminCompanyWechatService adminCompanyWechatService;
+
+    @Autowired
+    SettlementOrderManualItemService settlementOrderManualItemService;
+
+    @Autowired
+    WorkerSettlementManualService workerSettlementManualService;
+
+    @Autowired
+    WebsitNormRecordService websitNormRecordService;
+
+    @Autowired
+    AdminWebsitService adminWebsitService;
+
+    @Autowired
+    WorkerStockService workerStockService;
+
+    @Autowired
+    WebsitGoodsService websitGoodsService;
+
+    @Autowired
+    RedisLockRegistry redisLockRegistry;
+
+    @Autowired
+    MaterialMapper materialMapper;
+
+    @Autowired
+    MaterialGoodsStockCMapper materialGoodsStockCMapper;
+
+    @Autowired
+    WorkerStockAccService workerStockAccService;
+
+    @Autowired
+    WebsitPartsOldRefundManageService websitPartsOldRefundManageService;
+
+    @Autowired
+    WebsitPartsOldRefundManageItemService websitPartsOldRefundManageItemService;
+
+
     public IPage<SettlementOrderLogicVO> pageV2(ZfireParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
         List<String> companyWechatIds = adminUser.getCompanyWechatIds();
@@ -142,7 +216,6 @@ public class SettlementOrderLogic {
         }
 
 
-
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -162,26 +235,26 @@ public class SettlementOrderLogic {
 
         for (String workerId : workerIds) {
             //for (String websitId : websitIds) {
-                List<SettlementOrder> settlementOrdersList = settlementOrderService.lambdaQuery()
-                        .eq(SettlementOrder::getWorkerId, workerId)
-                        //.eq(SettlementOrder::getWebsitId, websitId)
-                        .in(SettlementOrder::getSettlementOrderId, id)
-                        .list();
-
-                if (CollectionUtils.isEmpty(settlementOrdersList))
-                    continue;
-
-                settlementOrderService.lambdaUpdate()
-                        .eq(SettlementOrder::getWorkerId, workerId)
-                        //.eq(SettlementOrder::getWebsitId, websitId)
-                        .in(SettlementOrder::getSettlementOrderId, id)
-                        .set(SettlementOrder::getStatus, SettlementStatusEnum.OVER.getKey())
-                        .set(SettlementOrder::getSettlementTime, new Date())
-                        .update();
-
-
-                this.addWithdrawal(settlementOrdersList);
-           // }
+            List<SettlementOrder> settlementOrdersList = settlementOrderService.lambdaQuery()
+                    .eq(SettlementOrder::getWorkerId, workerId)
+                    //.eq(SettlementOrder::getWebsitId, websitId)
+                    .in(SettlementOrder::getSettlementOrderId, id)
+                    .list();
+
+            if (CollectionUtils.isEmpty(settlementOrdersList))
+                continue;
+
+            settlementOrderService.lambdaUpdate()
+                    .eq(SettlementOrder::getWorkerId, workerId)
+                    //.eq(SettlementOrder::getWebsitId, websitId)
+                    .in(SettlementOrder::getSettlementOrderId, id)
+                    .set(SettlementOrder::getStatus, SettlementStatusEnum.OVER.getKey())
+                    .set(SettlementOrder::getSettlementTime, new Date())
+                    .update();
+
+
+            this.addWithdrawal(settlementOrdersList);
+            // }
         }
     }
 
@@ -242,7 +315,7 @@ public class SettlementOrderLogic {
         List<String> companyWechatIds = adminUser.getCompanyWechatIds();
 
         //1.组装查询条件
-        ZfireParamBean zfireParam = FieldUtils.supplyParam(zfireParamBean, WorkerSettlementVO.class,adminUser);
+        ZfireParamBean zfireParam = FieldUtils.supplyParam(zfireParamBean, WorkerSettlementVO.class, adminUser);
         IPage<WorkerSettlementVO> settlementOrderLogicVOIPage = websitSalesRetCMapper.workerSettlementPageV2(new Page(zfireParamBean.getPageNum(),
                         zfireParamBean.getPageSize()),
                 zfireParam);
@@ -285,7 +358,7 @@ public class SettlementOrderLogic {
         List<String> companyWechatIds = adminUser.getCompanyWechatIds();
 
         //1.组装查询条件
-        ZfireParamBean zfireParam = FieldUtils.supplyParam(zfireParamBean, WorkerSettlementLineVO.class,adminUser);
+        ZfireParamBean zfireParam = FieldUtils.supplyParam(zfireParamBean, WorkerSettlementLineVO.class, adminUser);
         IPage<WorkerSettlementLineVO> settlementOrderLogicVOIPage = websitSalesRetCMapper.pageLineSettlementV2(new Page(zfireParamBean.getPageNum(),
                         zfireParamBean.getPageSize()),
                 zfireParam);
@@ -308,9 +381,964 @@ public class SettlementOrderLogic {
                 .set(SettlementOrder::getStatus, SettlementStatusNewEnum.LINE.getKey()).update();
     }
 
-    public void sync() {
 
+    public void sync() throws WxPayException {
+
+        List<WorkerOrder> workerOrders = workerOrderService.lambdaQuery().eq(WorkerOrder::getPayState, IsYesNoEnum.YES.getKey())
+                .ge(WorkerOrder::getPayStateTime, DateUtil.offsetMinute(new Date(), -3)).list();
+
+        for (WorkerOrder workerOrder : workerOrders) {
+            WxPayService payService = wechatLogic.getPayJaspWebstiService(workerOrder.getConfigId(), "B");
+
+            WxPayOrderQueryResult wxPayOrderQueryResult = payService.queryOrder(workerOrder.getTranscationId(), workerOrder.getOrderId());
+
+
+            if (!wxPayOrderQueryResult.getResultCode().equals("SUCCESS")) {
+                continue;
+            }
+
+            AdminWebsit adminWebsit = adminWebsitService.getById(workerOrder.getWebsitId());
+
+
+            List<WorkerOrderItem> workerOrderItems = workerOrderItemService.lambdaQuery().eq(WorkerOrderItem::getOrderId, workerOrder.getOrderId()).list();
+
+
+            workerOrder.setTranscationId(wxPayOrderQueryResult.getTransactionId());
+            workerOrder.setPayState(IsYesNoEnum.YES.getKey());
+            workerOrder.setPayStateTime(new Date());
+
+
+            workerOrder.setConfigId(adminWebsit.getPayWorkerCodeId());
+            workerOrder.updateById();
+
+            workerOrder.setSource("小程序");
+
+            workerOrder.setPayTime(new Date());
+            workerOrder.setPayType("WECHAT");
+            workerOrder.setPayStatus(PayStatusEnum.PAID.getKey());
+            workerOrder.updateById();
+
+
+            //插入手工结算数据
+            if (workerOrder.getManualAmount() != null && workerOrder.getManualAmount().doubleValue() > 0) {
+                this.addManualSettlementOrder(workerOrder, workerOrderItems);
+                this.addSettlementManaulWorker(workerOrder, workerOrderItems);
+            }
+/*
+
+
+
+            //todo 辅材扣除
+
+            //插入使用记录
+            this.addNormRecord(workerOrder, workerOrderItems);
+
+            // this.addSettlementWorker(workerOrder,workerOrderItems);
+
+
+            // 定时任务辅材逻辑
+
+            // 配件扣库存
+            try {
+                if (workerOrder.getGoodsType().equals("P")) {
 
+                    List<WorkerOrderItem> inner = workerOrderItems.stream().filter(item -> item.getRepairFlag().equals("INNER")).collect(Collectors.toList());
+                    List<WorkerOrderItem> OUTSIDE = workerOrderItems.stream().filter(item -> item.getRepairFlag().equals("OUTSIDE")).collect(Collectors.toList());
+
+                    List<SalesCustomerPartsBean> salesCustomerPartsBeans = new ArrayList<>();
+
+                    if (!CollectionUtils.isEmpty(inner)) {
+                        SalesCustomerPartsBean salesCustomerPartsBean = new SalesCustomerPartsBean();
+                        salesCustomerPartsBean.setCompanyWechatId(workerOrder.getCompanyWechatId());
+                        salesCustomerPartsBean.setCompanyWechatName(workerOrder.getCompanyWechatName());
+                        salesCustomerPartsBean.setRepairFlag("INNER");
+                        salesCustomerPartsBean.setIdentity(workerOrder.getIdentity());
+                        salesCustomerPartsBean.setWorkerId(workerOrder.getWorkerId());
+                        salesCustomerPartsBean.setWorkerName(workerOrder.getWorkerName());
+                        salesCustomerPartsBean.setWorkOrderNo(workerOrder.getWorkerOrderId());
+                        salesCustomerPartsBean.setCustomerName(workerOrder.getUserName());
+                        salesCustomerPartsBean.setCustomerTel(workerOrder.getUserMobile());
+                        salesCustomerPartsBean.setReceiveWebsitId(adminWebsit.getWebsitId());
+                        salesCustomerPartsBean.setReceivePartsWebsitId(adminWebsit.getPartsWebsitId());
+                        salesCustomerPartsBean.setRemark(workerOrder.getRemark());
+
+
+                        List<SalesCustomerPartsItemBean> salesCustomerPartsItemBeans = new ArrayList<>();
+
+                        for (WorkerOrderItem workerOrderItem : inner) {
+                            SalesCustomerPartsItemBean salesCustomerPartsItemBean = new SalesCustomerPartsItemBean();
+
+                            salesCustomerPartsItemBean.setOldPartsName(workerOrderItem.getOldPartsName());
+                            salesCustomerPartsItemBean.setOldPartsNumber(workerOrderItem.getOldPartsNumber());
+                            salesCustomerPartsItemBean.setPartsNumber(workerOrderItem.getGoodsCode());
+                            salesCustomerPartsItemBean.setQty(workerOrderItem.getNum());
+                            salesCustomerPartsItemBean.setWorkerOrderItemId(workerOrderItem.getId());
+
+                            salesCustomerPartsItemBeans.add(salesCustomerPartsItemBean);
+
+                        }
+
+                        salesCustomerPartsBean.setItems(salesCustomerPartsItemBeans);
+
+                        salesCustomerPartsBeans.add(salesCustomerPartsBean);
+
+                    }
+
+
+                    if (!CollectionUtils.isEmpty(OUTSIDE)) {
+                        SalesCustomerPartsBean salesCustomerPartsBean = new SalesCustomerPartsBean();
+                        salesCustomerPartsBean.setCompanyWechatId(workerOrder.getCompanyWechatId());
+                        salesCustomerPartsBean.setCompanyWechatName(workerOrder.getCompanyWechatName());
+                        salesCustomerPartsBean.setRepairFlag("OUTSIDE");
+                        salesCustomerPartsBean.setIdentity(workerOrder.getIdentity());
+                        salesCustomerPartsBean.setWorkerId(workerOrder.getWorkerId());
+                        salesCustomerPartsBean.setWorkerName(workerOrder.getWorkerName());
+                        salesCustomerPartsBean.setWorkOrderNo(workerOrder.getWorkerOrderId());
+                        salesCustomerPartsBean.setCustomerName(workerOrder.getUserName());
+                        salesCustomerPartsBean.setCustomerTel(workerOrder.getUserMobile());
+                        salesCustomerPartsBean.setReceiveWebsitId(adminWebsit.getWebsitId());
+                        salesCustomerPartsBean.setReceivePartsWebsitId(adminWebsit.getPartsWebsitId());
+                        salesCustomerPartsBean.setRemark(workerOrder.getRemark());
+
+
+                        List<SalesCustomerPartsItemBean> salesCustomerPartsItemBeans = new ArrayList<>();
+
+                        for (WorkerOrderItem workerOrderItem : OUTSIDE) {
+                            SalesCustomerPartsItemBean salesCustomerPartsItemBean = new SalesCustomerPartsItemBean();
+
+                            salesCustomerPartsItemBean.setOldPartsName(workerOrderItem.getOldPartsName());
+                            salesCustomerPartsItemBean.setOldPartsNumber(workerOrderItem.getOldPartsNumber());
+                            salesCustomerPartsItemBean.setPartsNumber(workerOrderItem.getGoodsCode());
+                            salesCustomerPartsItemBean.setQty(workerOrderItem.getNum());
+                            salesCustomerPartsItemBean.setWorkerOrderItemId(workerOrderItem.getId());
+
+                            salesCustomerPartsItemBeans.add(salesCustomerPartsItemBean);
+
+                        }
+
+                        salesCustomerPartsBean.setItems(salesCustomerPartsItemBeans);
+
+                        salesCustomerPartsBeans.add(salesCustomerPartsBean);
+
+                    }
+
+
+                    if (CollectionUtil.isNotEmpty(salesCustomerPartsBeans)) {
+                        // 开始处理库存
+                        for (SalesCustomerPartsBean salesCustomerPartsBean : salesCustomerPartsBeans) {
+                            this.add(salesCustomerPartsBean);
+                        }
+
+                    }
+                }
+
+            } catch (Exception e) {
+                log.error(workerOrder.getOrderId() + " 师傅配件扣自有库存失败: ", e);
+                workerOrder.setExRemark(workerOrder.getOrderId() + " 师傅配件扣自有库存失败: " + e.getMessage());
+
+            }
+
+            // 辅材扣库存
+            try {
+                if (workerOrder.getGoodsType().equals(WebsitGoodsTypeEnum.M.toString())) {
+                    List<WorkerStockDTO> workerStockDTOS = new ArrayList<>();
+                    this.makeSubStockData(workerOrder, workerOrderItems, workerStockDTOS);
+
+                    if (CollectionUtil.isNotEmpty(workerStockDTOS)) {
+                        // 开始处理库存
+                        this.handleWorkerStock(workerStockDTOS);
+                    }
+                }
+            } catch (Exception e) {
+                log.error(workerOrder.getOrderId() + " 师傅辅材扣库存失败: ", e);
+                throw new RemoteServiceException("师傅辅材扣库存失败,没有库存");
+            }
+*/
+
+
+            //插入结算数据
+            this.addSettlementOrder(workerOrder, workerOrderItems);
+
+
+
+        }
+
+    }
+
+
+    private void addSettlementOrder(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems) {
+        AdminCompanyWechat adminCompanyWechat = adminCompanyWechatService.getById(workerOrder.getCompanyWechatId());
+
+        SettlementOrder settlementOrder = BeanUtil.toBean(workerOrder, SettlementOrder.class);
+
+        settlementOrder.setTranscationId(workerOrder.getTranscationId());
+        settlementOrder.setOpenId(workerOrder.getOpenId());
+
+        if (!StringUtil.isEmpty(workerOrder.getWorkerOrderId())){
+            PgOrderBase pgOrderBase = pgOrderBaseService.getById(workerOrder.getWorkerOrderId());
+            if (pgOrderBase != null){
+                settlementOrder.setSaleType(pgOrderBase.getSaleType());
+            }
+        }
+
+        settlementOrder.setAmount(settlementOrder.getTotalAmount());
+        if (adminCompanyWechat.getDayNum() != null) {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), adminCompanyWechat.getDayNum());
+            String format = DateUtil.format(dateTime, "yyyy-MM-dd");
+            String formatDate = format+" "+adminCompanyWechat.getHourTime();
+            DateTime parse = DateUtil.parse(formatDate);
+            settlementOrder.setChangeTime(parse);
+        }else {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), 1);
+            settlementOrder.setChangeTime(dateTime);
+        }
+
+        settlementOrder.insert();
+        List<SettlementOrderItem> settlementOrderItems = BeanUtil.copyToList(workerOrderItems, SettlementOrderItem.class);
+        for (SettlementOrderItem settlementOrderItem : settlementOrderItems) {
+            settlementOrderItem.setSettlementOrderId(settlementOrder.getSettlementOrderId());
+            settlementOrderItem.setWebsitId(settlementOrder.getWebsitId());
+            settlementOrderItem.setWebsitName(settlementOrder.getWebsitName());
+            settlementOrderItem.setGoodsType(settlementOrder.getGoodsType());
+        }
+        settlementOrderItemService.saveBatch(settlementOrderItems);
 
     }
+
+
+
+    private void addSettlementManaulWorker(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems) {
+        AdminCompanyWechat adminCompanyWechat = adminCompanyWechatService.getById(workerOrder.getCompanyWechatId());
+        WorkerSettlementManual one = workerSettlementManualService.lambdaQuery()
+                .eq(WorkerSettlementManual::getCompanyWechatId, adminCompanyWechat.getCompanyWechatId())
+                .eq(WorkerSettlementManual::getWebsitId, workerOrder.getWebsitId())
+                .eq(WorkerSettlementManual::getWorkerId, workerOrder.getWorkerId())
+                .last("limit 1").one();
+        if (one != null) {
+            one.setWorkerAmount(workerOrder.getManualAmount().add(one.getWorkerAmount()));
+            one.setWaitAmount(workerOrder.getManualAmount().add(one.getWaitAmount()));
+            one.setTotalAmount(workerOrder.getManualAmount().add(one.getTotalAmount()));
+            one.setTotalNum(one.getTotalNum().add(Convert.toBigDecimal("1")));
+            one.updateById();
+        } else {
+            WorkerSettlementManual workerSettlement = new WorkerSettlementManual();
+            workerSettlement.setCompanyWechatId(adminCompanyWechat.getCompanyWechatId());
+            workerSettlement.setCompanyWechatName(adminCompanyWechat.getCompanyName());
+            workerSettlement.setWebsitId(workerOrder.getWebsitId());
+            workerSettlement.setWebsitName(workerOrder.getWebsitName());
+            workerSettlement.setWorkerId(workerOrder.getWorkerId());
+            workerSettlement.setWorkerName(workerOrder.getWorkerName());
+            workerSettlement.setWorkerMobile(workerOrder.getWorkerMobile());
+            workerSettlement.setIdentity(workerOrder.getIdentity());
+            workerSettlement.setTotalAmount(workerOrder.getTotalAmount());
+            workerSettlement.setTotalNum(Convert.toBigDecimal("1"));
+            workerSettlement.setWaitAmount(workerOrder.getManualAmount());
+            workerSettlement.setWorkerAmount(workerOrder.getManualAmount());
+            workerSettlement.setTotalAmount(workerOrder.getManualAmount());
+            workerSettlement.insert();
+        }
+
+    }
+
+
+
+    private void addManualSettlementOrder(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems) {
+        AdminCompanyWechat adminCompanyWechat = adminCompanyWechatService.getById(workerOrder.getCompanyWechatId());
+
+        SettlementOrderManual settlementOrder = BeanUtil.toBean(workerOrder, SettlementOrderManual.class);
+
+        if (!StringUtil.isEmpty(workerOrder.getWorkerOrderId())) {
+            PgOrderBase pgOrderBase = pgOrderBaseService.getById(workerOrder.getWorkerOrderId());
+            if (pgOrderBase != null) {
+                settlementOrder.setSaleType(pgOrderBase.getSaleType());
+                settlementOrder.setUserName(pgOrderBase.getUserName());
+            }
+        }
+
+        if (adminCompanyWechat.getDayNum() != null) {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), adminCompanyWechat.getDayNum());
+            String format = DateUtil.format(dateTime, "yyyy-MM-dd");
+            String formatDate = format + " " + adminCompanyWechat.getHourTime();
+            DateTime parse = DateUtil.parse(formatDate);
+            settlementOrder.setChangeTime(parse);
+        } else {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), 1);
+            settlementOrder.setChangeTime(dateTime);
+        }
+
+        settlementOrder.insert();
+        List<SettlementOrderManualItem> settlementOrderItems = BeanUtil.copyToList(workerOrderItems, SettlementOrderManualItem.class);
+        for (SettlementOrderManualItem settlementOrderItem : settlementOrderItems) {
+            settlementOrderItem.setSettlementOrderId(settlementOrder.getSettlementOrderId());
+            settlementOrderItem.setWebsitId(settlementOrder.getWebsitId());
+            settlementOrderItem.setWebsitName(settlementOrder.getWebsitName());
+            settlementOrderItem.setGoodsType(settlementOrder.getGoodsType());
+        }
+        settlementOrderManualItemService.saveBatch(settlementOrderItems);
+    }
+
+/*
+
+    private void addSettlementOrder(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems) {
+        AdminCompanyWechat adminCompanyWechat = adminCompanyWechatService.getById(workerOrder.getCompanyWechatId());
+
+        SettlementOrder settlementOrder = BeanUtil.toBean(workerOrder, SettlementOrder.class);
+
+        settlementOrder.setTranscationId(workerOrder.getTranscationId());
+        settlementOrder.setOpenId(workerOrder.getOpenId());
+
+        if (!StringUtil.isEmpty(workerOrder.getWorkerOrderId())){
+            PgOrderBase pgOrderBase = pgOrderBaseService.getById(workerOrder.getWorkerOrderId());
+            if (pgOrderBase != null){
+                settlementOrder.setSaleType(pgOrderBase.getSaleType());
+            }
+        }
+
+        settlementOrder.setAmount(settlementOrder.getTotalAmount());
+        if (adminCompanyWechat.getDayNum() != null) {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), adminCompanyWechat.getDayNum());
+            String format = DateUtil.format(dateTime, "yyyy-MM-dd");
+            String formatDate = format+" "+adminCompanyWechat.getHourTime();
+            DateTime parse = DateUtil.parse(formatDate);
+            settlementOrder.setChangeTime(parse);
+        }else {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), 1);
+            settlementOrder.setChangeTime(dateTime);
+        }
+
+        settlementOrder.insert();
+        List<SettlementOrderItem> settlementOrderItems = BeanUtil.copyToList(workerOrderItems, SettlementOrderItem.class);
+        for (SettlementOrderItem settlementOrderItem : settlementOrderItems) {
+            settlementOrderItem.setSettlementOrderId(settlementOrder.getSettlementOrderId());
+            settlementOrderItem.setWebsitId(settlementOrder.getWebsitId());
+            settlementOrderItem.setWebsitName(settlementOrder.getWebsitName());
+            settlementOrderItem.setGoodsType(settlementOrder.getGoodsType());
+        }
+        settlementOrderItemService.saveBatch(settlementOrderItems);
+
+    }
+
+    */
+/**
+     * 单个师傅库存处理
+     *
+     * @param stockList
+     * @throws Exception
+     *//*
+
+    public void handleWorkerStock(List<WorkerStockDTO> stockList) throws Exception {
+        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
+            throw new RemoteServiceException("请先开启事务");
+        }
+        if (CollectionUtil.isEmpty(stockList)) {
+            return;
+        }
+        // 检查传入的参数
+        for (int i = 0; i < stockList.size(); i++) {
+            WorkerStockDTO workerStockDTO = stockList.get(i);
+            try {
+                ValidateUtil.validate(workerStockDTO);
+                if (workerStockDTO.getChangeQty().compareTo(BigDecimal.ZERO) <= 0) {
+                    throw new RuntimeException("变动数量不能少于0");
+                }
+            } catch (ValidationException ve) {
+                throw new RemoteServiceException("第" + (i + 1) + "行" + ve.getMessage());
+            }
+        }
+        // 锁定师傅配件库存
+        WorkerStockDTO workerStockDTO = stockList.get(0);
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.MATERIAL_STOCK_LOCK +
+                workerStockDTO.getCompanyWechatId() + ":" +
+                workerStockDTO.getWorkerId() + ":" +
+                workerStockDTO.getGoodsType());
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("库存已冻结:" + workerStockDTO.getWorkerName());
+        }
+        // 处理师傅库存
+        try {
+            this.saveWorkerStock(workerStockDTO, stockList);
+        } finally {
+            this.txCallUnlockWorker(obtain);
+        }
+    }
+
+
+    private void addNormRecord(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems) {
+        List<WebsitNormRecord> websitNormRecords = new ArrayList<>();
+        for (WorkerOrderItem workerOrderItem : workerOrderItems) {
+            WebsitNormRecord websitNormRecord = new WebsitNormRecord();
+            websitNormRecord.setCompanyWechatId(workerOrder.getCompanyWechatId());
+            websitNormRecord.setCompanyWechatName(workerOrder.getCompanyWechatName());
+            websitNormRecord.setGoodsType(workerOrder.getGoodsType());
+            websitNormRecord.setWorkerId(workerOrder.getWorkerId());
+            websitNormRecord.setWorkerName(workerOrder.getWorkerName());
+            websitNormRecord.setOrderId(workerOrder.getWorkerOrderId());
+            websitNormRecord.setRefOrder(workerOrder.getOrderId());
+            websitNormRecord.setWebsitId(workerOrder.getWebsitId());
+            websitNormRecord.setWebsitName(workerOrder.getWebsitName());
+            websitNormRecord.setUseTime(new Date());
+            websitNormRecord.setCreateTime(new Date());
+            websitNormRecord.setGoodsName(workerOrderItem.getGoodsName());
+            websitNormRecord.setGoodsCode(workerOrderItem.getGoodsCode());
+            websitNormRecord.setNormAmount(workerOrderItem.getNormAmount());
+            websitNormRecord.setUnit(workerOrderItem.getUnit());
+            websitNormRecord.setUseQty(Convert.toBigDecimal(workerOrderItem.getNum()));
+            websitNormRecords.add(websitNormRecord);
+        }
+
+        websitNormRecordService.saveBatch(websitNormRecords);
+
+    }
+
+
+    private void addManualSettlementOrder(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems) {
+        AdminCompanyWechat adminCompanyWechat = adminCompanyWechatService.getById(workerOrder.getCompanyWechatId());
+
+        SettlementOrderManual settlementOrder = BeanUtil.toBean(workerOrder, SettlementOrderManual.class);
+
+        if (!StringUtil.isEmpty(workerOrder.getWorkerOrderId())) {
+            PgOrderBase pgOrderBase = pgOrderBaseService.getById(workerOrder.getWorkerOrderId());
+            if (pgOrderBase != null) {
+                settlementOrder.setSaleType(pgOrderBase.getSaleType());
+                settlementOrder.setUserName(pgOrderBase.getUserName());
+            }
+        }
+
+        if (adminCompanyWechat.getDayNum() != null) {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), adminCompanyWechat.getDayNum());
+            String format = DateUtil.format(dateTime, "yyyy-MM-dd");
+            String formatDate = format + " " + adminCompanyWechat.getHourTime();
+            DateTime parse = DateUtil.parse(formatDate);
+            settlementOrder.setChangeTime(parse);
+        } else {
+            DateTime dateTime = DateUtil.offsetDay(new Date(), 1);
+            settlementOrder.setChangeTime(dateTime);
+        }
+
+        settlementOrder.insert();
+        List<SettlementOrderManualItem> settlementOrderItems = BeanUtil.copyToList(workerOrderItems, SettlementOrderManualItem.class);
+        for (SettlementOrderManualItem settlementOrderItem : settlementOrderItems) {
+            settlementOrderItem.setSettlementOrderId(settlementOrder.getSettlementOrderId());
+            settlementOrderItem.setWebsitId(settlementOrder.getWebsitId());
+            settlementOrderItem.setWebsitName(settlementOrder.getWebsitName());
+            settlementOrderItem.setGoodsType(settlementOrder.getGoodsType());
+        }
+        settlementOrderManualItemService.saveBatch(settlementOrderItems);
+    }
+
+
+    private void addSettlementManaulWorker(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems) {
+        AdminCompanyWechat adminCompanyWechat = adminCompanyWechatService.getById(workerOrder.getCompanyWechatId());
+        WorkerSettlementManual one = workerSettlementManualService.lambdaQuery()
+                .eq(WorkerSettlementManual::getCompanyWechatId, adminCompanyWechat.getCompanyWechatId())
+                .eq(WorkerSettlementManual::getWebsitId, workerOrder.getWebsitId())
+                .eq(WorkerSettlementManual::getWorkerId, workerOrder.getWorkerId())
+                .last("limit 1").one();
+        if (one != null) {
+            one.setWorkerAmount(workerOrder.getManualAmount().add(one.getWorkerAmount()));
+            one.setWaitAmount(workerOrder.getManualAmount().add(one.getWaitAmount()));
+            one.setTotalAmount(workerOrder.getManualAmount().add(one.getTotalAmount()));
+            one.setTotalNum(one.getTotalNum().add(Convert.toBigDecimal("1")));
+            one.updateById();
+        } else {
+            WorkerSettlementManual workerSettlement = new WorkerSettlementManual();
+            workerSettlement.setCompanyWechatId(adminCompanyWechat.getCompanyWechatId());
+            workerSettlement.setCompanyWechatName(adminCompanyWechat.getCompanyName());
+            workerSettlement.setWebsitId(workerOrder.getWebsitId());
+            workerSettlement.setWebsitName(workerOrder.getWebsitName());
+            workerSettlement.setWorkerId(workerOrder.getWorkerId());
+            workerSettlement.setWorkerName(workerOrder.getWorkerName());
+            workerSettlement.setWorkerMobile(workerOrder.getWorkerMobile());
+            workerSettlement.setIdentity(workerOrder.getIdentity());
+            workerSettlement.setTotalAmount(workerOrder.getTotalAmount());
+            workerSettlement.setTotalNum(Convert.toBigDecimal("1"));
+            workerSettlement.setWaitAmount(workerOrder.getManualAmount());
+            workerSettlement.setWorkerAmount(workerOrder.getManualAmount());
+            workerSettlement.setTotalAmount(workerOrder.getManualAmount());
+            workerSettlement.insert();
+        }
+
+    }
+
+
+    @Transactional
+    public String add(SalesCustomerPartsBean bean) throws Exception {
+//        try {
+        ValidateUtil.validate(bean, ValidGroup.Add.class);
+        for (SalesCustomerPartsItemBean itemBean : bean.getItems()) {
+            try {
+                ValidateUtil.validate(itemBean, ValidGroup.Add.class);
+            } catch (ValidationException e) {
+                throw new RemoteServiceException("明细出错原因:" + e.getMessage());
+            }
+        }
+        // 查询接收网点
+        AdminWebsit websit = adminWebsitService.lambdaQuery()
+                .eq(AdminWebsit::getCompanyWechatId, bean.getCompanyWechatId())
+                .eq(AdminWebsit::getWebsitId, bean.getReceiveWebsitId())
+                .eq(AdminWebsit::getPartsWebsitId, bean.getReceivePartsWebsitId())
+                .one();
+        if (Objects.isNull(websit)) {
+            throw new RemoteServiceException("接收网点不存在");
+        }
+
+        // 查询师傅在接收网点的新件库存
+        List<WorkerStock> workerStockList = workerStockService.lambdaQuery()
+                .eq(WorkerStock::getCompanyWechatId, bean.getCompanyWechatId())
+                .eq(WorkerStock::getIdentity, bean.getIdentity())
+                .eq(WorkerStock::getWebsitId, bean.getReceiveWebsitId())
+                .eq(WorkerStock::getPartsWebsitId, bean.getReceivePartsWebsitId())
+                .in(WorkerStock::getGoodsId, bean.getItems().stream()
+                        .map(SalesCustomerPartsItemBean::getPartsNumber)
+                        .collect(Collectors.toList()))
+                .list();
+        if (CollectionUtil.isEmpty(workerStockList)) {
+            throw new RemoteServiceException("在“" + websit.getName() + "”未找到新件配件库存");
+        }
+
+        // 查询配件资料
+        List<WebsitGoods> partsList = websitGoodsService.lambdaQuery()
+                .eq(WebsitGoods::getCompanyWechatId, bean.getCompanyWechatId())
+                .in(WebsitGoods::getGoodsCode, bean.getItems().stream()
+                        .map(SalesCustomerPartsItemBean::getPartsNumber)
+                        .collect(Collectors.toList()))
+                .list();
+
+        // 检查明细归还的数量必须大于0并且少于等于库存数量
+        Map<String, WorkerStock> workerStockMap = workerStockList.stream()
+                .collect(Collectors.toMap(WorkerStock::getGoodsId, Function.identity()));
+        Map<String, WebsitGoods> partsMap = partsList.stream()
+                .collect(Collectors.toMap(WebsitGoods::getGoodsCode, Function.identity()));
+
+        OldRefundManageBean oldRefundManageBean = this.convertBean(bean, websit, partsMap);
+
+        for (OldRefundManageItemBean itemBean : oldRefundManageBean.getOldRefundManageItemBeanList()) {
+            WorkerStock workerStock = workerStockMap.get(itemBean.getNewPartsNumber());
+            if (Objects.isNull(workerStock)) {
+                throw new RemoteServiceException("“" + itemBean.getNewPartsName() + "”新配件未找到库存记录");
+            }
+            if (itemBean.getQty().compareTo(workerStock.getQty()) > 0) {
+                throw new RemoteServiceException("“" + workerStock.getGoodsName() + "”使用新件数量不能大于库存数量");
+            }
+            if (itemBean.getQty().compareTo(BigDecimal.ZERO) < 1) {
+                throw new RemoteServiceException("“" + workerStock.getGoodsName() + "”使用新件数量必须大于0");
+            }
+            workerStockMap.get(itemBean.getNewPartsNumber()).setQty(workerStock.getQty().subtract(itemBean.getQty()));
+        }
+
+        String sheetId = commonLogic.generateMaterialNo(bean.getCompanyWechatId(), "JH", PartsRefTypeEnum.OLD_REFUND.getKey(), 13);
+        oldRefundManageBean.setApplyNo(sheetId);
+
+        // 保存主表和明细
+        WebsitPartsOldRefundManage partsOldRefundManage = new WebsitPartsOldRefundManage();
+        BeanUtils.copyProperties(oldRefundManageBean, partsOldRefundManage);
+        // workOrderNo与pgId是同值
+        partsOldRefundManage.setPgId(oldRefundManageBean.getWorkOrderNo());
+
+        List<WebsitPartsOldRefundManageItem> partsOldRefundManageItems = new ArrayList<>();
+        for (OldRefundManageItemBean itemBean : oldRefundManageBean.getOldRefundManageItemBeanList()) {
+            WebsitPartsOldRefundManageItem partsOldRefundManageItem = new WebsitPartsOldRefundManageItem();
+            itemBean.setId(IdWorker.getIdStr());
+            itemBean.setApplyNo(sheetId);
+            BeanUtils.copyProperties(itemBean, partsOldRefundManageItem);
+            partsOldRefundManageItem.setNewUnitName(itemBean.getNewGoodsStockUnit());
+            partsOldRefundManageItems.add(partsOldRefundManageItem);
+        }
+        partsOldRefundManage.setCreateBy(partsOldRefundManage.getWorkerName())
+                .setUpdateBy(partsOldRefundManage.getWorkerName())
+                .insert();
+
+        // 刷新创建人和更新人
+        websitPartsOldRefundManageService.lambdaUpdate()
+                .set(WebsitPartsOldRefundManage::getCreateBy, partsOldRefundManage.getWorkerName())
+                .set(WebsitPartsOldRefundManage::getUpdateBy, partsOldRefundManage.getWorkerName())
+                .eq(WebsitPartsOldRefundManage::getApplyNo, sheetId)
+                .update();
+
+        websitPartsOldRefundManageItemService.saveBatch(partsOldRefundManageItems);
+
+        // 减去师傅新件库存 增加旧件库存
+        String refType = PartsRepairFlagEnum.INNER.getKey().equals(partsOldRefundManage.getRepairFlag()) ?
+                PartsRefTypeEnum.OLD_REFUND.getRemark() :
+                PartsRefTypeEnum.OUTSIDE_TO_SALES.getRemark();
+        List<WorkerStockDTO> workerStockDTOList = this.createWorkerStockDTO(partsOldRefundManage, partsOldRefundManageItems,
+                refType, PartsAttrEnum.NEW.getKey(), PartsAttrEnum.OLD.getKey());
+        this.materialGoodsStockLogichandleWorkerStock(workerStockDTOList);
+
+        return sheetId;
+//        } catch (Exception e) {
+//            WorkerSalesCustomerInfo info = workerSalesCustomerInfoService.lambdaQuery()
+//                    .eq(WorkerSalesCustomerInfo::getCompanyWechatId, bean.getCompanyWechatId())
+//                    .eq(WorkerSalesCustomerInfo::getWorkOrderNo, bean.getWorkOrderNo())
+//                    .eq(WorkerSalesCustomerInfo::getRepairFlag, bean.getRepairFlag())
+//                    .one();
+//
+//            if (Objects.isNull(info)) {
+//                info = new WorkerSalesCustomerInfo();
+//                info.setErr(e.getMessage())
+//                        .setSalesCustomerJson(JSONUtil.toJsonStr(bean))
+//                        .setIdentity(bean.getIdentity())
+//                        .setCompanyWechatId(bean.getCompanyWechatId())
+//                        .insert();
+//            } else {
+//                info.setErr(e.getMessage())
+//                        .updateById();
+//            }
+//        }
+//        return null;
+    }
+    */
+/**
+     * 单个师傅库存处理
+     *
+     * @param stockList
+     * @throws Exception
+     *//*
+
+    public void materialGoodsStockLogichandleWorkerStock(List<WorkerStockDTO> stockList) throws Exception {
+        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
+            throw new RemoteServiceException("请先开启事务");
+        }
+        if (CollectionUtil.isEmpty(stockList)) {
+            return;
+        }
+        // 检查传入的参数
+        for (int i = 0; i < stockList.size(); i++) {
+            WorkerStockDTO workerStockDTO = stockList.get(i);
+            try {
+                ValidateUtil.validate(workerStockDTO);
+                if (workerStockDTO.getChangeQty().compareTo(BigDecimal.ZERO) <= 0) {
+                    throw new RuntimeException("变动数量不能少于0");
+                }
+            } catch (ValidationException ve) {
+                throw new RemoteServiceException("第" + (i + 1) + "行" + ve.getMessage());
+            }
+        }
+        // 锁定师傅配件库存
+        WorkerStockDTO workerStockDTO = stockList.get(0);
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.MATERIAL_STOCK_LOCK +
+                workerStockDTO.getCompanyWechatId() + ":" +
+                workerStockDTO.getWorkerId() + ":" +
+                workerStockDTO.getGoodsType());
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("库存已冻结:" + workerStockDTO.getWorkerName());
+        }
+        // 处理师傅库存
+        try {
+            this.saveWorkerStock(workerStockDTO, stockList);
+        } finally {
+            this.txCallUnlockWorker(obtain);
+        }
+    }
+
+
+    private List<WorkerStockDTO> createWorkerStockDTO(WebsitPartsOldRefundManage partsOldRefundManage,
+                                                      List<WebsitPartsOldRefundManageItem> partsOldRefundManageItems,
+                                                      String refType, String partsAttr1,
+                                                      String partsAttr2) {
+        List<WorkerStockDTO> workerStockDTOList = new ArrayList<>();
+        if (StringUtils.isNotBlank(partsAttr1)) {
+            for (WebsitPartsOldRefundManageItem refundManageItem : partsOldRefundManageItems) {
+                WorkerStockDTO workerStockDTO = new WorkerStockDTO();
+                workerStockDTO.setCompanyWechatId(partsOldRefundManage.getCompanyWechatId());
+                workerStockDTO.setCompanyWechatName(partsOldRefundManage.getCompanyWechatName());
+                workerStockDTO.setIdentity(partsOldRefundManage.getIdentity());
+                workerStockDTO.setWorkerId(partsOldRefundManage.getWorkerId());
+                workerStockDTO.setWorkerName(partsOldRefundManage.getWorkerName());
+                workerStockDTO.setWebsitId(partsOldRefundManage.getReceiveWebsitId());
+                workerStockDTO.setWebsitName(partsOldRefundManage.getReceiveWebsitName());
+                workerStockDTO.setPartsWebsitId(partsOldRefundManage.getReceivePartsWebsitId());
+                workerStockDTO.setSdate(DateUtil.date());
+                workerStockDTO.setGoodsType(WebsitGoodsTypeEnum.P.toString());
+                workerStockDTO.setGoodsId(refundManageItem.getNewPartsNumber());
+                workerStockDTO.setGoodsName(refundManageItem.getNewPartsName());
+                workerStockDTO.setMaterialGroupName(refundManageItem.getNewMaterialGroupName());
+                workerStockDTO.setGoodsStockUnit(refundManageItem.getNewUnitName());
+                workerStockDTO.setPrice(BigDecimal.ZERO);
+                workerStockDTO.setRef(partsOldRefundManage.getApplyNo());
+                workerStockDTO.setRefType(refType);
+                workerStockDTO.setPartsAttr(partsAttr1);
+                workerStockDTO.setChangeQty(refundManageItem.getQty());
+                workerStockDTO.setDirectFlag(DirectFlagEnum.SUB.getKey());
+                workerStockDTO.setRemark(refundManageItem.getRemark());
+                workerStockDTO.setWorkerOrderNo(partsOldRefundManage.getWorkOrderNo());
+                workerStockDTO.setOperateBy(partsOldRefundManage.getWorkerName());
+                workerStockDTO.setOperateTime(DateUtil.date());
+
+                workerStockDTOList.add(workerStockDTO);
+            }
+        }
+        if (StringUtils.isNotBlank(partsAttr2)) {
+            for (WebsitPartsOldRefundManageItem refundManageItem : partsOldRefundManageItems) {
+                WorkerStockDTO workerStockDTO = new WorkerStockDTO();
+                workerStockDTO.setCompanyWechatId(partsOldRefundManage.getCompanyWechatId());
+                workerStockDTO.setCompanyWechatName(partsOldRefundManage.getCompanyWechatName());
+                workerStockDTO.setIdentity(partsOldRefundManage.getIdentity());
+                workerStockDTO.setWorkerId(partsOldRefundManage.getWorkerId());
+                workerStockDTO.setWorkerName(partsOldRefundManage.getWorkerName());
+                workerStockDTO.setWebsitId(partsOldRefundManage.getReceiveWebsitId());
+                workerStockDTO.setWebsitName(partsOldRefundManage.getReceiveWebsitName());
+                workerStockDTO.setPartsWebsitId(partsOldRefundManage.getReceivePartsWebsitId());
+                workerStockDTO.setSdate(DateUtil.date());
+                workerStockDTO.setGoodsType(WebsitGoodsTypeEnum.P.toString());
+                workerStockDTO.setGoodsId(refundManageItem.getNewPartsNumber());
+                workerStockDTO.setGoodsName(refundManageItem.getNewPartsName());
+                workerStockDTO.setMaterialGroupName(refundManageItem.getNewMaterialGroupName());
+                workerStockDTO.setGoodsStockUnit(refundManageItem.getNewUnitName());
+                workerStockDTO.setPrice(BigDecimal.ZERO);
+                workerStockDTO.setRef(partsOldRefundManage.getApplyNo());
+                workerStockDTO.setRefType(refType);
+                workerStockDTO.setPartsAttr(partsAttr2);
+                workerStockDTO.setChangeQty(refundManageItem.getQty());
+                workerStockDTO.setDirectFlag(DirectFlagEnum.ADD.getKey());
+                workerStockDTO.setRemark(refundManageItem.getRemark());
+                workerStockDTO.setWorkerOrderNo(partsOldRefundManage.getWorkOrderNo());
+                workerStockDTO.setOperateBy(partsOldRefundManage.getWorkerName());
+                workerStockDTO.setOperateTime(DateUtil.date());
+
+                workerStockDTOList.add(workerStockDTO);
+            }
+        }
+        return workerStockDTOList;
+    }
+
+
+
+    private OldRefundManageBean convertBean(SalesCustomerPartsBean bean, AdminWebsit websit, Map<String, WebsitGoods> partsMap) {
+        OldRefundManageBean oldRefundManageBean = new OldRefundManageBean();
+        BeanUtils.copyProperties(bean, oldRefundManageBean);
+        if (PartsRepairFlagEnum.INNER.getKey().equals(bean.getRepairFlag())) {
+            oldRefundManageBean.setApplyType(PartsRefundApplyTypeEnum.OLD.getKey());
+        } else {
+            oldRefundManageBean.setApplyType(PartsRefundApplyTypeEnum.NOT.getKey());
+        }
+        oldRefundManageBean.setReceiveWebsitName(websit.getName());
+        oldRefundManageBean.setWebsitAddress(websit.getAddress());
+        oldRefundManageBean.setCreateBy(bean.getWorkerName());
+        oldRefundManageBean.setCreateTime(DateUtil.date());
+        oldRefundManageBean.setUpdateBy(bean.getWorkerName());
+        oldRefundManageBean.setUpdateTime(DateUtil.date());
+        oldRefundManageBean.setFlag(PartsOrderFlagEnum.SAVE.toString());
+
+        List<OldRefundManageItemBean> oldRefundManageItemBeanList = new ArrayList<>();
+        for (SalesCustomerPartsItemBean itemBean : bean.getItems()) {
+            OldRefundManageItemBean oldRefundManageItemBean = new OldRefundManageItemBean();
+            BeanUtils.copyProperties(itemBean, oldRefundManageItemBean);
+            WebsitGoods parts = partsMap.get(itemBean.getPartsNumber());
+            if (Objects.isNull(parts)) {
+                throw new RemoteServiceException("“" + itemBean.getPartsNumber() + "”配件编码未找到资料记录");
+            }
+            oldRefundManageItemBean.setOldPartsNumber(itemBean.getOldPartsNumber());
+            oldRefundManageItemBean.setOldPartsName(itemBean.getOldPartsName());
+            oldRefundManageItemBean.setNewPartsNumber(parts.getGoodsCode());
+            oldRefundManageItemBean.setNewPartsName(parts.getGoodsName());
+            oldRefundManageItemBean.setNewMaterialGroupName(parts.getMaterialGroupName());
+            oldRefundManageItemBean.setNewGoodsStockUnit(parts.getGoodsStockUnit());
+            oldRefundManageItemBeanList.add(oldRefundManageItemBean);
+        }
+        oldRefundManageBean.setOldRefundManageItemBeanList(oldRefundManageItemBeanList);
+        return oldRefundManageBean;
+    }
+
+
+    private void makeSubStockData(WorkerOrder workerOrder, List<WorkerOrderItem> workerOrderItems, List<WorkerStockDTO> workerStockDTOS) {
+        Map<String, WorkerNormStockBean> workerStockMap = new HashMap<>();
+        for (WorkerOrderItem item : workerOrderItems) {
+            WebsitNormCharge websitNormCharge = websitNormChargeService.getById(item.getGoodsId());
+            if (websitNormCharge.getNormType().equals(NormTypeEnum.M.getKey())) {
+                // 获取当前关联师傅库存记录
+                List<WorkerNormStockBean> stockBeanList = materialMapper.queryWorkerStockQty(item.getGoodsId(), workerOrder.getWorkerId());
+                if (CollectionUtil.isNotEmpty(stockBeanList)) {
+                    BigDecimal totalNum = item.getNum();
+                    for (WorkerNormStockBean stockBean : stockBeanList) {
+                        // 当前订单收费标准扣总数量
+                        BigDecimal useTotalQty = totalNum.multiply(stockBean.getQty());
+                        if (!workerStockMap.containsKey(stockBean.getWorkerGoodsId() + item.getGoodsAmount())) {
+                            WorkerNormStockBean bean = new WorkerNormStockBean();
+                            BeanUtils.copyProperties(stockBean, bean);
+                            bean.setRealQty(BigDecimal.ZERO);
+                            workerStockMap.put(bean.getWorkerGoodsId() + item.getGoodsAmount(), bean);
+                        }
+                        WorkerNormStockBean stock = workerStockMap.get(stockBean.getWorkerGoodsId() + item.getGoodsAmount());
+                        stock.setRealQty(stock.getRealQty().add(useTotalQty));
+                        stock.setNormPrice(item.getGoodsAmount());
+
+                        // 7、收费标准如果和辅材没有对应关系,不判断库存;从总部同步下来订单,如果师傅的库存不足,不限制支付;(允许负库存)
+//                        if (!stockBean.getIsSmall() && stock.getRealQty().compareTo(stockBean.getStockQty()) > 0) {
+//                            throw new RemoteServiceException("收费标准关联的 " + stockBean.getGoodsName() + "库存数量"
+//                                    + stock.getStockQty() + ", 需扣" + stock.getRealQty() + ", 库存数量不够扣减");
+//                        }
+                    }
+                }
+            }
+        }
+
+        for (Map.Entry<String, WorkerNormStockBean> entry : workerStockMap.entrySet()) {
+            final WorkerNormStockBean bean = entry.getValue();
+            // 库存减少
+            WorkerStockDTO workerStockDTO = new WorkerStockDTO();
+            workerStockDTO.setCompanyWechatId(workerOrder.getCompanyWechatId());
+            workerStockDTO.setCompanyWechatName(workerOrder.getCompanyWechatName());
+            workerStockDTO.setIdentity(workerOrder.getIdentity());
+            workerStockDTO.setWorkerId(workerOrder.getWorkerId());
+            workerStockDTO.setWorkerName(workerOrder.getWorkerName());
+            workerStockDTO.setWebsitId(workerOrder.getWebsitId());
+            workerStockDTO.setWebsitName(workerOrder.getWebsitName());
+            workerStockDTO.setSdate(workerOrder.getCreateTime());
+            workerStockDTO.setWorkerWebsitId(workerOrder.getWebsitId());
+            workerStockDTO.setWorkerWebsitName(workerOrder.getWebsitName());
+            workerStockDTO.setGoodsId(bean.getWorkerGoodsId());
+            workerStockDTO.setGoodsName(bean.getGoodsName());
+            workerStockDTO.setGoodsType(WebsitGoodsTypeEnum.M.toString());
+            workerStockDTO.setPrice(bean.getNormPrice());
+            workerStockDTO.setGoodsStockUnit(bean.getSalesUnit());
+            workerStockDTO.setRef(workerOrder.getOrderId());
+            workerStockDTO.setRefType("辅材销售");
+            workerStockDTO.setPartsAttr("NEW");
+            workerStockDTO.setChangeQty(bean.getRealQty());
+            workerStockDTO.setDirectFlag("SUB");
+            workerStockDTO.setFlag("USED");
+            workerStockDTO.setObj("客户");
+            workerStockDTO.setWorkerOrderNo(workerOrder.getWorkerOrderId());
+            workerStockDTO.setRemark(workerOrder.getRemark());
+            workerStockDTO.setOperateBy(workerOrder.getWorkerName());
+            workerStockDTO.setOperateTime(DateUtil.date());
+
+            workerStockDTOS.add(workerStockDTO);
+        }
+    }
+
+
+    */
+/**
+     * 单个师傅库存处理
+     *
+     * @param stockList
+     * @throws Exception
+     *//*
+
+    public void uhandleWorkerStock(List<WorkerStockDTO> stockList) throws Exception {
+        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
+            throw new RemoteServiceException("请先开启事务");
+        }
+        if (CollectionUtil.isEmpty(stockList)) {
+            return;
+        }
+        // 检查传入的参数
+        for (int i = 0; i < stockList.size(); i++) {
+            WorkerStockDTO workerStockDTO = stockList.get(i);
+            try {
+                ValidateUtil.validate(workerStockDTO);
+                if (workerStockDTO.getChangeQty().compareTo(BigDecimal.ZERO) <= 0) {
+                    throw new RuntimeException("变动数量不能少于0");
+                }
+            } catch (ValidationException ve) {
+                throw new RemoteServiceException("第" + (i + 1) + "行" + ve.getMessage());
+            }
+        }
+        // 锁定师傅配件库存
+        WorkerStockDTO workerStockDTO = stockList.get(0);
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.MATERIAL_STOCK_LOCK +
+                workerStockDTO.getCompanyWechatId() + ":" +
+                workerStockDTO.getWorkerId() + ":" +
+                workerStockDTO.getGoodsType());
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("库存已冻结:" + workerStockDTO.getWorkerName());
+        }
+        // 处理师傅库存
+        try {
+            this.saveWorkerStock(workerStockDTO, stockList);
+        } finally {
+            this.txCallUnlockWorker(obtain);
+        }
+    }
+
+    private void saveWorkerStock(WorkerStockDTO workerStockDTO, List<WorkerStockDTO> stockList) throws Exception {
+        // 查询存在的商品库存
+        List<WorkerStock> existWorkerStockList = materialGoodsStockCMapper.queryExistWorkerStockList(workerStockDTO.getCompanyWechatId()
+                , workerStockDTO.getWorkerId(), stockList);
+        // 全部商品库存
+        Map<String, WorkerStock> existWorkerStockMap = this.createNotExistWorkerStock(workerStockDTO.getGoodsType(), stockList, existWorkerStockList);
+        // 计算商品库存
+        List<WorkerStockAcc> workerStockAccList = new ArrayList<>();
+        this.computeWorkerStock(stockList, existWorkerStockMap, null, workerStockAccList);
+
+        if (CollectionUtil.isEmpty(workerStockAccList)) {
+            throw new RemoteServiceException("师傅配件库存处理失败");
+        }
+
+        workerStockService.saveOrUpdateBatch(existWorkerStockMap.values());
+        workerStockAccService.saveBatch(workerStockAccList);
+    }
+
+
+    private void computeWorkerStock(List<WorkerStockDTO> stockList, Map<String, WorkerStock> existWorkerStockMap,
+                                    List<WorkerStock> workerStockList, List<WorkerStockAcc> workerStockAccList) throws Exception {
+        for (WorkerStockDTO workerStockDTO : stockList) {
+            WorkerStock workerStock = existWorkerStockMap.get(workerStockDTO.getGoodsId());
+            if (workerStockDTO.getGoodsType().equals(WebsitGoodsTypeEnum.P.toString())) {
+                workerStock = existWorkerStockMap.get(workerStockDTO.getCompanyWechatId() + workerStockDTO.getWebsitId() + workerStockDTO.getPartsWebsitId() + workerStockDTO.getGoodsId());
+            }
+            WorkerStockAcc workerStockAcc = new WorkerStockAcc();
+            workerStockDTO.computeWorkerStock(workerStock, workerStockAcc);
+            workerStockAccList.add(workerStockAcc);
+        }
+    }
+
+
+    private Map<String, WorkerStock> createNotExistWorkerStock(String goodsType, List<WorkerStockDTO> stockList, List<WorkerStock> existWorkerStockList) {
+        // 已存在的商品库存转成Map
+        Map<String, WorkerStock> existShopStockMap;
+
+        if (goodsType.equals(WebsitGoodsTypeEnum.M.toString())) {
+            existShopStockMap = existWorkerStockList.stream()
+                    .collect(Collectors.toMap(WorkerStock::getGoodsId, Function.identity()));
+        } else {
+            existShopStockMap = existWorkerStockList.stream()
+                    .collect(Collectors.toMap(o -> o.getCompanyWechatId() + o.getWebsitId() + o.getPartsWebsitId() + o.getGoodsId(), Function.identity()));
+        }
+
+        // 找出不存在的商品库存并存入新商品库存List
+        for (WorkerStockDTO workerStockDTO : stockList) {
+            WorkerStock workerStock = existShopStockMap.get(workerStockDTO.getGoodsId());
+            if (goodsType.equals(WebsitGoodsTypeEnum.P.toString())) {
+                workerStock = existShopStockMap.get(workerStockDTO.getCompanyWechatId() + workerStockDTO.getWebsitId() + workerStockDTO.getPartsWebsitId() + workerStockDTO.getGoodsId());
+            }
+
+            if (Objects.isNull(workerStock)) {
+                workerStock = workerStockDTO.createWorkerStock();
+                if (goodsType.equals(WebsitGoodsTypeEnum.M.toString())) {
+                    existShopStockMap.put(workerStockDTO.getGoodsId(), workerStock);
+                } else {
+                    existShopStockMap.put(workerStockDTO.getCompanyWechatId() + workerStockDTO.getWebsitId() + workerStockDTO.getPartsWebsitId() + workerStockDTO.getGoodsId(), workerStock);
+                }
+            }
+        }
+        return existShopStockMap;
+    }
+
+
+    public void txCallUnlockWorker(Lock obtain) {
+        //事务提交完成后才释放锁,此方法禁止执行mysql相关操作,否则将导致重大问题。
+        if (TransactionSynchronizationManager.isActualTransactionActive()) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCompletion(int status) {
+
+                    if (TransactionSynchronization.STATUS_COMMITTED == status) {
+                        log.info("=========【师傅库存】======事务提交==============");
+                    } else if (TransactionSynchronization.STATUS_ROLLED_BACK == status) {
+                        log.info("========【师傅库存】=========事务回滚============");
+                    }
+
+                    obtain.unlock();
+                }
+            });
+        } else {
+            log.info("【师傅库存】====没有事务===释放锁");
+            obtain.unlock();
+        }
+    }
+*/
+
 }

+ 23 - 0
mall-server-api/src/main/resources/mapper/MaterialMapper.xml

@@ -1512,4 +1512,27 @@
         </if>
         ${ex.orderBy}
     </select>
+
+    <select id="queryWorkerStockQty"
+            resultType="com.gree.mall.manager.bean.WorkerNormStockBean">
+        SELECT
+            a.norm_id,
+            a.worker_goods_id,
+            a.qty,
+            b.goods_name,
+            b.is_small,
+            b.sales_unit,
+            ifnull(c.qty, 0) AS stock_qty
+        FROM
+            websit_norm_rela a
+                JOIN
+            worker_goods b
+            ON a.company_wechat_id = b.company_wechat_id AND a.worker_goods_id = b.goods_id
+                LEFT JOIN
+            worker_stock c
+            ON c.worker_id = #{workerId} AND a.company_wechat_id = c.company_wechat_id AND a.worker_goods_id = c.goods_id
+        WHERE
+            a.norm_id = #{goodsId}
+    </select>
+
 </mapper>

二進制
mall-server-api/src/main/resources/template/雇主险模板.xlsx