瀏覽代碼

客户,合同文件导入

rainwer 7 月之前
父節點
當前提交
68807a7a11

+ 22 - 4
src/main/java/cn/ezhizao/project/business/company/controller/BizCompanyController.java

@@ -14,9 +14,7 @@ import cn.ezhizao.common.utils.StringUtils;
 import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
 import cn.ezhizao.project.business.channel.domain.BizChannel;
 import cn.ezhizao.project.business.channel.service.IBizChannelService;
-import cn.ezhizao.project.business.company.domain.BizCompanyImport;
-import cn.ezhizao.project.business.company.domain.BizEntrustTemplate;
-import cn.ezhizao.project.business.company.domain.DictRegion;
+import cn.ezhizao.project.business.company.domain.*;
 import cn.ezhizao.project.business.company.domain.vo.ExportZero;
 import cn.ezhizao.project.business.company.domain.vo.Region;
 import cn.ezhizao.project.business.company.domain.vo.ZeroTemplate;
@@ -47,7 +45,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import cn.ezhizao.framework.aspectj.lang.annotation.Log;
 import cn.ezhizao.framework.aspectj.lang.enums.BusinessType;
-import cn.ezhizao.project.business.company.domain.BizCompany;
 import cn.ezhizao.project.business.company.service.IBizCompanyService;
 import cn.ezhizao.framework.web.domain.AjaxResult;
 import cn.ezhizao.common.utils.poi.ExcelUtil;
@@ -129,6 +126,27 @@ public class BizCompanyController extends BaseController
         String message = bizCompanyService.importCompany(companyList, operName, getTenantId() == null ? 0 : getTenantId());
         return success(message);
     }
