FengChaoYu il y a 9 mois
Parent
commit
593ca3c51f

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

@@ -0,0 +1,176 @@
+package com.gree.mall.manager.bean.settle.repair;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.repair.settle.SummaryStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class DailyImportSummaryItemVO {
+
+    @ZfireField(hide = true)
+    private String id;
+
+    @ApiModelProperty(value = "派工序号")
+    private String dispatchOrderNo;
+
+    @ApiModelProperty(value = "自编编号")
+    private String selfNo;
+
+    @ApiModelProperty(value = "工单状态")
+    private SummaryStatusEnum summaryStatus;
+
+    @ApiModelProperty(value = "导入批次号")
+    private String importBatchNo;
+
+    @ApiModelProperty(value = "新结算单位号")
+    private String summaryNumber;
+
+    @ApiModelProperty(value = "旧结算单位号")
+    private String oldSummaryNumber;
+
+    @ApiModelProperty(value = "结算单位名称")
+    private String summaryName;
+
+    @ApiModelProperty(value = "维修类型")
+    private String repairType;
+
+    @ApiModelProperty(value = "内外机")
+    private String inOutMachine;
+
+    @ApiModelProperty(value = "机器条码")
+    private String machineCode;
+
+    @ApiModelProperty(value = "外机型")
+    private String outMachineType;
+
+    @ApiModelProperty(value = "外机型描述")
+    private String outMachineDescribe;
+
+    @ApiModelProperty(value = "内机条码")
+    private String inMachineCode;
+
+    @ApiModelProperty(value = "内机类型")
+    private String inMachineType;
+
+    @ApiModelProperty(value = "内机型描述")
+    private String inMachineDescribe;
+
+    @ApiModelProperty(value = "用户姓名")
+    private String userName;
+
+    @ApiModelProperty(value = "区号")
+    private String areaCode;
+
+    @ApiModelProperty(value = "移动电话")
+    private String mobile;
+
+    @ApiModelProperty(value = "电话号码")
+    private String tel;
+
+    @ApiModelProperty(value = "省份")
+    private String province;
+
+    @ApiModelProperty(value = "市县")
+    private String city;
+
+    @ApiModelProperty(value = "区县")
+    private String county;
+
+    @ApiModelProperty(value = "用户地址")
+    private String userAddr;
+
+    @ApiModelProperty(value = "GPS定位")
+    private String gpsAddr;
+
+    @ApiModelProperty(value = "邮政编码")
+    private String postalCode;
+
+    @ApiModelProperty(value = "销售单位号")
+    private String saleDeptNo;
+
+    @ApiModelProperty(value = "销售单位")
+    private String saleDeptName;
+
+    @ApiModelProperty(value = "发票编号")
+    private String invoiceCode;
+
+    @ApiModelProperty(value = "购买日期")
+    private Date buyDate;
+
+    @ApiModelProperty(value = "安装日期")
+    private Date installDate;
+
+    @ApiModelProperty(value = "报修日期")
+    private Date reportDate;
+
+    @ApiModelProperty(value = "修复日期")
+    private Date repairDate;
+
+    @ApiModelProperty(value = "维修工id")
+    private String repairWorkerId;
+
+    @ApiModelProperty(value = "维修工名字")
+    private String repairWorkerName;
+
+    @ApiModelProperty(value = "维修工电话")
+    private String repairWorkerMobile;
+
+    @ApiModelProperty(value = "维修费用")
+    private BigDecimal repairFee;
+
+    @ApiModelProperty(value = "交通费")
+    private BigDecimal trafficFee;
+
+    @ApiModelProperty(value = "住宿费用")
+    private BigDecimal accommodationFee;
+
+    @ApiModelProperty(value = "吊装费用")
+    private BigDecimal liftingFee;
+
+    @ApiModelProperty(value = "其他费用")
+    private BigDecimal otherFee;
+
+    @ApiModelProperty(value = "总费用")
+    private BigDecimal totalFee;
+
+    @ApiModelProperty(value = "结算单批号")
+    private String settlementBatchNo;
+
+    @ApiModelProperty(value = "安装网点号")
+    private String installWebsitNo;
+
+    @ApiModelProperty(value = "安装网点名称")
+    private String installWebsitName;
+
+    @ApiModelProperty(value = "新维修单位号")
+    private String repairUnit;
+
+    @ApiModelProperty(value = "旧维修单位号")
+    private String oldRepairUnit;
+
+    @ApiModelProperty(value = "维修单位名")
+    private String repairName;
+
+    @ApiModelProperty(value = "故障现象")
+    private String faultPhenomenon;
+
+    @ApiModelProperty(value = "故障分析")
+    private String faultAnalysis;
+
+    @ApiModelProperty(value = "维修内容")
+    private String repairDetail;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "转结算时间")
+    private Date settlementTime;
+
+}

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

@@ -1,12 +1,56 @@
 package com.gree.mall.manager.bean.settle.repair;
 
 import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.repair.settle.SummaryStatusEnum;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 @Data
 @ApiModel
 @ZfireField(tbName = "a")
 public class DailyImportSummaryVO {
 
+    @ApiModelProperty(value = "所属商户")
+    private String companyWechatName;
+
+    @ApiModelProperty(value = "导入批次号")
+    private String importBatchNo;
+
+    @ZfireField(ignoreSelect = true)
+    @ApiModelProperty(value = "人数")
+    private Integer personNums;
+
+    @ZfireField(ignoreSelect = true)
+    @ApiModelProperty(value = "工单数量(单)")
+    private Integer orderNums;
+
+    @ZfireField(ignoreSelect = true)
+    @ApiModelProperty(value = "金额(元)")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "状态")
+    private SummaryStatusEnum summaryStatus;
+
+    @ApiModelProperty(value = "导入操作人")
+    private Date importBy;
+
+    @ApiModelProperty(value = "导入时间")
+    private String importTime;
+
+    @ApiModelProperty(value = "汇总操作人")
+    private String summaryBy;
+
+    @ApiModelProperty(value = "汇总时间")
+    private Date summaryTime;
+
+    @ApiModelProperty(value = "汇总批次号")
+    private String summaryBatchNo;
+
+    @ApiModelProperty(value = "发放月份")
+    private String month;
+
 }

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

@@ -29,6 +29,7 @@ import com.gree.mall.manager.bean.settle.SettleExpenseVO;
 import com.gree.mall.manager.bean.settle.SettleMonthWagesVO;
 import com.gree.mall.manager.bean.settle.SettleMonthWagesWorkerVO;
 import com.gree.mall.manager.bean.settle.repair.DailyBankAccountVO;
+import com.gree.mall.manager.bean.settle.repair.DailyImportSummaryItemVO;
 import com.gree.mall.manager.bean.settle.repair.DailyImportSummaryVO;
 import com.gree.mall.manager.bean.settle.repair.DailyWithholdVO;
 import com.gree.mall.manager.bean.workorder.*;
@@ -646,4 +647,12 @@ public interface CommonMapper {
      * @return
      */
     IPage<DailyImportSummaryVO> repairSettleDailyImportSummaryList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 结算数据导入明细列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<DailyImportSummaryItemVO> repairDetailList(Page page, @Param("ex") ZfireParamBean zfireParamBean);
 }

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