+
+    @Log(title = "客户管理", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('business:company:add')")
+    @PostMapping("/importDataNew")
+    public AjaxResult importDataNew(MultipartFile file) throws Exception
+    {
+        ExcelUtil<BizCompanyImportNew> util = new ExcelUtil<>(BizCompanyImportNew.class);
+        List<BizCompanyImportNew> companyList = util.importExcel(file.getInputStream());
+        String operName = getUsername();
+        // 获取 入Excel 表头字段
+//        List<String> excelHeaders = util.readExcelHeaders(file.getInputStream());
+//        //获取实体类字段
+//        List<String> names=getExcelAnnotatedFields(BizCompanyImportNew.class);
+//        //如果不存在模板中的字段,返回错误
+//        if (!names.containsAll(excelHeaders)) {
+//            return error("导入数据与模板不匹配!");
+//        }
+        String message = bizCompanyService.importCompanyNew(companyList, operName, getTenantId() == null ? 0 : getTenantId());
+        return success(message);
+    }
+
     @PostMapping("/importZero")
     public AjaxResult importZero(MultipartFile file) throws Exception
     {

+ 384 - 0
src/main/java/cn/ezhizao/project/business/company/domain/BizCompanyExcel.java

@@ -0,0 +1,384 @@
+package cn.ezhizao.project.business.company.domain;
+
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+import cn.ezhizao.framework.web.domain.BaseEntity;
+import cn.ezhizao.project.business.companyContactor.domain.BizCompanyContactor;
+import cn.ezhizao.project.business.companyFollow.domain.BizCompanyFollowDetail;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * company对象 biz_company
+ *
+ * @author ezhizao
+ * @date 2023-10-16
+ */
+@Data
+@TableName(value = "biz_company")
+public class BizCompanyExcel extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 合作伙伴分类:1、客户;2、供应商;3、外协商 */
+    @ApiModelProperty(value = "合作伙伴分类:1、客户;2、供应商;3、外协商")
+    private String category;
+
+    /** 客户编码 */
+    @Excel(name = "客户编码")
+    @ApiModelProperty(value = "客户编码")
+    private String code;
+
+    /** 客户名称 */
+    @Excel(name = "客户名称",width = 35)
+    @ApiModelProperty(value = "客户名称")
+    @Size(min = 0, max = 100)
+    private String name;
+
+    /** 客户简称 */
+    @Excel(name = "客户简称")
+    @ApiModelProperty(value = "客户简称")
+    @Size(min = 0, max = 50)
+    private String shortName;
+
+    /** 曾用名 */
+    @Excel(name = "曾用名")
+    @ApiModelProperty(value = "曾用名")
+    private String oldName;
+
+    /** 所有权人 */
+    @Excel(name = "所有权人")
+    @ApiModelProperty(value = "所有权人")
+    private String owner;
+
+    /** 所有权人ID外键(字典所有权人分类) */
+    @ApiModelProperty(value = "所有权人")
+    private Long ownerId;
+
+    /** 企业电话 */
+    @Excel(name = "企业电话")
+    @ApiModelProperty(value = "企业电话")
+    private String phone;
+
+    /** 企业邮箱 */
+    @Excel(name = "企业邮箱")
+    @ApiModelProperty(value = "企业邮箱")
+    private String email;
+
+    /** 联系地址 */
+    @Excel(name = "联系地址")
+    @ApiModelProperty(value = "联系地址")
+    private String contactAddress;
+
+    /** 客户阶段字典分类外键 */
+    @ApiModelProperty(value = "联系地址")
+    private Long stageId;
+
+    /** 等级,对应的是数据字典外键 */
+    @ApiModelProperty(value = "联系地址")
+    private Long companyLevelId;
+
+    /** 客户来源:与合同来源共用一个数据源 */
+    @ApiModelProperty(value = "联系地址")
+    private Long sourceCategoryId;
+
+    /** 客户来源 */
+    @Excel(name = "客户来源")
+    @ApiModelProperty(value = "客户来源")
+    private String source;
+
+    /** 客户来源: */
+    @ApiModelProperty(value = "客户来源")
+    private Long sourceId;
+
+    /** 企业类型 */
+    @Excel(name = "企业类型")
+    @ApiModelProperty(value = "企业类型")
+    private String type;
+
+    /** 企业类型字典分类外键 */
+    @ApiModelProperty(value = "企业类型")
+    private Long typeId;
+
+    /** 社会信用代码 */
+    @Excel(name = "社会统一信用代码")
+    @ApiModelProperty(value = "社会统一信用代码")
+    @Pattern(regexp = "^$|^. {18}$", message = "社会统一信用代码必须为18位")
+    private String socialCreditCode;
+
+    /** 主营业务 */
+    @Excel(name = "主营业务")
+    @ApiModelProperty(value = "主营业务")
+    private String mainBusiness;
+
+    /** 主营行业字典分类外键 */
+    @ApiModelProperty(value = "主营业务")
+    private Long mainBusinessId;
+
+    /** 法定代表人 */
+    @Excel(name = "法定代表人")
+    @ApiModelProperty(value = "法定代表人")
+    private String legalRepresentative;
+
+    /** 成立日期 */
+    @Excel(name = "成立日期")
+    @ApiModelProperty(value = "成立日期")
+    @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$")
+    private String foundationDate;
+
+    /** 出执照日期 */
+    @Excel(name = "出执照日期")
+    @ApiModelProperty(value = "出执照日期")
+    private String licenceDate;
+
+    /** 营业开始时间 */
+    @Excel(name = "营业开始时间")
+    @ApiModelProperty(value = "营业开始时间")
+    private String businessStartDate;
+
+    /** 营业结束时间 */
+    @Excel(name = "营业结束时间")
+    @ApiModelProperty(value = "营业结束时间")
+    private String businessEndDate;
+
+    /** 长期有效否 */
+    @Excel(name = "长期有效否")
+    @ApiModelProperty(value = "长期有效否")
+    private Integer isPermanentlyEffective;
+
+    /** 注册资金 */
+    @Excel(name = "注册资金")
+    @ApiModelProperty(value = "注册资金")
+    private String registerMoney;
+
+    /** 注册资金单位 */
+    @Excel(name = "注册资金单位")
+    @ApiModelProperty(value = "注册资金单位")
+    private String registerMoneyUnit;
+
+    /** 注册资金数据字典id */
+    @ApiModelProperty(value = "注册资金单位")
+    private Long registerMoneyUnitId;
+
+    /** 注册省份编码 */
+    @Excel(name = "注册省份编码")
+    @ApiModelProperty(value = "注册省份编码")
+    private String provinceCode;
+
+    /** 省 */
+    @Excel(name = "省")
+    @ApiModelProperty(value = "省")
+    private String province;
+
+    /** 注册城市编码 */
+    @Excel(name = "注册城市编码")
+    @ApiModelProperty(value = "注册城市编码")
+    private String cityCode;
+
+    /** 市 */
+    @Excel(name = "市")
+    @ApiModelProperty(value = "市")
+    private String city;
+
+    /** 注册行政区编码 */
+    @Excel(name = "注册行政区编码")
+    @ApiModelProperty(value = "注册行政区编码")
+    private String districtCode;
+
+    /** 区 */
+    @Excel(name = "区")
+    @ApiModelProperty(value = "区")
+    private String district;
+
+    /** 注册详细地址 */
+    @Excel(name = "注册详细地址")
+    @ApiModelProperty(value = "注册详细地址")
+    private String address;
+
+    /** 经营范围 */
+    @Excel(name = "经营范围")
+    @ApiModelProperty(value = "经营范围")
+    private String businessField;
+
+    /** 纳税类型 */
+    @Excel(name = "纳税类型")
+    @ApiModelProperty(value = "纳税类型")
+    private String taxType;
+
+    /** 纳税类型字典分类ID外键 */
+    @ApiModelProperty(value = "纳税类型")
+    private Long taxTypeId;
+
+    /** 报税类别ID外键字典 */
+    @ApiModelProperty(value = "纳税类型")
+    private Long taxDeclarationCategoryId;
+
+    /** 是否零申报 */
+    @Excel(name = "是否零申报")
+    @ApiModelProperty(value = "是否零申报")
+    private Integer isZero;
+
+    /** 税盘ID外键字典 */
+    @ApiModelProperty(value = "是否零申报")
+    private Long taxDishId;
+
+    /** 主管税务机关 */
+    @Excel(name = "主管税务机关")
+    @ApiModelProperty(value = "主管税务机关")
+    private String competentTaxAuthority;
+
+    /** 税务专管员 */
+    @Excel(name = "税务专管员")
+    @ApiModelProperty(value = "税务专管员")
+    private String taxCollectorName;
+
+    /** 专管员电话 */
+    @Excel(name = "专管员电话")
+    @ApiModelProperty(value = "专管员电话")
+    private String taxCollectorPhone;
+
+    /** 核税月份 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "核税月份", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "核税月份")
+    private Date taxMonth;
+
+    /** 开户行 */
+    @Excel(name = "开户行")
+    @ApiModelProperty(value = "开户行")
+    private String openingBank;
+
+    /** 银行账户 */
+    @Excel(name = "银行账户")
+    @ApiModelProperty(value = "银行账户")
+    private String bankAccount;
+
+    /** 账套外键 */
+    @ApiModelProperty(value = "银行账户")
+    private Long accountSetsId;
+
+    /** 主程序账套外键 */
+    @ApiModelProperty(value = "系统外键")
+    private Long tenantId;
+
+    /** 年收入 */
+    @Excel(name = "年收入")
+    @ApiModelProperty(value = "年收入")
+    private String annualIncome;
+
+    /** 政务网账号 */
+    @Excel(name = "政务网账号")
+    @ApiModelProperty(value = "政务网账号")
+    private String governmentAccountNo;
+
+    /** 政务网密码 */
+    @Excel(name = "政务网密码")
+    @ApiModelProperty(value = "政务网密码")
+    private String governmentPassword;
+
+    /** 社保账号 */
+    @Excel(name = "社保账号")
+    @ApiModelProperty(value = "社保账号")
+    private String socialSecurityAccountNo;
+
+    /** 社保密码 */
+    @Excel(name = "社保密码")
+    @ApiModelProperty(value = "社保密码")
+    private String socialSecurityPassword;
+
+    /** 用工密码 */
+    @Excel(name = "用工密码")
+    @ApiModelProperty(value = "用工密码")
+    private String employeePassword;
+
+    /** 公积金密码 */
+    @Excel(name = "公积金密码")
+    @ApiModelProperty(value = "公积金密码")
+    private String housingFundPassword;
+
+    /** 公积金单位账号 */
+    @Excel(name = "公积金单位账号")
+    @ApiModelProperty(value = "公积金单位账号")
+    private String housingFundUnitAccount;
+
+    /** 公积金划款密码 */
+    @Excel(name = "公积金划款密码")
+    @ApiModelProperty(value = "公积金划款密码")
+    private String housingFundDeductionPassword;
+
+    /** 征收方式 */
+    @Excel(name = "征收方式")
+    @ApiModelProperty(value = "征收方式")
+    private String collectionMethod;
+
+    /** 定额金额 */
+    @Excel(name = "定额金额")
+    @ApiModelProperty(value = "定额金额")
+    private BigDecimal quotaAmount;
+
+    /** 窗口现金交 */
+    @Excel(name = "窗口现金交")
+    @ApiModelProperty(value = "窗口现金交")
+    private Integer isPayOnWindow;
+
+    /** 初次社保信息保存 */
+    @Excel(name = "初次社保信息保存")
+    @ApiModelProperty(value = "初次社保信息保存")
+    private Integer isFirstSocialSecurity;
+
+    /** 初次公积金信息保存 */
+    @Excel(name = "初次公积金信息保存")
+    @ApiModelProperty(value = "初次公积金信息保存")
+    private Integer isFirstHousingFund;
+
+
+    @ApiModelProperty(value = "跟进记录")
+    @TableField(exist = false)
+    private List<BizCompanyFollowDetail> followDetails;
+
+    @ApiModelProperty("客户联系人")
+    @TableField(exist = false)
+    private List<BizCompanyContactor> contactors;
+
+    @TableField(exist = false)
+    @Excel(name = "来源类型")
+    private String sourceCategoryName;
+    @ApiModelProperty("客户标签")
+    private Long customerLabelId;
+    @TableField(exist = false)
+    @Excel(name="来源名称")
+    private String sourceName;
+
+    @ApiModelProperty("负责人")
+    private Long leaderId;
+    @ApiModelProperty("客服")
+    private Long adviserId;
+
+    @Excel(name = "负责人")
+    @TableField(exist = false)
+    private String leaderName;
+    @Excel(name = "客服")
+    @TableField(exist = false)
+    private String adviserName;
+    @TableField(exist = false)
+    private String referrerDataSource;
+    @TableField(exist = false)
+    private List<Long> ids;
+
+    @TableField(exist = false)
+    private List<String> columns;
+
+    @TableField(exist = false)
+    private String keyword;
+
+    @TableField(exist = false)
+    private String principal;
+}

+ 44 - 0
src/main/java/cn/ezhizao/project/business/company/domain/BizCompanyImportNew.java

@@ -0,0 +1,44 @@
+package cn.ezhizao.project.business.company.domain;
+
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Size;
+
+@Data
+public class BizCompanyImportNew {
+
+    /** 客户名称 */
+    @Excel(name = "公司名称",width = 35)
+    @ApiModelProperty(value = "公司名称")
+    @Size(min = 0, max = 100)
+    private String name;
+
+    @TableField(exist = false)
+    @Excel(name = "纳税人识别号")
+    private String socialCreditCode;
+
+    @Excel(name = "负责人")
+    @TableField(exist = false)
+    private String leaderName;
+
+    @Excel(name = "签单人")
+    @TableField(exist = false)
+    private String adviserName;
+
+    @TableField(exist = false)
+    @Excel(name="纳税人类型")
+    private String taxType;
+
+    @TableField(exist = false)
+    @Excel(name="是否零申报")
+    private String isZero;
+
+    @TableField(exist = false)
+    @Excel(name="租户ID")
+    private Long tenantId;
+
+}

+ 3 - 0
src/main/java/cn/ezhizao/project/business/company/service/IBizCompanyService.java

@@ -1,6 +1,7 @@
 package cn.ezhizao.project.business.company.service;
 
 import cn.ezhizao.project.business.company.domain.BizCompany;
+import cn.ezhizao.project.business.company.domain.BizCompanyImportNew;
 import cn.ezhizao.project.business.company.domain.vo.ExportZero;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -37,5 +38,7 @@ public interface IBizCompanyService extends IService<BizCompany>
 
     String importCompany(List<BizCompany> companyList, String operName, Long tenantId);
 
+    String importCompanyNew(List<BizCompanyImportNew> companyList, String operName, Long tenantId);
+
     String importZero(List<ExportZero> companyList, long l);
 }