@@ -10,6 +10,9 @@ public class Constant {
     //会话存档大小
     public static final String HHCD_FILE_SIZE = "5000000";
 
+    //维修日结-待扣临时前缀
+    public final static String DAILY_PREFIX = "DAILY_TMP_";
+
     public class Ali {
         public final static String ACCESS_KEY_ID = "LTAI4GK1q4mnpCFbonMd1pji";
         public final static String ACCESS_KEY_SECERT = "E5LW0V1H8HBxqjKkExIxaXUgSyex6C";

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

@@ -3,6 +3,7 @@ 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.settle.repair.DailyImportSummaryItemVO;
 import com.gree.mall.manager.bean.settle.repair.DailyImportSummaryVO;
 import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.exception.RemoteServiceException;
@@ -10,6 +11,7 @@ import com.gree.mall.manager.helper.ResponseHelper;
 import com.gree.mall.manager.logic.settle.repair.DailyImportSummaryLogic;
 import com.gree.mall.manager.utils.excel.ExcelUtils;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -20,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
@@ -50,7 +53,7 @@ public class DailyImportSummaryController {
     public ResponseHelper importOrderData(
             @ApiParam(required = true, value = "附件") @RequestPart("file") MultipartFile file,
             @ApiParam(required = true, value = "类型 1. repair.结算工单 2. reduce.需扣回工单") @RequestParam String type,
-            @ApiParam(required = false, value = "导入批次号(覆盖导入时传入)") @RequestParam(required = false) String importBatchNo,
+            @ApiParam(value = "导入批次号(覆盖导入时传入)") @RequestParam(required = false) String importBatchNo,
             HttpServletRequest request
     ) throws Exception {
         List<Object> datas = ExcelUtils.importExcel(file);
@@ -91,4 +94,55 @@ public class DailyImportSummaryController {
         }
         return ResponseHelper.success();
     }
+
+    @ZfireList
+    @PostMapping("/repair/detail/list")
+    @ApiOperation(value = "结算数据导入明细-列表")
+    public ResponseHelper<IPage<DailyImportSummaryItemVO>> repairDetailList(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) {
+        IPage<DailyImportSummaryItemVO> page = dailyImportSummaryLogic.repairDetailList(zfireParamBean);
+        return ResponseHelper.success(page, new TypeReference<DailyImportSummaryItemVO>() {
+        });
+    }
+
+    @PostMapping("/repair/detail/list/export")
+    @ApiOperation("导出")
+    public void listExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<DailyImportSummaryItemVO> page = dailyImportSummaryLogic.repairDetailList(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(page.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/repair/item/delete")
+    @ApiOperation(value = "结算数据导入明细-删除/批量删除")
+    public ResponseHelper repairItemDelete(
+            @ApiParam(required = true, value = "id") @RequestParam List<Integer> ids
+    ){
+        dailyImportSummaryLogic.repairItemDelete(ids);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/repair/item/wait")
+    @ApiOperation(value = "结算数据导入明细-暂不结算/批量暂结算/不结算")
+    public ResponseHelper batchWaitSummary(
+            @ApiParam(required = true, value = "id") @RequestParam List<Integer> ids
+    ){
+        dailyImportSummaryLogic.batchWaitSummary(ids);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/repair/item/resummary")
+    @ApiOperation(value = "结算数据导入明细-恢复结算(批量)")
+    public ResponseHelper batchSummary(
+            @ApiParam(required = true, value = "id") @RequestParam List<Integer> ids
+    ){
+        dailyImportSummaryLogic.batchSummary(ids);
+        return ResponseHelper.success();
+    }
 }

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

@@ -0,0 +1,23 @@
+package com.gree.mall.manager.enums.repair.settle;
+
+import lombok.Getter;
+
+@Getter
+public enum DictCodeEnum {
+    //
+    WODENAME(""),
+    //维修日结算扣款配置-结算汇总暂扣款比例
+    DEDUCT_DAILY("维修日结算扣款配置-结算汇总暂扣款比例"),
+    EMP_RESIDUAL_DAILY("单工伤保险"),
+    INSURANCE_DAILY("残保金"),
+    INCR_DECR_DAILY("增减费用"),
+    REDUCE_DAILY("需扣回费用"),
+    SELECT_BANLANCE("余额预警通知手机号"),
+    BANLANCE_WARN_VALUE("余额预警值");
+
+    DictCodeEnum(String name) {
+        this.name = name;
+    }
+
+    private String name;
+}

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

@@ -1,15 +1,19 @@
 package com.gree.mall.manager.logic.settle.repair;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
 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.DailyImportSummaryItemVO;
 import com.gree.mall.manager.bean.settle.repair.DailyImportSummaryVO;
 import com.gree.mall.manager.bean.settle.repair.DailyTotalCostBean;
 import com.gree.mall.manager.commonmapper.CommonMapper;
 import com.gree.mall.manager.commonmapper.DailyMapper;
+import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.constant.DailyConstant;
 import com.gree.mall.manager.constant.SysDictConstant;
+import com.gree.mall.manager.enums.repair.settle.DictCodeEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.logic.common.CommonLogic;
 import com.gree.mall.manager.plus.entity.*;
@@ -48,6 +52,8 @@ public class DailyImportSummaryLogic {
     private final SettleDailyIssueSummaryRecordService settleDailyIssueSummaryRecordService;
     private final SysDictCompanyService sysDictCompanyService;
     private final SettleDailyWithholdService settleDailyWithholdService;
+    private final SettleDailyResidualInsuranceService settleDailyResidualInsuranceService;
+    private final SettleDailyRemaineBuckleService settleDailyRemaineBuckleService;
 
 
     public IPage<DailyImportSummaryVO> page(ZfireParamBean zfireParamBean) {
@@ -380,9 +386,9 @@ public class DailyImportSummaryLogic {
                 }
                 //处理本月要扣的工伤残保金,扣不完则留到历史费用
                 //2.扣工伤残保,并产生新的待扣记录
-//                issue = this.deductGscb(opName, nowMonth, summaryBatchNo, issue, cost, withholds);
+                issue = this.deductGscb(opName, nowMonth, summaryBatchNo, issue, cost, withholds, adminUser);
                 //3.处理历史待扣
-//                issue = this.historyAmount(issue, summaryBatchNo, opName);
+                issue = this.historyAmount(issue, summaryBatchNo, opName, adminUser);
             }
             issueList.add(issue);
         }
@@ -404,4 +410,325 @@ public class DailyImportSummaryLogic {
         }
         settleDailyImportSummaryItemService.updateBatchById(updateList, 500);
     }
+
+    /**
+     * 扣本月的工伤残保
+     */
+    public SettleDailyIssueSummaryRecord deductGscb(String opName, String nowMonth, String summaryBatchNo, SettleDailyIssueSummaryRecord issue, DailyTotalCostBean cost, List<SettleDailyWithhold> withholds, AdminUserCom adminUser) {
+
+        BigDecimal issueCost = issue.getIssueCost();
+        //查询本月是否有扣除记录
+        Integer count = settleDailyResidualInsuranceService.lambdaQuery()
+                .eq(SettleDailyResidualInsurance::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                .eq(SettleDailyResidualInsurance::getSendMonth, nowMonth)
+                .eq(SettleDailyResidualInsurance::getIdcard, cost.getIdCard())
+//                .eq(DailyResidualInsurance::getMobile,cost.getMobile())
+                .eq(SettleDailyResidualInsurance::getName, cost.getRepairWorkerName())
+                .count();
+        if (count == 0) {
+            //残保金月份扣除记录表
+            SettleDailyResidualInsurance insurance = new SettleDailyResidualInsurance();
+            insurance.setServiceNumber(cost.getWorkerNumber());
+            insurance.setMobile(cost.getMobile());
+            insurance.setIdcard(cost.getIdCard());
+            insurance.setName(cost.getRepairWorkerName());
+            insurance.setSendMonth(nowMonth);
+            insurance.setCreateTime(new Date());
+            insurance.setCreateBy(opName);
+            insurance.setSummaryBatchNo(summaryBatchNo);
+            insurance.insert();
+
+            for (SettleDailyWithhold withhold : withholds) {
+                BigDecimal withholdAmount = withhold.getAmount();
+                //减掉本次要扣的钱之后的钱
+                BigDecimal subAmount = issueCost.subtract(withholdAmount);
+                //处理工伤
+                if (DictCodeEnum.EMP_RESIDUAL_DAILY.getName().equals(withhold.getName())) {
+                    issue.setShouldEmpInsuranceCost(withholdAmount);
+
+                    if (subAmount.doubleValue() < 0) {
+                        //本次扣的工伤(所有钱)
+                        issue.setEmpInsuranceCost(issueCost);
+                        //不够扣,应发金额为0
+                        issueCost = BigDecimal.valueOf(0);
+                        //记录下次要扣的钱
+                        SettleDailyRemaineBuckle dailyRemaineBuckle = supplyRemaineBuckle(subAmount, DictCodeEnum.EMP_RESIDUAL_DAILY.toString(), cost.getWorkerNumber(),
+                                Constant.DAILY_PREFIX + summaryBatchNo, cost.getWebsitName(), cost.getWebsitNumber(), opName, cost.getIdCard());
+
+                        log.info("【产生历史待扣费用11】:{}", JSONObject.toJSONString(dailyRemaineBuckle));
+
+                        dailyRemaineBuckle.insert();
+                    } else {
+                        // 应发金额 = 应发金额 - 扣掉该扣的钱
+                        issueCost = subAmount;
+                        // 已扣完工伤
+                        issue.setEmpInsuranceCost(withholdAmount);
+                    }
+                }
+                //处理残保金
+                if (DictCodeEnum.INSURANCE_DAILY.getName().equals(withhold.getName())) {
+                    issue.setShouldResidualInsuranceCost(withhold.getAmount());
+                    issue.setResidualInsuranceCost(new BigDecimal(0));
+
+                    if (subAmount.doubleValue() < 0) {
+                        //本次已扣残保金
+                        issue.setResidualInsuranceCost(issueCost);
+                        //不够扣,应发金额为0
+                        issueCost = BigDecimal.valueOf(0);
+                        //记录下次要扣的钱
+                        SettleDailyRemaineBuckle dailyRemaineBuckle = this.supplyRemaineBuckle(subAmount, DictCodeEnum.INSURANCE_DAILY.toString(), cost.getWorkerNumber(),
+                                Constant.DAILY_PREFIX + summaryBatchNo, cost.getWebsitName(), cost.getWebsitNumber(), opName, cost.getIdCard());
+
+                        log.info("【产生历史待扣费用12】:{}", JSONObject.toJSONString(dailyRemaineBuckle));
+
+                        dailyRemaineBuckle.insert();
+                    } else {
+                        // 应发金额 = 应发金额 - 扣掉该扣的钱
+                        issueCost = subAmount;
+                        // 已扣完残保金
+                        issue.setResidualInsuranceCost(withholdAmount);
+                    }
+                }
+            }
+        }
+        issue.setIssueCost(issueCost);
+        return issue;
+    }
+
+
+    /**
+     * 处理历史费用
+     *
+     * @param issue 汇总数据
+     * @param adminUser
+     */
+    @Transactional
+    public SettleDailyIssueSummaryRecord historyAmount(SettleDailyIssueSummaryRecord issue, String summaryBatchNo, String opName, AdminUserCom adminUser) {
+        if (issue.getIssueCost().doubleValue() == 0) {
+            return issue;
+        }
+        List<SettleDailyRemaineBuckle> buckles = settleDailyRemaineBuckleService.lambdaQuery()
+                //.eq(DailyRemaineBuckle::getWorkerNumber,issue.getServiceNumber())
+                .eq(SettleDailyRemaineBuckle::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                .eq(SettleDailyRemaineBuckle::getIdcard, issue.getIdCard())
+                //.eq(DailyRemaineBuckle::getSummaryNumber,issue.getSummaryNumber())
+                .eq(SettleDailyRemaineBuckle::getIsBuckle, false)
+                .list();
+        if (CollectionUtils.isEmpty(buckles)) {
+            return issue;
+        }
+
+        //将所有未处理的历史数据都标记为本次已处理,后续逻辑将会产生新的历史待扣记录
+        List<String> buckleIds = buckles.stream().map(SettleDailyRemaineBuckle::getId).collect(Collectors.toList());
+        settleDailyRemaineBuckleService.lambdaUpdate()
+                .set(SettleDailyRemaineBuckle::getSummaryBatchNo, summaryBatchNo)
+                .set(SettleDailyRemaineBuckle::getIsBuckle, true)
+                .set(SettleDailyRemaineBuckle::getUpdateTime, new Date())
+                .set(SettleDailyRemaineBuckle::getUpdateBy, opName)
+                .in(SettleDailyRemaineBuckle::getId, buckleIds).update();
+
+        String summaryBatchNoTmp = Constant.DAILY_PREFIX + summaryBatchNo;
+
+        //增减费用
+        for (SettleDailyRemaineBuckle remaine : buckles) {
+            //历史费用
+            BigDecimal amount = remaine.getBuckleAmount();
+            if (DictCodeEnum.INCR_DECR_DAILY.toString().equals(remaine.getCostType())) {
+
+                BigDecimal sum = issue.getIssueCost().add(amount);
+                if (sum.doubleValue() > 0) {
+                    //记录增减费用
+                    issue.setIncrDecrCost(issue.getIncrDecrCost().add(amount));
+                    //还剩多少钱
+                    issue.setIssueCost(sum);
+                } else {
+                    issue.setIncrDecrCost(issue.getIncrDecrCost().add(issue.getIssueCost()));
+                    issue.setIssueCost(BigDecimal.valueOf(0));
+                    //产生历史费用
+                    //记录下次要扣的钱(这里不需要生成临时的批次号,驳回的时候也依据这个临时的批次号删除)
+                    SettleDailyRemaineBuckle dailyRemaineBuckle = this.supplyRemaineBuckle(sum, remaine.getCostType(), remaine.getWorkerNumber(),
+                            summaryBatchNoTmp, remaine.getWebsitName(), remaine.getWebsitNumber(), opName, remaine.getIdcard());
+                    dailyRemaineBuckle.insert();
+                }
+            }
+        }
+
+        if (issue.getIssueCost().doubleValue() == 0) {
+            return issue;
+        }
+
+        //处理扣回费用
+        for (SettleDailyRemaineBuckle remaine : buckles) {
+            //历史费用
+            BigDecimal amount = remaine.getBuckleAmount();
+            if (DictCodeEnum.REDUCE_DAILY.toString().equals(remaine.getCostType())) {
+                if (amount.doubleValue() > 0) {
+                    amount = BigDecimal.valueOf(0).subtract(amount);
+                }
+                BigDecimal sum = issue.getIssueCost().add(amount);
+                if (sum.doubleValue() > 0) {
+                    //应扣回费用
+                    issue.setShouldReduceCost(issue.getShouldReduceCost().add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+                    //实际已扣回费用
+                    issue.setReduceCost(issue.getReduceCost().add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+
+                    issue.setIssueCost(sum);
+                } else {
+                    issue.setReduceCost(issue.getReduceCost().add(issue.getIssueCost()));
+                    issue.setIssueCost(BigDecimal.valueOf(0));
+                    //产生历史费用
+                    //记录下次要扣的钱(这里不需要生成临时的批次号,驳回的时候也依据这个临时的批次号删除)
+                    SettleDailyRemaineBuckle dailyRemaineBuckle = this.supplyRemaineBuckle(sum, remaine.getCostType(), remaine.getWorkerNumber(),
+                            summaryBatchNoTmp, remaine.getWebsitName(), remaine.getWebsitNumber(), opName, remaine.getIdcard());
+                    dailyRemaineBuckle.insert();
+                }
+            }
+        }
+
+        if (issue.getIssueCost().doubleValue() == 0) {
+            return issue;
+        }
+
+        //处理历史的工伤残保金
+        for (SettleDailyRemaineBuckle remaine : buckles) {
+            //历史费用
+            BigDecimal amount = remaine.getBuckleAmount();
+
+            BigDecimal sum = issue.getIssueCost().add(amount);
+            if (DictCodeEnum.INSURANCE_DAILY.toString().equals(remaine.getCostType())
+                    || DictCodeEnum.EMP_RESIDUAL_DAILY.toString().equals(remaine.getCostType())) {
+
+                if (sum.doubleValue() > 0) {
+                    if (DictCodeEnum.INSURANCE_DAILY.toString().equals(remaine.getCostType())) {
+                        //残保金应扣
+                        issue.setShouldResidualInsuranceCost(issue.getShouldResidualInsuranceCost()
+                                .add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+                        //残保金已扣
+                        issue.setResidualInsuranceCost(issue.getResidualInsuranceCost()
+                                .add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+
+                    } else {
+                        //工伤保险应扣
+                        issue.setShouldEmpInsuranceCost(issue.getShouldEmpInsuranceCost()
+                                .add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+                        //工伤保险已扣
+                        issue.setEmpInsuranceCost(issue.getEmpInsuranceCost()
+                                .add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+                    }
+                    issue.setIssueCost(sum);
+                } else {
+                    //不够扣
+                    if (DictCodeEnum.INSURANCE_DAILY.toString().equals(remaine.getCostType())) {
+                        //残保金应扣
+                        issue.setShouldResidualInsuranceCost(issue.getShouldResidualInsuranceCost()
+                                .add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+                        //残保金已扣
+                        issue.setResidualInsuranceCost(issue.getResidualInsuranceCost()
+                                .add(issue.getIssueCost()));
+                    } else {
+                        //工伤保险应扣
+                        issue.setShouldEmpInsuranceCost(issue.getShouldEmpInsuranceCost()
+                                .add(amount.doubleValue() < 0 ? BigDecimal.valueOf(0).subtract(amount) : amount));
+                        //工伤保险已扣
+                        issue.setEmpInsuranceCost(issue.getEmpInsuranceCost().add(issue.getIssueCost()));
+                    }
+                    issue.setIssueCost(BigDecimal.valueOf(0));
+                    //产生历史费用
+                    //记录下次要扣的钱(这里不需要生成临时的批次号,驳回的时候也依据这个临时的批次号删除)
+                    SettleDailyRemaineBuckle dailyRemaineBuckle = this.supplyRemaineBuckle(sum, remaine.getCostType(), remaine.getWorkerNumber(),
+                            summaryBatchNoTmp, remaine.getWebsitName(), remaine.getWebsitNumber(), opName, remaine.getIdcard());
+
+                    log.info("【产生历史待扣费用2】:{}", JSONObject.toJSONString(dailyRemaineBuckle));
+
+                    dailyRemaineBuckle.insert();
+                }
+
+                remaine.setSummaryBatchNo(summaryBatchNo);
+                remaine.setIsBuckle(true);
+                remaine.setUpdateTime(new Date());
+                remaine.updateById();
+            }
+        }
+
+        return issue;
+    }
+
+    public SettleDailyRemaineBuckle supplyRemaineBuckle(BigDecimal buckle, String type, String workerNumber,
+                                                        String summaryBatchNo, String websiteName, String websiteNumber, String opName, String idcard) {
+        SettleDailyRemaineBuckle bean = new SettleDailyRemaineBuckle();
+        bean.setCostType(type);
+        bean.setBuckleAmount(buckle);
+        bean.setIsBuckle(false);
+        bean.setWorkerNumber(workerNumber);
+        bean.setSummaryBatchNo(summaryBatchNo);
+        bean.setCreateBy(opName);
+        bean.setCreateTime(new Date());
+        bean.setWebsitName(websiteName);
+        bean.setIdcard(idcard);
+        bean.setWebsitNumber(websiteNumber);
+        //bean.insert();
+        return bean;
+    }
+
+    public IPage<DailyImportSummaryItemVO> repairDetailList(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.supplyParam(zfireParamBean, DailyImportSummaryItemVO.class, adminUser);
+
+        return commonMapper.repairDetailList(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    /**
+     * 删除结算导入明细
+     */
+    @Transactional
+    public void repairItemDelete(List<Integer> ids) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+
+        Integer count = settleDailyImportSummaryItemService.lambdaQuery()
+                .eq(SettleDailyImportSummaryItem::getCompanyWechatId, adminUser.getCompanyWechatId())
+                .in(SettleDailyImportSummaryItem::getId,ids)
+                .eq(SettleDailyImportSummaryItem::getSummaryStatus,DailyConstant.SUMMARY_STATUS_HAS)
+                .count();
+        if(count > 0){
+            throw new RemoteServiceException("存在已汇总的数据,无法删除");
+        }
+
+        settleDailyImportSummaryItemService.lambdaUpdate()
+                .eq(SettleDailyImportSummaryItem::getCompanyWechatId, adminUser.getCompanyWechatId())
+                .in(SettleDailyImportSummaryItem::getId,ids)
+                .in(SettleDailyImportSummaryItem::getSummaryStatus,DailyConstant.SUMMARY_STATUS_CAN_DEL)
+                .remove();
+    }
+
+    public void batchWaitSummary(List<Integer> ids) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+
+        settleDailyImportSummaryItemService.lambdaUpdate()
+                .set(SettleDailyImportSummaryItem::getSummaryStatus,DailyConstant.SUMMARY_STATUS_WAIT)
+                .in(SettleDailyImportSummaryItem::getSummaryStatus,DailyConstant.SUMMARY_STATUS_CAN_DO)
+                .in(SettleDailyImportSummaryItem::getId,ids)
+                .update();
+    }
+
+    public void batchSummary(List<Integer> ids) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+
+        settleDailyImportSummaryItemService.lambdaUpdate()
+                .set(SettleDailyImportSummaryItem::getSummaryStatus,DailyConstant.SUMMARY_STATUS_NOT)
+                .eq(SettleDailyImportSummaryItem::getSummaryStatus,DailyConstant.SUMMARY_STATUS_WAIT)
+                .in(SettleDailyImportSummaryItem::getId,ids)
+                .update();
+    }
 }

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

@@ -49,10 +49,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -197,7 +194,9 @@ public class UserLogic {
         Map<String, AdminWebsit> websitMap = list.stream().collect(Collectors.toMap(AdminWebsit::getName, Function.identity()));
         int index = 0;
         //先删除
-        userWaitService.lambdaUpdate().eq(UserWait::getCompanyWechatId, adminUser.getCompanyWechatId()).remove();
+        userWaitService.lambdaUpdate()
+                .eq(UserWait::getCompanyWechatId, adminUser.getCompanyWechatId())
+                .remove();
 
         List<UserWait> userWaits = new ArrayList<>();
         for (Object o : datas) {
@@ -219,7 +218,7 @@ public class UserLogic {
                 throw new RemoteServiceException(errPrefix + "手机号格式不正确");
             }
             UserTypeEnum userTypeEnum = BaseEnum.valueToEnum(UserTypeEnum.class, userType);
-            if (userTypeEnum == null || userTypeEnum == UserTypeEnum.GENERAL) {
+            if (Objects.isNull(userTypeEnum) || userTypeEnum == UserTypeEnum.GENERAL) {
                 throw new RemoteServiceException(errPrefix + "用户类型填写不合规,请填写【师傅】或者【分销员】");
             }
             AdminWebsit adminWebsit = null;
@@ -228,19 +227,23 @@ public class UserLogic {
                     throw new RemoteServiceException(errPrefix + "网点名称不能为空");
                 }
                 adminWebsit = websitMap.get(websitName);
-                if (adminWebsit == null) {
+                if (Objects.isNull(adminWebsit)) {
                     throw new RemoteServiceException(errPrefix + "网点不存在");
                 }
             }
             UserWait userWait = new UserWait();
             userWait.setUserType(userTypeEnum.getKey());
             userWait.setMobile(mobile);
-            if (adminWebsit != null) {
+            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 (worker != null) {
+                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, bankAccount, workerNumber, "系统导入初始化");
                 }
             }
@@ -436,7 +439,12 @@ public class UserLogic {
 
     @Transactional
     public void saveWebsitUser(String websitId, User user, String bankAccount, String workerNumber, String remark) {
-        websitUserService.lambdaUpdate().eq(WebsitUser::getUserId, user.getUserId()).eq(WebsitUser::getWebsitId, websitId).remove();
+        // 先清空网点师傅记录
+        websitUserService.lambdaUpdate()
+                .eq(WebsitUser::getUserId, user.getUserId())
+                .eq(WebsitUser::getWebsitId, websitId)
+                .remove();
+        // 重新插入网点师傅记录
         WebsitUser websitUser = new WebsitUser();
         websitUser.setWebsitId(websitId);
         websitUser.setUserId(user.getUserId());

+ 13 - 1
mall-server-api/src/main/resources/mapper/CommonMapper.xml

@@ -89,7 +89,6 @@
         select
         ${ex.selected},
         b.websit_id,
-        b.worker_number,
         c.name as 'websit_name',
         d.nick_name as 'slaveWorkerName'
         from user a
@@ -1092,5 +1091,18 @@
         ${ex.orderBy}
     </select>
 
+    <select id="repairDetailList"
+            resultType="com.gree.mall.manager.bean.settle.repair.DailyImportSummaryItemVO">
+        SELECT
+        ${ex.selected}
+        FROM
+        settle_daily_import_summary_item a
+        ${ex.query}
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
 
 </mapper>