+ 79 - 0
src/main/java/cn/ezhizao/project/business/company/service/impl/BizCompanyServiceImpl.java

@@ -8,6 +8,7 @@ import cn.ezhizao.common.utils.bean.BeanValidators;
 import cn.ezhizao.project.business.channel.domain.BizChannel;
 import cn.ezhizao.project.business.channel.mapper.BizChannelMapper;
 import cn.ezhizao.project.business.company.domain.BizCompany;
+import cn.ezhizao.project.business.company.domain.BizCompanyImportNew;
 import cn.ezhizao.project.business.company.domain.vo.ExportZero;
 import cn.ezhizao.project.business.company.mapper.BizCompanyMapper;
 import cn.ezhizao.project.business.company.service.IBizCompanyService;
@@ -28,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import javax.validation.Validator;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -192,6 +194,83 @@ public class BizCompanyServiceImpl  extends ServiceImpl<BizCompanyMapper, BizCom
 //        return "";
     }
 
+    public String importCompanyNew(List<BizCompanyImportNew> companyList, String operName, Long tenantId) {
+        if (StringUtils.isNull(companyList) || companyList.size() == 0)
+        {
+            throw new ServiceException("导入用户数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        BizSource sourceCondition = new BizSource();
+        sourceCondition.setTenantId(tenantId);
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        Date now = new Date();
+        for (BizCompanyImportNew company : companyList) {
+            BizCompany newCompany = new BizCompany();
+            newCompany.setName(company.getName());
+            newCompany.setSocialCreditCode(company.getSocialCreditCode());
+            newCompany.setTenantId(company.getTenantId());
+
+            try {
+                if(company.getName().equals("")||company.getName()==null){
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "、客户名称不能为空");
+                    continue;
+                }
+                // 验证是否存在这个客户
+                if(this.query().eq("name", company.getName()).eq("tenant_id", tenantId).count() > 0)
+                {
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "、客户 " + company.getName() + " 已存在");
+                } else {
+                    BeanValidators.validateWithException(validator, company);
+                    if(company.getLeaderName()!= null){
+                        SysUser user = sysUserMapper.selectUserByNickName(company.getLeaderName(), company.getTenantId());
+                        if (user != null) {
+                            newCompany.setLeaderId(user.getUserId());
+                        }
+                    }
+                    if(company.getAdviserName()!=null){
+                        SysUser user = sysUserMapper.selectUserByNickName(company.getAdviserName(), company.getTenantId());
+                        if (user != null) {
+                            newCompany.setAdviserId(user.getUserId());
+                        }
+                    }
+                    newCompany.setTenantId(company.getTenantId());
+                    if("是".equals(company.getIsZero())){
+                        newCompany.setIsZero(1);
+                    } else if("否".equals(company.getIsZero())){
+                        newCompany.setIsZero(0);
+                    }
+                    newCompany.setTaxType(company.getTaxType());
+                    newCompany.setCreateTime(now);
+                    newCompany.setCreatorId(1L);
+                    this.save(newCompany);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "、客户 " + company.getName() + " 导入成功");
+                }
+            }
+            catch (Exception e)
+            {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、客户 " + company.getName() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
     @Override
     public String importZero(List<ExportZero> companyList, long tenantId) {
         StringBuilder successMsg = new StringBuilder();

+ 19 - 0
src/main/java/cn/ezhizao/project/business/order/controller/BizArchiveInputController.java

@@ -500,6 +500,25 @@ public class BizArchiveInputController extends BaseController {
         return success(message);
     }
 
+    @Log(title = "新合同导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('business:archive:order:import')")
+    @PostMapping("/importLoopNew")
+    @Transactional
+    public AjaxResult importLoopNew(MultipartFile file) throws Exception {
+        ExcelUtil<OrderExcelImportLoopNewModel> util = new ExcelUtil<>(OrderExcelImportLoopNewModel.class);
+        List<OrderExcelImportLoopNewModel> orderList = util.importExcel(file.getInputStream());
+        // 获取 入Excel 表头字段
+        List<String> excelHeaders = util.readExcelHeaders(file.getInputStream());
+//        //获取实体类字段
+//        List<String> names = getExcelAnnotatedFields(OrderExcelImportLoopModel.class);
+//        //如果不存在模板中的字段,返回错误
+//        if (!names.containsAll(excelHeaders)) {
+//            return error("导入数据与模板不匹配!");
+//        }
+        String message = bizArchiveInputService.importLoopNew(orderList, SecurityUtils.getUserId(), getTenantId() == null ? 0 : getTenantId());
+        return success(message);
+    }
+
     @Log(title = "合同导入", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('business:archive:order:import')")
     @PostMapping("/importOnce")

+ 128 - 0
src/main/java/cn/ezhizao/project/business/order/domain/OrderExcelImportLoopNewModel.java

@@ -0,0 +1,128 @@
+package cn.ezhizao.project.business.order.domain;
+
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ToString
+public class OrderExcelImportLoopNewModel {
+    //    合同编号
+    @Excel(name = "合同编号")
+    private String contractNo;
+    //    合同类型
+    @Excel(name = "合同类型")
+    private String orderType;
+    //    客户名称
+    @Excel(name = "公司名称")
+    private String companyName;
+    //    签约日期
+    @Excel(name = "签约日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date formDate;
+    //    签单人
+    @Excel(name = "签单人")
+    private String signerName;
+    //    来源类型
+    @Excel(name = "来源类型")
+    private String sourceCategoryName;
+    //    来源
+    @Excel(name = "来源")
+    private String sourceName;
+    //    备注
+    @Excel(name = "备注")
+    private String remark;
+    //    服务金额
+    @Excel(name = "合同总额", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+    private BigDecimal amount;
+    @Excel(name = "签约类型")
+    private String contractType;
+
+
+    // 代理记账
+    @Excel(name = "代理记账")
+    private String keepAccount;
+//    @Excel(name = "代理记账单价", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+    private BigDecimal keepAccountPrice;
+    @Excel(name = "记账服务时长")
+    private Integer keepAccountMonth;
+    @Excel(name = "记账赠送时长")
+    private Integer keepAccountFreeMonth;
+    @Excel(name = "记账合计时长")
+    private Integer keepAccountTotalMonth;
+    @Excel(name = "记账起始月份")
+    @JsonFormat(pattern = "yyyy年M月")
+    private Date keepAccountStartMonth;
+    @Excel(name = "记账结束月份")
+    @JsonFormat(pattern = "yyyy年M月")
+    private Date keepAccountEndMonth;
+    @Excel(name = "代理记账金额", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+    private BigDecimal keepAccountAmount;
+
+    // 社保代缴
+    @Excel(name = "社保代缴")
+    private String socialSecurity;
+    @Excel(name = "社保服务时长")
+    private Integer socialSecurityMonth;
+    @Excel(name = "社保赠送时长")
+    private Integer socialSecurityFreeMonth;
+    @Excel(name = "社保合计时长")
+    private Integer socialSecurityTotalMonth;
+    @Excel(name = "社保起始月份")
+    private Date socialSecurityStartMonth;
+    @Excel(name = "社保结束月份")
+    private Date socialSecurityEndMonth;
+    @Excel(name = "社保代缴金额", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+    private BigDecimal socialSecurityAmount;
+
+    // 公积金代缴
+    @Excel(name = "公积金代缴")
+    private String housingFund;
+//    // 公积金单价
+//    @Excel(name = "公积金单价", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+//    private BigDecimal housingFundPrice;
+    // 公积金服务月数
+    @Excel(name = "公积金服务时长")
+    private Integer housingFundMonth;
+    @Excel(name = "公积金赠送时长")
+    private Integer housingFundFreeMonth;
+    @Excel(name = "公积金合计时长")
+    private Integer housingFundTotalMonth;
+
+//    @Excel(name = "公积金赠送金额", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+//    private BigDecimal housingFundFreeAmount;
+    @Excel(name = "公积金起始月份")
+    private Date housingFundStartMonth;
+    @Excel(name = "公积金结束月份")
+    private Date housingFundEndMonth;
+    // 公积金总金额
+    @Excel(name = "公积金代缴金额", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+    private BigDecimal housingFundAmount;
+
+
+    // 返税申报
+    @Excel(name = "返税申报")
+    private String returnTax;
+    // 返税申报单价
+    @Excel(name = "返税申报单价")
+    private BigDecimal returnTaxPrice;
+    // 返税服务月数
+    @Excel(name = "返税服务月数")
+    private Integer returnTaxMonth;
+    // 返税赠送月数
+    @Excel(name = "返税赠送月数")
+    private Integer returnTaxFreeMonth;
+    @Excel(name = "返税赠送金额", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+    private BigDecimal returnTaxFreeAmount;
+    @Excel(name = "返税开始月")
+    private Date returnTaxStartMonth;
+    @Excel(name = "返税结束月")
+    private Date returnTaxEndMonth;
+    // 返税总金额
+    @Excel(name = "返税总金额", scale = 2, roundingMode = BigDecimal.ROUND_HALF_UP)
+    private BigDecimal returnTaxAmount;
+
+}

+ 2 - 0
src/main/java/cn/ezhizao/project/business/order/service/IBizArchiveInputService.java

@@ -44,6 +44,8 @@ public interface IBizArchiveInputService extends IService<BizArchiveInput>
 
     String importLoop(List<OrderExcelImportLoopModel> orderList, Long userId, long l);
 
+    String importLoopNew(List<OrderExcelImportLoopNewModel> orderList, Long userId, long l);
+
     String importOnce(List<OrderExcelImportOnceModel> orderList, Long userId, long l);
 
     int removeBinByIds(List<Long> ids);

+ 416 - 0
src/main/java/cn/ezhizao/project/business/order/service/impl/BizArchiveInputServiceImpl.java

@@ -1320,6 +1320,422 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
         return successMsg.toString();
     }
 
+    @Override
+    public String importLoopNew(@Validated List<OrderExcelImportLoopNewModel> orderList, Long userId, long tenantId) {
+        if (StringUtils.isNull(orderList) || orderList.size() == 0) {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        List<String> contractNo = orderList.stream().map(m -> m.getContractNo()).collect(Collectors.toList());
+        //合同号不能重复
+        Map<String, Long> nameCountMap = contractNo.stream()
+                .collect(Collectors.groupingBy(name -> name, Collectors.counting()));
+        List<BizArchiveInput> archiveInputs = new ArrayList<>();
+        List<BizWorkOrder> bizWorkOrders = new ArrayList<>();
+        List<BizWorkOrderDetail> bizWorkOrderDetails = new ArrayList<>();
+        List<BizArchiveInputDetail> archiveInputDetails = new ArrayList<>();
+        List<BizCompany> companies = companyService.query().eq("tenant_id", tenantId).list();
+        BizSource sourceCondition = new BizSource();
+        sourceCondition.setTenantId(tenantId);
+        List<BizSource> sources = bizSourceService.getList(sourceCondition);
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        List<String> contNOs = this.query().eq("service_type", 1).eq("tenant_id", tenantId).list().stream().map(m -> m.getContractNo()).collect(Collectors.toList());
+        for (OrderExcelImportLoopNewModel item : orderList) {
+            BizArchiveInput archiveInput = new BizArchiveInput();
+            List<BizArchiveInputDetail> myArchiveInputDetails = new ArrayList<>();
+            BizCompany company = companies.stream().filter(v -> v.getName().equals(item.getCompanyName())).findFirst().orElse(null);
+            if (company == null) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、客户 ").append(item.getCompanyName()).append(" 不存在");
+                continue;
+            }
+
+            archiveInput.setCompanyId(company.getId());
+            archiveInput.setArchiveCode(String.valueOf(snowflakeIdWorker.nextId()));
+            archiveInput.setAmount(item.getAmount());
+            archiveInput.setTrueAmount(item.getAmount());
+            archiveInput.setFormDate(new Date());
+            archiveInput.setContractNo(item.getContractNo());
+            SysUser user = userService.selectUserByNickName(item.getSignerName(), tenantId);
+
+            // 判断下订单总价单价是否和录入相符
+            // 假设 amount - discountAmount != trueAmount 跳过该订单
+
+            // 假设子表金额不等于订单总金额
+            BigDecimal keepAccount = item.getKeepAccountAmount() == null ? BigDecimal.ZERO : item.getKeepAccountAmount();
+            BigDecimal security = item.getSocialSecurityAmount() == null ? BigDecimal.ZERO : item.getSocialSecurityAmount();
+            BigDecimal housingFund = item.getHousingFundAmount() == null ? BigDecimal.ZERO : item.getHousingFundAmount();
+            BigDecimal returnTax = item.getReturnTaxAmount() == null ? BigDecimal.ZERO : item.getReturnTaxAmount();
+            BigDecimal keepAccountPrice = item.getKeepAccountPrice() == null ? BigDecimal.ZERO : item.getKeepAccountPrice();
+//            BigDecimal securityPrice = item.getSocialSecurityPrice() == null ? BigDecimal.ZERO : item.getSocialSecurityPrice();
+//            BigDecimal housingFundPrice = item.getHousingFundPrice() == null ? BigDecimal.ZERO : item.getHousingFundPrice();
+            BigDecimal returnTaxPrice = item.getReturnTaxPrice() == null ? BigDecimal.ZERO : item.getReturnTaxPrice();
+            BigDecimal keepAccountMonth = item.getKeepAccountMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getKeepAccountMonth());
+            BigDecimal securityMonth = item.getSocialSecurityMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getSocialSecurityMonth());
+            BigDecimal housingFundMonth = item.getHousingFundMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getHousingFundMonth());
+            BigDecimal returnTaxMonth = item.getReturnTaxMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getReturnTaxMonth());
+            if("是".equals(item.getKeepAccount())) {
+                if (item.getKeepAccountStartMonth() != null && item.getKeepAccountEndMonth() != null){
+                    Calendar startCalendar = Calendar.getInstance();
+                    startCalendar.setTime(item.getKeepAccountStartMonth());
+                    Calendar endCalendar = Calendar.getInstance();
+                    endCalendar.setTime(item.getKeepAccountEndMonth());
+                    // 计算年份和月份的差异
+                    int yearDiff = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
+                    int monthDiff = endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH);
+                    // 总的月份差异
+                    int totalMonthsBetween = yearDiff * 12 + monthDiff+1;
+                    BigDecimal keeFreeMonth = item.getKeepAccountFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getKeepAccountFreeMonth());
+                    if (totalMonthsBetween != keepAccountMonth.add(keeFreeMonth).intValue()){
+                        failureNum++;
+                        failureMsg.append("<br/>").append(failureNum).append(company.getName()+"的代理记账服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+                        continue;
+                    }
+
+                }
+            }
+
+            if("是".equals(item.getSocialSecurity())) {
+                if(item.getSocialSecurityStartMonth() != null && item.getSocialSecurityEndMonth()!= null){
+                    Calendar startCalendar2 = Calendar.getInstance();
+                    startCalendar2.setTime(item.getSocialSecurityStartMonth());
+                    Calendar endCalendar2 = Calendar.getInstance();
+                    endCalendar2.setTime(item.getSocialSecurityEndMonth());
+                    // 计算年份和月份的差异
+                    int yearDiff2 = endCalendar2.get(Calendar.YEAR) - startCalendar2.get(Calendar.YEAR);
+                    int monthDiff2 = endCalendar2.get(Calendar.MONTH) - startCalendar2.get(Calendar.MONTH);
+                    // 总的月份差异
+                    int totalMonthsBetween2 = yearDiff2 * 12 + monthDiff2+1;
+                    BigDecimal socialSecurityMonth = item.getSocialSecurityFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getSocialSecurityFreeMonth());
+                    if (totalMonthsBetween2 != securityMonth.add(socialSecurityMonth).intValue()){
+                        failureNum++;
+
+                        failureMsg.append("<br/>").append(failureNum).append(company.getName()+"的社保代缴服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+                        continue;
+                    }
+                }
+            }
+
+            if("是".equals(item.getHousingFund())) {
+                if(item.getHousingFundStartMonth() != null && item.getHousingFundEndMonth()!= null){
+                    Calendar startCalendar3 = Calendar.getInstance();
+                    startCalendar3.setTime(item.getHousingFundStartMonth());
+                    Calendar endCalendar3 = Calendar.getInstance();
+                    endCalendar3.setTime(item.getHousingFundEndMonth());
+                    // 计算年份和月份的差异
+                    int yearDiff3= endCalendar3.get(Calendar.YEAR) - startCalendar3.get(Calendar.YEAR);
+                    int monthDiff3 = endCalendar3.get(Calendar.MONTH) - startCalendar3.get(Calendar.MONTH);
+                    // 总的月份差异
+                    int totalMonthsBetween3 = yearDiff3 * 12 + monthDiff3+1;
+                    BigDecimal housingFundMonths = item.getHousingFundFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getHousingFundFreeMonth());
+                    if (totalMonthsBetween3!= housingFundMonth.add(housingFundMonths).intValue()){
+                        failureNum++;
+                        failureMsg.append("<br/>").append(failureNum).append(company.getName()+"的公积金服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+                        continue;
+                    }
+                }
+            }
+
+
+//            if(item.getReturnTaxStartMonth() != null && item.getReturnTaxEndMonth()!= null){
+//                Calendar startCalendar4 = Calendar.getInstance();
+//                startCalendar4.setTime(item.getReturnTaxStartMonth());
+//                Calendar endCalendar4 = Calendar.getInstance();
+//                endCalendar4.setTime(item.getReturnTaxEndMonth());
+//                // 计算年份和月份的差异
+//                int yearDiff4= endCalendar4.get(Calendar.YEAR) - startCalendar4.get(Calendar.YEAR);
+//                int monthDiff4 = endCalendar4.get(Calendar.MONTH) - startCalendar4.get(Calendar.MONTH);
+//                // 总的月份差异
+//                int totalMonthsBetween4 = yearDiff4 * 12 + monthDiff4+1;
+//                BigDecimal returnTaxFreeMonth = item.getReturnTaxFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(item.getReturnTaxFreeMonth());
+//                if (totalMonthsBetween4!= returnTaxMonth.add(returnTaxFreeMonth).intValue()){
+//                    failureNum++;
+//                    failureMsg.append("<br/>").append(failureNum).append(company.getName()+"的返税申报服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+//                    continue;
+//                }
+//            }
+
+
+
+            if (nameCountMap.get(item.getContractNo()) > 1L) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("导入的合同编号 ").append(item.getContractNo()).append("不能重复");
+                continue;
+            }
+            if (contNOs.contains(item.getContractNo())) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("合同编号 ").append(item.getContractNo()).append("已存在不能重复导入");
+                continue;
+            }
+
+            archiveInput.setSignerId(user != null ? user.getUserId() : null);
+            archiveInput.setContractType("新签".equals(item.getContractType()) ? 0 : "续签".equals(item.getContractType()) ? 1 : 3);
+            archiveInput.setServiceType(1);
+            archiveInput.setTenantId(tenantId);
+            archiveInput.setId(snowflakeIdWorker.nextId());
+            archiveInput.setStatus(1);
+            archiveInput.setVerifyStatus(1);
+            archiveInput.setRemark(item.getRemark());
+            String sourceName = item.getSourceName();
+            String sourceCategory = item.getSourceCategoryName();
+            BizSource source = sources.stream().filter(v -> v.getTitle().equals(sourceCategory)).findFirst().orElse(null);
+            if (source != null) {
+                archiveInput.setSourceCategoryId(source.getId());
+                switch (source.getReferrerDataSource()) {
+                    case "company":
+                        QueryWrapper<BizCompany> companyWrapper = new QueryWrapper<>();
+                        companyWrapper.eq("name", sourceName);
+                        BizCompany sourceCompany = companyService.getOne(companyWrapper);
+                        archiveInput.setSourceId(sourceCompany.getId());
+                        break;
+                    case "employee":
+                        SysUser sourceUser = userService.selectUserByUserName(sourceName);
+                        archiveInput.setSourceId(sourceUser != null ? sourceUser.getId() : null);
+                        break;
+                    case "channel":
+                        QueryWrapper<BizChannel> channelWrapper = new QueryWrapper<>();
+                        channelWrapper.eq("name", sourceName);
+                        BizChannel sourceChannel = channelService.getOne(channelWrapper);
+                        archiveInput.setSourceId(sourceChannel.getId());
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            if ("是".equals(item.getKeepAccount())) {
+                BizArchiveInputDetail detail = new BizArchiveInputDetail();
+                detail.setTaskTypeId(1L);
+                detail.setAmount(item.getKeepAccountAmount());
+                // 计算单价
+                BigDecimal price = getPrice(item.getKeepAccountAmount(), item.getKeepAccountMonth());
+                detail.setDiscountAmount(price.multiply(new BigDecimal(item.getKeepAccountMonth())).subtract(item.getKeepAccountAmount()));
+                detail.setPrice(price);
+                detail.setServiceNum(item.getKeepAccountMonth());
+                detail.setFreeNum(item.getKeepAccountFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                archiveInputDetails.add(detail);
+                myArchiveInputDetails.add(detail);
+                BizWorkOrder workOrder = bizWorkOrders.stream().filter(v -> v.getCompanyId().equals(detail.getCompanyId()) && v.getTaskTypeId().equals(1L)).findFirst().orElse(null);
+                if (workOrder == null) {
+                    workOrder = new BizWorkOrder();
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setType(1);
+                    workOrder.setTaskTypeId(1L);
+                    workOrder.setId(snowflakeIdWorker.nextId());
+                    workOrder.setWorkOrderNo(String.valueOf(snowflakeIdWorker.nextId()));
+                    workOrder.setContractDetailId(detail.getId());
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setContractId(archiveInput.getId());
+                    workOrder.setStartMonth(item.getKeepAccountStartMonth());
+                    workOrder.setEndMonth(item.getKeepAccountEndMonth());
+                    workOrder.setTenantId(tenantId);
+                    int monthNum = (item.getKeepAccountMonth() == null ? 0 : item.getKeepAccountMonth()) + (item.getKeepAccountFreeMonth() == null ? 0 : item.getKeepAccountFreeMonth());
+                    workOrder.setMonthNum(monthNum);
+                    bizWorkOrders.add(workOrder);
+                } else {
+                    int monthNum = (item.getKeepAccountMonth() == null ? 0 : item.getKeepAccountMonth()) + (item.getKeepAccountFreeMonth() == null ? 0 : item.getKeepAccountFreeMonth());
+                    workOrder.setMonthNum(workOrder.getMonthNum() + monthNum);
+                    workOrder.setEndMonth(workOrder.getEndMonth().compareTo(item.getKeepAccountEndMonth()) > 0 ? workOrder.getEndMonth() : item.getKeepAccountEndMonth());
+                    workOrder.setStartMonth(workOrder.getStartMonth().compareTo(item.getKeepAccountStartMonth()) > 0 ? item.getKeepAccountStartMonth() : workOrder.getStartMonth());
+                }
+                BizWorkOrderDetail workOrderDetail = new BizWorkOrderDetail();
+                workOrderDetail.setCompanyId(archiveInput.getCompanyId());
+                workOrderDetail.setContractDetailId(detail.getId());
+                workOrderDetail.setContractId(archiveInput.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
+                workOrderDetail.setWorkOrderId(workOrder.getId());
+                workOrderDetail.setFreeNum(detail.getFreeNum());
+                workOrderDetail.setServiceNum(detail.getServiceNum());
+                workOrderDetail.setTenantId(tenantId);
+                bizWorkOrderDetails.add(workOrderDetail);
+            }
+            if ("是".equals(item.getSocialSecurity())) {
+                BizArchiveInputDetail detail = new BizArchiveInputDetail();
+                detail.setTaskTypeId(2L);
+                detail.setAmount(item.getSocialSecurityAmount());
+                // 计算单价
+                BigDecimal price = getPrice(item.getSocialSecurityAmount(), item.getSocialSecurityMonth());
+                detail.setDiscountAmount(price.multiply(new BigDecimal(item.getSocialSecurityMonth())).subtract(item.getSocialSecurityAmount()));
+                detail.setPrice(price);
+//                detail.setDiscountAmount(item.getSocialSecurityFreeAmount());
+//                detail.setPrice(item.getSocialSecurityPrice());
+                detail.setServiceNum(item.getSocialSecurityMonth());
+                detail.setFreeNum(item.getSocialSecurityFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                archiveInputDetails.add(detail);
+                myArchiveInputDetails.add(detail);
+                BizWorkOrder workOrder = bizWorkOrders.stream().filter(v -> v.getCompanyId().equals(detail.getCompanyId()) && v.getTaskTypeId().equals(2L)).findFirst().orElse(null);
+                if (workOrder == null) {
+                    workOrder = new BizWorkOrder();
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setType(1);
+                    workOrder.setTaskTypeId(2L);
+                    workOrder.setId(snowflakeIdWorker.nextId());
+                    workOrder.setWorkOrderNo(String.valueOf(snowflakeIdWorker.nextId()));
+                    workOrder.setContractDetailId(detail.getId());
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setContractId(archiveInput.getId());
+                    workOrder.setStartMonth(item.getSocialSecurityStartMonth());
+                    workOrder.setEndMonth(item.getSocialSecurityEndMonth());
+                    workOrder.setTenantId(tenantId);
+                    int monthNum = (item.getSocialSecurityMonth() == null ? 0 : item.getSocialSecurityMonth()) + (item.getSocialSecurityFreeMonth() == null ? 0 : item.getSocialSecurityFreeMonth());
+                    workOrder.setMonthNum(monthNum);
+                    bizWorkOrders.add(workOrder);
+                } else {
+                    int monthNum = (item.getSocialSecurityMonth() == null ? 0 : item.getSocialSecurityMonth()) + (item.getSocialSecurityFreeMonth() == null ? 0 : item.getSocialSecurityFreeMonth());
+                    workOrder.setMonthNum(workOrder.getMonthNum() + monthNum);
+                    workOrder.setEndMonth(workOrder.getEndMonth().compareTo(item.getSocialSecurityEndMonth()) > 0 ? workOrder.getEndMonth() : item.getSocialSecurityEndMonth());
+                    workOrder.setStartMonth(workOrder.getStartMonth().compareTo(item.getSocialSecurityStartMonth()) > 0 ? item.getSocialSecurityStartMonth() : workOrder.getStartMonth());
+                }
+                BizWorkOrderDetail workOrderDetail = new BizWorkOrderDetail();
+                workOrderDetail.setCompanyId(archiveInput.getCompanyId());
+                workOrderDetail.setContractDetailId(detail.getId());
+                workOrderDetail.setContractId(archiveInput.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
+                workOrderDetail.setWorkOrderId(workOrder.getId());
+                workOrderDetail.setFreeNum(detail.getFreeNum());
+                workOrderDetail.setServiceNum(detail.getServiceNum());
+                workOrderDetail.setTenantId(tenantId);
+                bizWorkOrderDetails.add(workOrderDetail);
+            }
+            if ("是".equals(item.getHousingFund())) {
+                BizArchiveInputDetail detail = new BizArchiveInputDetail();
+                detail.setTaskTypeId(3L);
+                detail.setAmount(item.getHousingFundAmount());
+                // 计算单价
+                BigDecimal price = getPrice(item.getHousingFundAmount(), item.getHousingFundMonth());
+                detail.setDiscountAmount(price.multiply(new BigDecimal(item.getHousingFundMonth())).subtract(item.getHousingFundAmount()));
+                detail.setPrice(price);
+//                detail.setPrice(item.getHousingFundPrice());
+//                detail.setDiscountAmount(item.getHousingFundFreeAmount());
+                detail.setServiceNum(item.getHousingFundMonth());
+                detail.setFreeNum(item.getHousingFundFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                archiveInputDetails.add(detail);
+                myArchiveInputDetails.add(detail);
+                BizWorkOrder workOrder = bizWorkOrders.stream().filter(v -> v.getCompanyId().equals(detail.getCompanyId()) && v.getTaskTypeId().equals(3L)).findFirst().orElse(null);
+                if (workOrder == null) {
+                    workOrder = new BizWorkOrder();
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setType(1);
+                    workOrder.setTaskTypeId(3L);
+                    workOrder.setId(snowflakeIdWorker.nextId());
+                    workOrder.setWorkOrderNo(String.valueOf(snowflakeIdWorker.nextId()));
+                    workOrder.setContractDetailId(detail.getId());
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setContractId(archiveInput.getId());
+                    workOrder.setStartMonth(item.getHousingFundStartMonth());
+                    workOrder.setEndMonth(item.getHousingFundEndMonth());
+                    workOrder.setTenantId(tenantId);
+                    int monthNum = (item.getHousingFundMonth() == null ? 0 : item.getHousingFundMonth()) + (item.getHousingFundFreeMonth() == null ? 0 : item.getHousingFundFreeMonth());
+                    workOrder.setMonthNum(monthNum);
+                    bizWorkOrders.add(workOrder);
+                } else {
+                    int monthNum = (item.getHousingFundMonth() == null ? 0 : item.getHousingFundMonth()) + (item.getHousingFundFreeMonth() == null ? 0 : item.getHousingFundFreeMonth());
+                    workOrder.setMonthNum(workOrder.getMonthNum() + monthNum);
+                    workOrder.setEndMonth(workOrder.getEndMonth().compareTo(item.getHousingFundEndMonth()) > 0 ? workOrder.getEndMonth() : item.getHousingFundEndMonth());
+
+                    workOrder.setStartMonth(workOrder.getStartMonth().compareTo(item.getHousingFundStartMonth()) > 0 ? item.getHousingFundStartMonth() : workOrder.getStartMonth());
+                }
+                BizWorkOrderDetail workOrderDetail = new BizWorkOrderDetail();
+                workOrderDetail.setCompanyId(archiveInput.getCompanyId());
+                workOrderDetail.setContractDetailId(detail.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
+                workOrderDetail.setContractId(archiveInput.getId());
+                workOrderDetail.setWorkOrderId(workOrder.getId());
+                workOrderDetail.setFreeNum(detail.getFreeNum());
+                workOrderDetail.setServiceNum(detail.getServiceNum());
+                workOrderDetail.setTenantId(tenantId);
+                bizWorkOrderDetails.add(workOrderDetail);
+            }
+            if ("是".equals(item.getReturnTax())) {
+                BizArchiveInputDetail detail = new BizArchiveInputDetail();
+                detail.setTaskTypeId(4L);
+                detail.setAmount(item.getReturnTaxAmount());
+                detail.setDiscountAmount(item.getReturnTaxFreeAmount());
+                detail.setPrice(item.getReturnTaxPrice());
+                detail.setServiceNum(item.getReturnTaxMonth());
+                detail.setFreeNum(item.getReturnTaxFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                archiveInputDetails.add(detail);
+                myArchiveInputDetails.add(detail);
+                BizWorkOrder workOrder = bizWorkOrders.stream().filter(v -> v.getCompanyId().equals(detail.getCompanyId()) && v.getTaskTypeId().equals(4L)).findFirst().orElse(null);
+                if (workOrder == null) {
+                    workOrder = new BizWorkOrder();
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setType(1);
+                    workOrder.setTaskTypeId(4L);
+                    workOrder.setId(snowflakeIdWorker.nextId());
+                    workOrder.setWorkOrderNo(String.valueOf(snowflakeIdWorker.nextId()));
+                    workOrder.setContractDetailId(detail.getId());
+                    workOrder.setCompanyId(archiveInput.getCompanyId());
+                    workOrder.setContractId(archiveInput.getId());
+                    workOrder.setStartMonth(item.getReturnTaxStartMonth());
+                    workOrder.setEndMonth(item.getReturnTaxEndMonth());
+                    workOrder.setTenantId(tenantId);
+                    int monthNum = (item.getReturnTaxMonth() == null ? 0 : item.getReturnTaxMonth()) + (item.getReturnTaxFreeMonth() == null ? 0 : item.getReturnTaxFreeMonth());
+                    workOrder.setMonthNum(monthNum);
+                    bizWorkOrders.add(workOrder);
+                } else {
+                    int monthNum = (item.getReturnTaxMonth() == null ? 0 : item.getReturnTaxMonth()) + (item.getReturnTaxFreeMonth() == null ? 0 : item.getReturnTaxFreeMonth());
+                    workOrder.setMonthNum(workOrder.getMonthNum() + monthNum);
+                    workOrder.setEndMonth(workOrder.getEndMonth().compareTo(item.getReturnTaxEndMonth()) > 0 ? workOrder.getEndMonth() : item.getReturnTaxEndMonth());
+                    workOrder.setStartMonth(workOrder.getStartMonth().compareTo(item.getReturnTaxStartMonth()) > 0 ? item.getReturnTaxStartMonth() : workOrder.getStartMonth());
+                }
+                BizWorkOrderDetail workOrderDetail = new BizWorkOrderDetail();
+                workOrderDetail.setCompanyId(archiveInput.getCompanyId());
+                workOrderDetail.setContractDetailId(detail.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
+                workOrderDetail.setContractId(archiveInput.getId());
+                workOrderDetail.setWorkOrderId(workOrder.getId());
+                workOrderDetail.setFreeNum(detail.getFreeNum());
+                workOrderDetail.setServiceNum(detail.getServiceNum());
+                workOrderDetail.setTenantId(tenantId);
+                bizWorkOrderDetails.add(workOrderDetail);
+            }
+            archiveInput.setDiscountAmount(myArchiveInputDetails.stream().map(BizArchiveInputDetail::getDiscountAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
+            archiveInputs.add(archiveInput);
+            successNum++;
+            successMsg.append("<br/>").append(successNum).append("、订单 ").append(item.getContractNo()).append(" 导入成功");
+        }
+        super.saveBatch(archiveInputs);
+        archiveInputDetailService.saveBatch(archiveInputDetails);
+        workOrderService.saveBatch(bizWorkOrders);
+        workOrderDetailService.saveBatch(bizWorkOrderDetails);
+        bizWorkOrders.forEach(this::addLoopTasks);
+        archiveInputs.forEach(this::saveDetailMonth);
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
+    private BigDecimal getPrice(BigDecimal amount, Integer month) {
+        if(amount.equals(BigDecimal.ZERO) || month == 0) {
+            return BigDecimal.ZERO;
+        }
+        BigDecimal res = amount.divide(new BigDecimal(month), 2, BigDecimal.ROUND_CEILING);
+        return res;
+    }
+
     @Override
     public String importOnce(List<OrderExcelImportOnceModel> orderList, Long userId, long tenantId) {
         if (StringUtils.isNull(orderList) || orderList.size() == 0) {

+ 2 - 0
src/main/java/cn/ezhizao/project/system/mapper/SysUserMapper.java

@@ -53,6 +53,8 @@ public interface SysUserMapper
      */
     public SysUser selectUserByUserName(String userName);
 
+    public SysUser selectUserByNickName(String userName, Long tenantId);
+
     /**
      *
      * @param userName

+ 1 - 0
src/main/java/cn/ezhizao/project/system/service/ISysUserService.java

@@ -53,6 +53,7 @@ public interface ISysUserService
 
     public SysUser selectUserByUserNameAndTenantId(String userName,String tenantId);
 
+    public SysUser selectUserByNickName(String userName,Long tenantId);
     /**
      * 通过用户ID查询用户
      *

+ 5 - 0
src/main/java/cn/ezhizao/project/system/service/impl/SysUserServiceImpl.java

@@ -130,6 +130,11 @@ public class SysUserServiceImpl implements ISysUserService
         return userMapper.selectUserByUserNameAndTenantId(userName,tenantId);
     }
 
+    @Override
+    public SysUser selectUserByNickName(String userName, Long tenantId) {
+        return userMapper.selectUserByNickName(userName, tenantId);
+    }
+
 
     /**
      * 通过用户ID查询用户

+ 7 - 0
src/main/resources/mybatis/system/SysUserMapper.xml

@@ -154,6 +154,13 @@
 		where u.user_name = #{userName} and u.del_flag = '0'
 	</select>
 
+	<select id="selectUserByNickName" resultMap="SysUserResult">
+		select u.*
+		from sys_user u
+		left join biz_user_tenant ut on u.user_id = ut.user_id
+		where u.nick_name = #{userName} and u.del_flag = '0' and ut.tenant_id = #{tenantId}
+	</select>
+
 	<select id="selectUserByUserNameAndTenantId" parameterType="String" resultMap="SysUserResult">
 		<include refid="selectUserTenantVo"/>
 		where u.user_name = #{userName} and u.del_flag = '0' and ut.tenant_id = #{tenantId} and ut.deleted = 0