Browse Source

feat:基础版升级标准版代码

ly 1 năm trước cách đây
mục cha
commit
e1f7e92a0e
26 tập tin đã thay đổi với 3157 bổ sung0 xóa
  1. 55 0
      src/main/java/cn/ezhizao/project/business/order/domain/OrderExcelImportLoopGroupModel.java
  2. 24 0
      src/main/java/cn/ezhizao/project/business/upgrade/controller/BizArchiveInputDetailUpdateController.java
  3. 287 0
      src/main/java/cn/ezhizao/project/business/upgrade/controller/BizArchiveInputTempController.java
  4. 24 0
      src/main/java/cn/ezhizao/project/business/upgrade/controller/BizWorkOrderDetailUpdateController.java
  5. 263 0
      src/main/java/cn/ezhizao/project/business/upgrade/controller/BizWorkOrderUpdateController.java
  6. 93 0
      src/main/java/cn/ezhizao/project/business/upgrade/crmUpgradeController.java
  7. 178 0
      src/main/java/cn/ezhizao/project/business/upgrade/domain/BizArchiveInputDetailUpdate.java
  8. 249 0
      src/main/java/cn/ezhizao/project/business/upgrade/domain/BizArchiveInputUpdate.java
  9. 76 0
      src/main/java/cn/ezhizao/project/business/upgrade/domain/BizWorkOrderDetailUpdate.java
  10. 249 0
      src/main/java/cn/ezhizao/project/business/upgrade/domain/BizWorkOrderUpdate.java
  11. 33 0
      src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizArchiveInputDetailUpdateMapper.java
  12. 32 0
      src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizArchiveInputTempMapper.java
  13. 32 0
      src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizWorkOrderDetailUpdateMapper.java
  14. 36 0
      src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizWorkOrderUpdateMapper.java
  15. 33 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/IBizArchiveInputDetailUpdateService.java
  16. 36 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/IBizArchiveInputTempService.java
  17. 32 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/IBizWorkOrderDetailUpdateService.java
  18. 37 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/IBizWorkOrderUpdateService.java
  19. 50 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizArchiveInputDetailUpdateServiceImpl.java
  20. 674 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizArchiveInputTempServiceImpl.java
  21. 54 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizWorkOrderDetailUpdateServiceImpl.java
  22. 84 0
      src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizWorkOrderUpdateServiceImpl.java
  23. 75 0
      src/main/resources/mybatis/business/BizArchiveInputDetailUpdateMapper.xml
  24. 227 0
      src/main/resources/mybatis/business/BizArchiveInputTempMapper.xml
  25. 70 0
      src/main/resources/mybatis/business/BizWorkOrderDetailUpdateMapper.xml
  26. 154 0
      src/main/resources/mybatis/business/BizWorkOrderUpdateMapper.xml

+ 55 - 0
src/main/java/cn/ezhizao/project/business/order/domain/OrderExcelImportLoopGroupModel.java

@@ -0,0 +1,55 @@
+package cn.ezhizao.project.business.order.domain;
+
+import cn.ezhizao.common.utils.DateUtils;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate;
+import lombok.Data;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Data
+public class OrderExcelImportLoopGroupModel {
+
+    private Long companyId;
+
+    private Long taskTypeId;
+
+    private Date startMonth;
+
+    private Date endMonth;
+
+    private Integer monthNum = 0;
+
+    private List<BizArchiveInputDetailUpdate> modelList = new ArrayList<>();
+
+    public Boolean isIncludeModel(BizArchiveInputDetailUpdate model) {
+        if (modelList.isEmpty()) {
+            return true;
+        }
+
+        Date inputStartMonth = model.getStartMonth();
+        Date inputEndMonth = model.getEndMonth();
+        Date currentStartMonth = this.getStartMonth();
+        Date currentEndMonth = this.getEndMonth();
+
+        if (DateUtils.addMonths(inputEndMonth, 1).compareTo(currentStartMonth) == 0
+                || DateUtils.addMonths(currentEndMonth, 1).compareTo(inputStartMonth) == 0) {
+            return true;
+        }
+        return false;
+    }
+
+    public void addModel(BizArchiveInputDetailUpdate model) {
+
+        this.modelList.add(model);
+
+        this.modelList = this.modelList.stream().sorted(Comparator.comparing(BizArchiveInputDetailUpdate::getStartMonth))
+                .collect(Collectors.toList());
+
+        this.startMonth = this.modelList.get(0).getStartMonth();
+
+        this.endMonth = this.modelList.get(this.modelList.size() - 1).getEndMonth();
+
+        this.monthNum += (model.getServiceNum() + model.getFreeNum());
+    }
+}

+ 24 - 0
src/main/java/cn/ezhizao/project/business/upgrade/controller/BizArchiveInputDetailUpdateController.java

@@ -0,0 +1,24 @@
+package cn.ezhizao.project.business.upgrade.controller;
+
+import javax.annotation.Resource;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputDetailUpdateService;
+import cn.ezhizao.framework.web.controller.BaseController;
+
+/**
+ * 合同明细Controller
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+@RestController
+@RequestMapping("/business/update")
+public class BizArchiveInputDetailUpdateController extends BaseController
+{
+    @Resource
+    private IBizArchiveInputDetailUpdateService bizArchiveInputDetailUpdateService;
+
+
+}

+ 287 - 0
src/main/java/cn/ezhizao/project/business/upgrade/controller/BizArchiveInputTempController.java

@@ -0,0 +1,287 @@
+package cn.ezhizao.project.business.upgrade.controller;
+
+import java.sql.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.ezhizao.project.business.channel.domain.BizChannel;
+import cn.ezhizao.project.business.channel.service.IBizChannelService;
+import cn.ezhizao.project.business.company.domain.BizCompany;
+import cn.ezhizao.project.business.company.service.IBizCompanyService;
+import cn.ezhizao.project.business.order.domain.BizArchiveInputDetailProcess;
+import cn.ezhizao.project.business.order.domain.vo.InputVo;
+import cn.ezhizao.project.business.order.domain.vo.TimeVo;
+import cn.ezhizao.project.business.order.service.IBizArchiveInputDetailProcessService;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderRecord;
+import cn.ezhizao.project.business.workOrder.service.IBizWorkOrderRecordService;
+import cn.ezhizao.project.system.domain.SysFileStorage;
+import cn.ezhizao.project.system.domain.SysUser;
+import cn.ezhizao.project.system.service.ISysFileStorageService;
+import cn.ezhizao.project.system.service.ISysUserService;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderDetailUpdate;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputDetailUpdateService;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderDetailUpdateService;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderUpdateService;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+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.upgrade.domain.BizArchiveInputUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputTempService;
+import cn.ezhizao.framework.web.controller.BaseController;
+import cn.ezhizao.framework.web.domain.AjaxResult;
+import cn.ezhizao.common.utils.poi.ExcelUtil;
+import cn.ezhizao.framework.web.page.TableDataInfo;
+
+/**
+ * 档案入库Controller
+ *
+ * @author ruoyi
+ * @date 2024-10-12
+ */
+@RestController
+@RequestMapping("/business/upgrade/archiveinput")
+public class BizArchiveInputTempController extends BaseController
+{
+    @Resource
+    private IBizArchiveInputTempService bizArchiveInputTempService;
+    @Resource
+    private IBizCompanyService companyService;
+    @Resource
+    private ISysUserService sysUserService;
+    @Resource
+    private IBizChannelService channelService;
+    @Resource
+    private ISysFileStorageService fileStorageService;
+    @Resource
+    private IBizWorkOrderUpdateService workOrderService;
+    @Resource
+    private IBizWorkOrderDetailUpdateService bizWorkOrderDetailService;
+
+    @Resource
+    private IBizWorkOrderRecordService workOrderRecordService;
+    @Resource
+    private IBizArchiveInputDetailUpdateService bizArchiveInputDetailUpdateService;
+    @Resource
+    private IBizArchiveInputDetailProcessService archiveInputDetailProcessService;
+    /**
+     * 查询档案入库列表
+     */
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(InputVo bizArchiveInput) throws NoSuchFieldException, IllegalAccessException {
+        setTenantId(bizArchiveInput);
+        //分页
+        startPage();
+        //排序
+        startOrderBy();
+        //根据客户名称模糊查询去除两边空格
+        if (bizArchiveInput.getCompanyName() != null) {
+            if (!bizArchiveInput.getCompanyName().equals(""))
+                bizArchiveInput.setCompanyName(bizArchiveInput.getCompanyName().trim());
+        }
+//        List<BizArchiveInput> list = bizArchiveInputService.getList(bizArchiveInput);
+        List<BizArchiveInputUpdate> list = bizArchiveInputTempService.getListByInput(bizArchiveInput);
+
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 导出档案入库列表
+     */
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:export')")
+    @Log(title = "档案入库", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BizArchiveInputUpdate bizArchiveInputUpdate) throws NoSuchFieldException, IllegalAccessException
+    {
+        setTenantId(bizArchiveInputUpdate);
+        List<BizArchiveInputUpdate> list = bizArchiveInputTempService.getList(bizArchiveInputUpdate);
+        ExcelUtil<BizArchiveInputUpdate> util = new ExcelUtil<BizArchiveInputUpdate>(BizArchiveInputUpdate.class);
+        util.exportExcel(response, list, "档案入库数据");
+    }
+
+    /**
+     * 获取档案入库详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:list')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(getById(id));
+    }
+    private BizArchiveInputUpdate getById(Long id) {
+        BizArchiveInputUpdate condition = new BizArchiveInputUpdate();
+        condition.setId(id);
+        BizArchiveInputUpdate bizArchiveInput = bizArchiveInputTempService.getList(condition).stream().findFirst().orElse(null);
+        if (bizArchiveInput != null && bizArchiveInput.getReferrerDataSource() != null) {
+            switch (bizArchiveInput.getReferrerDataSource()) {
+                case "company":
+                    BizCompany source = companyService.getById(bizArchiveInput.getSourceId());
+                    bizArchiveInput.setSourceName(source != null ? source.getName() : "");
+                    break;
+                case "employee":
+                    SysUser sysUser = sysUserService.selectUserById(bizArchiveInput.getSourceId());
+                    bizArchiveInput.setSourceName(sysUser != null ? sysUser.getNickName() : "");
+                    break;
+                case "channel":
+                    BizChannel channel = channelService.getById(bizArchiveInput.getSourceId());
+                    bizArchiveInput.setSourceName(channel != null ? channel.getName() : "");
+                    break;
+                default:
+                    break;
+            }
+        }
+        if (bizArchiveInput != null) {
+            BizArchiveInputDetailUpdate conditionDetail = new BizArchiveInputDetailUpdate();
+            conditionDetail.setContractId(bizArchiveInput.getId());
+            BizArchiveInputDetailProcess conditionProcess = new BizArchiveInputDetailProcess();
+            List<SysFileStorage> sysFileStorages = fileStorageService.query().eq("master_table_name", "biz_archive_input").eq("master_id", bizArchiveInput.getId()).list();
+            List<BizArchiveInputDetailUpdate> details = bizArchiveInputDetailUpdateService.getList(conditionDetail);
+            for (BizArchiveInputDetailUpdate detail : details) {
+                BizWorkOrderDetailUpdate one = bizWorkOrderDetailService.getOne(new LambdaQueryWrapper<BizWorkOrderDetailUpdate>()
+                        .eq(BizWorkOrderDetailUpdate::getContractDetailId, detail.getId())
+                        .eq(BizWorkOrderDetailUpdate::getIsStop, 0)
+                        .eq(BizWorkOrderDetailUpdate::getTaskTypeId, detail.getTaskTypeId()));
+                if (one != null) {
+                    List<BizWorkOrderRecord> list = workOrderRecordService.list(new LambdaQueryWrapper<BizWorkOrderRecord>()
+                            .eq(BizWorkOrderRecord::getWorkOrderId, one.getWorkOrderId()));
+                    if (CollectionUtils.isNotEmpty(list)) {
+                        detail.setDisabled(true);
+                    } else {
+                        detail.setDisabled(false);
+                    }
+                }
+                if (bizArchiveInput.getServiceType() == 1) {
+                    TimeVo time = getTime(detail.getContractId(), detail.getId(), detail.getTaskTypeId(), detail.getCompanyId());
+                    if (time != null) {
+                        detail.setTimeVo(time);
+                    }
+                }
+            }
+
+            List<BizArchiveInputDetailProcess> processes = archiveInputDetailProcessService.getList(conditionProcess);
+            details.forEach(l -> l.setProcesses(processes.stream().filter(v -> v.getContractDetailId().equals(l.getId())).collect(Collectors.toList())));
+            bizArchiveInput.setDetails(details);
+            bizArchiveInput.setFiles(sysFileStorages);
+        }
+        return bizArchiveInput;
+    }
+
+    //获取当前合同工单起始结束区间
+    public TimeVo getTime(Long contractId, Long contractDetailId, Long typeId, Long companyId) {
+        //排序获取当前索引位置
+        BizWorkOrderDetailUpdate one = bizWorkOrderDetailService.getOne(
+                new LambdaQueryWrapper<BizWorkOrderDetailUpdate>()
+                        .eq(BizWorkOrderDetailUpdate::getContractId, contractId)
+                        .eq(BizWorkOrderDetailUpdate::getContractDetailId, contractDetailId)
+                        .eq(BizWorkOrderDetailUpdate::getCompanyId, companyId)
+                        .eq(BizWorkOrderDetailUpdate::getTaskTypeId, typeId).eq(BizWorkOrderDetailUpdate::getDeleted, 0));
+        if (one == null) {
+            return null;
+        }
+        Long workOrderId = one.getWorkOrderId();
+
+        BizWorkOrderUpdate workOrder = workOrderService.getById(workOrderId);
+        if (workOrder == null) {
+            logger.error("获取工单失败");
+            return null;
+        }
+        List<BizWorkOrderDetailUpdate> list = bizWorkOrderDetailService.list(new LambdaQueryWrapper<BizWorkOrderDetailUpdate>()
+                .eq(BizWorkOrderDetailUpdate::getWorkOrderId, workOrderId)
+                .eq(BizWorkOrderDetailUpdate::getTaskTypeId, typeId)
+                .orderByAsc(BizWorkOrderDetailUpdate::getCreateTime));
+
+        List<Long> indexList = list.stream().map(m -> m.getContractDetailId()).collect(Collectors.toList());
+        //确定当前索引元素
+        int i = indexList.indexOf(contractDetailId);
+        if (i == -1) {
+            return null;
+        }
+        //当前元素所有月份
+        BizWorkOrderDetailUpdate bizWorkOrderDetail = list.get(i);
+        int monthNum = bizWorkOrderDetail.getFreeNum() + bizWorkOrderDetail.getServiceNum();
+        //判断是不是第一个
+        if (i == 0) {
+            DateTime startMonth = DateTime.of(workOrder.getStartMonth());
+            Date endMonth = startMonth.offset(DateField.MONTH, monthNum - 1).toSqlDate();
+            return new TimeVo(workOrder.getStartMonth(), endMonth);
+        } else {
+            //中间的工单
+            //获取起始时间 并获取 i 之前所有月数 相加为起始时间
+            int totalNum = getMonthNum(i - 1, list);
+            DateTime month = DateTime.of(workOrder.getStartMonth());
+            Date startMonth = month.offset(DateField.MONTH, totalNum).toSqlDate();
+            DateTime startMonthTemp = DateTime.of(startMonth);
+            Date endMonth = startMonthTemp.offset(DateField.MONTH, monthNum - 1).toSqlDate();
+            return new TimeVo(startMonth, endMonth);
+        }
+
+    }
+    public static int getMonthNum(int i, List<BizWorkOrderDetailUpdate> list) {
+        int total = 0;
+        while (i >= 0) {
+            BizWorkOrderDetailUpdate bizWorkOrderDetail = list.get(i);
+            total += bizWorkOrderDetail.getFreeNum() + bizWorkOrderDetail.getServiceNum();
+            i--;
+        }
+        return total;
+    }
+    /**
+     * 新增档案入库
+     */
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:add')")
+    @Log(title = "档案入库", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BizArchiveInputUpdate bizArchiveInputUpdate) throws NoSuchFieldException, IllegalAccessException
+    {
+        setTenantId(bizArchiveInputUpdate);
+        return toAjax(bizArchiveInputTempService.save(bizArchiveInputUpdate));
+    }
+
+    /**
+     * 修改档案入库
+     */
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:edit')")
+    @Log(title = "档案入库", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BizArchiveInputUpdate bizArchiveInputUpdate) throws NoSuchFieldException, IllegalAccessException
+    {
+        setTenantId(bizArchiveInputUpdate);
+        return toAjax(bizArchiveInputTempService.updateById(bizArchiveInputUpdate));
+    }
+
+    /**
+     * 删除档案入库
+     */
+
+    @PreAuthorize("@ss.hasPermi('business:temp:remove')")
+    @Log(title = "档案入库", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable List<Long> ids)
+    {
+        return toAjax(bizArchiveInputTempService.removeBatchByIds(ids));
+    }
+    @Transactional
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:edit')")
+    @PostMapping("delete")
+    public AjaxResult deldeleteArchiveInputete(Long id){
+        return toAjax(bizArchiveInputTempService.deleteArchiveInput(getTenantId() == null ? 0 : getTenantId(),id));
+    }
+}

+ 24 - 0
src/main/java/cn/ezhizao/project/business/upgrade/controller/BizWorkOrderDetailUpdateController.java

@@ -0,0 +1,24 @@
+package cn.ezhizao.project.business.upgrade.controller;
+
+import javax.annotation.Resource;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderDetailUpdateService;
+import cn.ezhizao.framework.web.controller.BaseController;
+
+/**
+ * 企业租户Controller
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+@RestController
+@RequestMapping("/business/update")
+public class BizWorkOrderDetailUpdateController extends BaseController
+{
+    @Resource
+    private IBizWorkOrderDetailUpdateService bizWorkOrderDetailUpdateService;
+
+
+}

+ 263 - 0
src/main/java/cn/ezhizao/project/business/upgrade/controller/BizWorkOrderUpdateController.java

@@ -0,0 +1,263 @@
+package cn.ezhizao.project.business.upgrade.controller;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.ezhizao.common.utils.poi.ExcelUtil;
+import cn.ezhizao.framework.aspectj.lang.annotation.Log;
+import cn.ezhizao.framework.aspectj.lang.enums.BusinessType;
+import cn.ezhizao.project.business.collection.domain.BizCollection;
+import cn.ezhizao.project.business.collection.domain.BizCollectionDetail;
+import cn.ezhizao.project.business.collection.service.IBizCollectionDetailService;
+import cn.ezhizao.project.business.collection.service.impl.BizCollectionServiceImpl;
+import cn.ezhizao.project.business.entrust.service.IBizEntrustService;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputUpdate;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderDetailUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputDetailUpdateService;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputTempService;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderDetailUpdateService;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrder;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderUpdateService;
+import cn.ezhizao.framework.web.controller.BaseController;
+import cn.ezhizao.framework.web.domain.AjaxResult;
+import cn.ezhizao.framework.web.page.TableDataInfo;
+
+/**
+ * 企业租户Controller
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+@RestController
+@RequestMapping("/business/upgrade/workorder")
+public class BizWorkOrderUpdateController extends BaseController
+{
+    @Resource
+    private IBizWorkOrderUpdateService bizWorkOrderUpdateService;
+    @Resource
+    private IBizEntrustService entrustService;
+    @Resource
+    private IBizWorkOrderDetailUpdateService bizWorkOrderDetailService;
+    @Resource
+    private IBizArchiveInputTempService bizArchiveInputService;
+    @Resource
+    private IBizArchiveInputDetailUpdateService bizArchiveInputDetailService;
+    @Resource
+    private BizCollectionServiceImpl bizCollectionService;
+    @Resource
+    private IBizCollectionDetailService bizCollectionDetailService;
+    /**
+     * 查询工单信息列表
+     */
+    @PreAuthorize("@ss.hasAnyPermi('business:upgrade:workorder:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BizWorkOrderUpdate bizWorkOrder) throws NoSuchFieldException, IllegalAccessException {
+
+        //根据客户名称模糊查询去除两边空格
+        List<BizWorkOrderUpdate> list = getBizWorkOrderUpdates(bizWorkOrder,true);
+        return getDataTable(list);
+    }
+
+    private List<BizWorkOrderUpdate> getBizWorkOrderUpdates(BizWorkOrderUpdate bizWorkOrder,boolean ispage) throws NoSuchFieldException, IllegalAccessException {
+        setTenantId(bizWorkOrder);
+
+        if (ispage) startPage();
+
+        //排序
+        startOrderBy();
+        if (bizWorkOrder.getCompanyName() != null) {
+            if (!bizWorkOrder.getCompanyName().equals(""))
+                bizWorkOrder.setCompanyName(bizWorkOrder.getCompanyName().trim());
+        }
+//        List<BizWorkOrder> list = bizWorkOrderService.getList(bizWorkOrder);
+        //有合并工单情况 不可以用合同明细联查
+        List<BizWorkOrderUpdate> list = null;
+
+        if(bizWorkOrder.getNoContract() == 1){
+            list= bizWorkOrderUpdateService.gettoUpLoadList(bizWorkOrder);
+        }else{
+            list = bizWorkOrderUpdateService.getList2(bizWorkOrder);
+        }
+
+
+        //判断是否是合同查询
+        if (bizWorkOrder.getNoContract() == 0) {
+            for (BizWorkOrderUpdate v : list) {
+                BizWorkOrderDetailUpdate workOrderDetail = new BizWorkOrderDetailUpdate();
+                workOrderDetail.setWorkOrderId(v.getId());
+                //查询工单明细
+                List<BizWorkOrderDetailUpdate> detailList = bizWorkOrderDetailService.getList(workOrderDetail);
+
+                //查询合同收款金额
+                BizArchiveInputUpdate bizArchiveInput = bizArchiveInputService.getById(v.getContractId());
+                BigDecimal money = new BigDecimal(0);
+                if (bizArchiveInput != null) {
+                    money = bizArchiveInput.getTrueAmount();
+                }
+
+                //如果是单次工单
+                if (v.getType() == 2) {
+                    BizCollection collection = new BizCollection();
+                    collection.setContractId(v.getContractId());
+                    collection.setStatus(1);
+                    //查询收款数据
+                    List<BizCollection> colList = bizCollectionService.getList(collection);
+                    //已收款金额
+                    BigDecimal collectionMoney = new BigDecimal(0);
+                    //计算收款金额
+                    for (BizCollection d : colList) {
+                        BigDecimal addMoney = d.getArriveAmount();
+                        if (addMoney != null) {
+                            collectionMoney = collectionMoney.add(addMoney);
+                        } else {
+                            addMoney = new BigDecimal(0);
+                        }
+                    }
+                    //判断是否全部收款
+                    if (collectionMoney.compareTo(money) == 0) {
+                        v.setOnceContractStatus("已收款");
+                    } else if (collectionMoney.compareTo(money) < 0 && collectionMoney.compareTo(new BigDecimal(0)) > 0) {
+                        v.setOnceContractStatus("部分收款");
+                    } else if (collectionMoney.compareTo(new BigDecimal(0)) == 0) {
+                        v.setOnceContractStatus("未收款");
+                    }
+                }
+                //如果是循环工单
+                if (v.getType() == 1 && detailList.size() > 0) {
+
+                    //判断是否有起始月份
+//                    BizArchiveInputDetail detail = new BizArchiveInputDetail();
+////                    detail.setContractId(v.getContractId());
+//                    detail.setFromId(0L);
+//                    detail.setCompanyId(v.getCompanyId());
+//                    detail.setDeleted(0);
+//                    detail.setTaskTypeId(v.getTaskTypeId());
+//                    detail = bizArchiveInputDetailService.getDetail(detail);
+                    Integer monthNum = 0;
+                    if (v.getStartMonth() != null) {
+
+                        //如果只有一个合同
+                        if (detailList.size() == 1) {
+
+                            //且收款金额为0
+                            detailList.get(0).setTotalityMoney(detailList.get(0).getTotalityMoney() == null ? new BigDecimal(0) : detailList.get(0).getTotalityMoney());
+                            if (detailList.get(0).getAccountsReceivable().compareTo(new BigDecimal(0)) == 0) {
+                                v.setClosingMonth("已收款");
+                            } else if (detailList.get(0).getTotalityMoney().compareTo(new BigDecimal(0)) == 0) {
+                                v.setClosingMonth("未收款");
+                            } else if (detailList.get(0).getTotalityMoney().compareTo(detailList.get(0).getAccountsReceivable()) >= 0) {
+                                v.setClosingMonth("已收款");
+                            } else {
+                                List<BizCollection> collectionList = new ArrayList<>();
+                                BizCollection collection = new BizCollection();
+                                collection.setContractId(detailList.get(0).getContractId());
+                                collectionList = bizCollectionService.getList(collection);
+                                if (collectionList.size() > 0) {
+                                    BizCollectionDetail collectionDetails = new BizCollectionDetail();
+                                    collectionDetails.setContractId(detailList.get(0).getContractId());
+                                    collectionDetails.setTaskTypeId(detailList.get(0).getTaskTypeId());
+                                    collectionDetails.setCollectionId(collectionList.get(0).getId());
+                                    List<BizCollectionDetail> collectionDetail = bizCollectionDetailService.getListByBean(collectionDetails);
+                                    if (collectionDetail != null && !collectionDetail.isEmpty() && detailList != null && !detailList.isEmpty()) {
+                                        for (BizCollectionDetail d : collectionDetail) {
+                                            if (d.getTaskTypeId() == detailList.get(0).getTaskTypeId()) {
+                                                d.setAmount( d.getAmount()== null ? new BigDecimal(0) : d.getAmount());
+                                                if (d.getAmount().compareTo(d.getArriveAmount()) <= 0) {
+                                                    v.setClosingMonth("已收款");
+                                                } else if (d.getAmount().compareTo(d.getArriveAmount()) > 0 && d.getArriveAmount().compareTo(new BigDecimal(0)) != 0) {
+                                                    v.setClosingMonth("部分收款");
+                                                } else if (d.getArriveAmount() == new BigDecimal(0)) {
+                                                    v.setClosingMonth("未收款");
+                                                } else {
+                                                    v.setClosingMonth("未收款");
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+
+                            }
+
+                        } else {
+                            //根据单价计算月数
+                            for (BizWorkOrderDetailUpdate d : detailList) {
+                                Long contractDetailId = d.getContractDetailId();
+                                //判断是否有起始月份
+
+                                BizArchiveInputDetailUpdate detail = bizArchiveInputDetailService.getById(contractDetailId);
+                                // 该明细的合同总金额
+                                BizArchiveInputUpdate e = bizArchiveInputService.getById(d.getContractId());
+                                money = e.getAmount();
+                                //如果收款金额大于0
+                                if (d.getTotalityMoney() != null && d.getTotalityMoney().compareTo(new BigDecimal(0)) > 0 && d.getServiceNum() > 0) {
+                                    detail.setContractId(d.getContractId());
+                                    detail.setTaskTypeId(d.getTaskTypeId());
+                                    detail = bizArchiveInputDetailService.getDetail(detail);
+                                    BigDecimal price = money.divide(new BigDecimal(d.getServiceNum()), 2, RoundingMode.HALF_UP);//除法,保留两位小数,四舍五入
+                                    monthNum += d.getTotalityMoney().divide(price, MathContext.DECIMAL64).setScale(0, RoundingMode.DOWN).intValue();
+                                }
+                                if (money.compareTo(BigDecimal.ZERO) == 0) {
+                                    monthNum = monthNum + detail.getServiceNum() + detail.getFreeNum();
+                                }
+                                //判断收款月数是否等于服务月数
+                                if (detail!= null && detail.getServiceNum() == monthNum) {
+                                    //如果服务月数等于收款月数则加上赠送月数
+                                    monthNum += detail.getFreeNum();
+                                }
+                            }
+
+                            //设置收款截止月
+                            Calendar rightNow = Calendar.getInstance();
+                            rightNow.setTime(v.getStartMonth());
+                            rightNow.add(Calendar.MONTH, monthNum == 0 ? monthNum : monthNum - 1);
+                            Date closingMonth = rightNow.getTime();
+                            // 创建一个SimpleDateFormat对象,指定日期格式
+                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月");
+                            // 将Date对象转换为字符串
+                            String dateString = sdf.format(closingMonth);
+                            v.setClosingMonth("收款截止" + dateString);
+                        }
+                    } else {
+                        v.setClosingMonth("-");
+                    }
+                }
+            }
+        }
+        return list;
+    }
+    @PreAuthorize("@ss.hasPermi('business:upgrade:workOrder:edit')")
+    @PostMapping("/updatestartmonth")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult updatestartmonth(@RequestBody BizWorkOrderUpdate bizWorkOrder) throws NoSuchFieldException, IllegalAccessException {
+        setTenantId(bizWorkOrder);
+        boolean status = bizWorkOrderUpdateService.saveOrUpdate(bizWorkOrder);
+        return toAjax(status);
+    }
+    /**
+     * 导出工单信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('business:upgrade:workOrder:export')")
+    @Log(title = "工单信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BizWorkOrderUpdate bizWorkOrder) throws NoSuchFieldException, IllegalAccessException {
+   //     setTenantId(bizWorkOrder);
+//        startPage();
+   //     startOrderBy();
+        List<BizWorkOrderUpdate> list = this.getBizWorkOrderUpdates(bizWorkOrder,false);
+        ExcelUtil<BizWorkOrderUpdate> util = new ExcelUtil<BizWorkOrderUpdate>(BizWorkOrderUpdate.class);
+        util.exportExcel(response, list, "工单信息数据");
+    }
+}

+ 93 - 0
src/main/java/cn/ezhizao/project/business/upgrade/crmUpgradeController.java

@@ -0,0 +1,93 @@
+package cn.ezhizao.project.business.upgrade;
+
+import cn.ezhizao.common.utils.SecurityUtils;
+import cn.ezhizao.common.utils.poi.ExcelUtil;
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+import cn.ezhizao.framework.aspectj.lang.annotation.Log;
+import cn.ezhizao.framework.aspectj.lang.enums.BusinessType;
+import cn.ezhizao.framework.web.controller.BaseController;
+import cn.ezhizao.framework.web.domain.AjaxResult;
+import cn.ezhizao.project.business.order.domain.OrderExcelImportLoopModel;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputTempService;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderUpdateService;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrder;
+import cn.ezhizao.project.business.workOrder.service.IBizWorkOrderService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/upgrade/crm")
+public class crmUpgradeController extends BaseController {
+
+    @Resource
+    private IBizArchiveInputTempService bizArchiveInputService;
+    @Resource
+    private IBizWorkOrderUpdateService bizWorkOrderUpdateService;
+    @Resource
+    private IBizWorkOrderService bizWorkOrderService;
+    @Log(title = "合同导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:import')")
+    @PostMapping("/order/importLoop")
+    @Transactional
+    public AjaxResult importLoop(MultipartFile file) throws Exception {
+        ExcelUtil<OrderExcelImportLoopModel> util = new ExcelUtil<>(OrderExcelImportLoopModel.class);
+        List<OrderExcelImportLoopModel> 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.importLoop(orderList, SecurityUtils.getUserId(), getTenantId() == null ? 0 : getTenantId());
+            return success(message);
+    }
+
+    @Log(title = "基础版升级", businessType = BusinessType.INSERT)
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:edit')")
+    @PostMapping("/order/completeUpgrade")
+    @Transactional
+    public AjaxResult completeUpgrade() throws NoSuchFieldException, IllegalAccessException {
+        Long tenantId =0L;
+        String message = "升级成功,请刷新页面";
+        tenantId = getTenantId();
+
+        List<BizWorkOrder> waitingForUpgradingList = bizWorkOrderService.lambdaQuery().eq(BizWorkOrder::getTenantId,tenantId).list();
+        bizWorkOrderUpdateService.workerUpgrade(waitingForUpgradingList,tenantId);
+        return success(message);
+    }
+    @Log(title = "基础版升级", businessType = BusinessType.OTHER)
+    @PreAuthorize("@ss.hasPermi('business:upgrade:order:list')")
+    @PostMapping("/order/checkWorkOrder")
+    public AjaxResult checkWorkOrder(){
+
+        Long count = bizWorkOrderService.query().eq("contract_id",0).eq("tenant_id",getTenantId()).count();
+        if (null!= count && count > 0L) {
+            return success("false");
+        }
+        return success("false");
+    }
+    public List<String> getExcelAnnotatedFields(Class<?> clazz) {
+        Field[] fields = clazz.getDeclaredFields();
+        List<String> result = new ArrayList<>();
+        for (Field field : fields) {
+            if (field.isAnnotationPresent(Excel.class)) {
+                Excel excelAnnotation = field.getAnnotation(Excel.class);
+                String fieldName = excelAnnotation.name();
+                result.add(fieldName);
+            }
+        }
+        return result;
+    }
+}

+ 178 - 0
src/main/java/cn/ezhizao/project/business/upgrade/domain/BizArchiveInputDetailUpdate.java

@@ -0,0 +1,178 @@
+package cn.ezhizao.project.business.upgrade.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import cn.ezhizao.project.business.order.domain.BizArchiveInputDetailProcess;
+import cn.ezhizao.project.business.order.domain.vo.TimeVo;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import cn.ezhizao.framework.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModelProperty;
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+
+/**
+ * 合同明细对象 biz_archive_input_detail
+ *
+ * @author ruoyi
+ * @date 2023-10-16
+ */
+@Data
+@TableName(value = "biz_archive_input_detail_update")
+public class BizArchiveInputDetailUpdate extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 合同外键
+     */
+    @ApiModelProperty(value = "${comment}")
+    private Long contractId;
+
+    /**
+     * 任务类型外键
+     */
+    @ApiModelProperty(value = "${comment}")
+    private Long taskTypeId;
+
+    @ApiModelProperty("任务名称")
+    @TableField(exist = false)
+    private String taskTypeName;
+
+    @ApiModelProperty(value = "客户外键")
+    private Long companyId;
+
+    /** 月数 */
+//    @Excel(name = "月数")
+//    @ApiModelProperty(value = "月数")
+//    private Integer monthNum;
+
+    /**
+     * 单价
+     */
+    @Excel(name = "单价")
+    @ApiModelProperty(value = "单价")
+    private BigDecimal price;
+
+    /**
+     * 总金额
+     */
+    @Excel(name = "总金额")
+    @ApiModelProperty(value = "总金额")
+    private BigDecimal amount;
+
+    /**
+     * 总金额
+     */
+    @Excel(name = "总金额")
+    @ApiModelProperty(value = "总金额")
+    private BigDecimal addressAmount;
+
+    /**
+     * $column.columnComment
+     */
+    @ApiModelProperty(value = "租户外键")
+    private Long tenantId;
+
+    @TableField(exist = false)
+    private List<BizArchiveInputDetailProcess> processes;
+
+    @TableField(exist = false)
+    private Integer payAddress;
+
+    @ApiModelProperty("地址类型")
+    @Excel(name = "地址类型", readConverterExp = "1=自有地址,2=虚拟地址")
+    private Integer addressStyle;
+
+    @ApiModelProperty("地址")
+    private String address;
+
+    @ApiModelProperty("虚拟地址外键")
+    private Long fictionAddressId;
+    @ApiModelProperty("虚拟地址外键")
+    @TableField(exist = false)
+    private String fictionAddress;
+    @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;
+
+
+    @ApiModelProperty("服务月数")
+    @Excel(name = "服务月数")
+    private Integer serviceNum;
+    @ApiModelProperty(name = "赠送月数")
+    @Excel(name = "赠送月数")
+    private Integer freeNum;
+
+    @ApiModelProperty("变更来源外键")
+    private Long fromId;
+
+    @TableField(exist = false)
+    private Boolean redirect;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endMonth;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startMonth;
+    @ApiModelProperty("已付款")
+    @TableField(exist = false)
+    private BigDecimal arrived;
+    @TableField(exist = false)
+    private BigDecimal trueAmount;
+    @ApiModelProperty("变更类型")
+    private String alterType;
+
+    @ApiModelProperty("优惠金额")
+    private BigDecimal discountAmount;
+
+    @ApiModelProperty("所属区")
+    private String belongRegion;
+    @ApiModelProperty("所属区")
+    @TableField(exist = false)
+    private String regionName;
+
+
+    //禁用状态
+    @TableField(exist = false)
+    private boolean isDisabled;
+
+    @TableField(exist = false)
+    private TimeVo timeVo;
+}

+ 249 - 0
src/main/java/cn/ezhizao/project/business/upgrade/domain/BizArchiveInputUpdate.java

@@ -0,0 +1,249 @@
+package cn.ezhizao.project.business.upgrade.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import cn.ezhizao.project.system.domain.SysFileStorage;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableName;
+import cn.ezhizao.framework.web.domain.BaseEntity;
+import lombok.Data;
+import io.swagger.annotations.ApiModelProperty;
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+
+/**
+ * 档案入库对象 biz_archive_input
+ *
+ * @author ruoyi
+ * @date 2023-10-16
+ */
+@Data
+@TableName(value = "biz_archive_input_update")
+public class BizArchiveInputUpdate extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 档案编码
+     */
+//    @Excel(name = "档案编码")
+    @ApiModelProperty(value = "档案编码")
+    private String archiveCode;
+
+    /**
+     * 客户外键
+     */
+    @ApiModelProperty(value = "档案编码")
+    private Long companyId;
+
+    @ApiModelProperty("变更来源外键")
+    private Long fromId;
+
+    @TableField(exist = false)
+    @Excel(name = "客户名称",width = 30, sort = 1)
+    private String companyName;
+
+    @TableField(exist = false)
+    @ApiModelProperty("税号")
+    @Excel(name = "税号",width = 25, sort = 2)
+    private String socialCreditCode;
+
+    @ApiModelProperty("签单人")
+    private Long signerId;
+
+    @TableField(exist = false)
+    @ApiModelProperty("签单人")
+    @Excel(name = "签单人")
+    private String signerName;
+
+    /**
+     * 档案类型id
+     */
+    @ApiModelProperty(value = "档案编码")
+    private Long archiveTypeId;
+
+    /**
+     * 开始月
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+//    @Excel(name = "开始月", width = 20, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "开始月")
+    private Date startMonth;
+
+    /**
+     * 结束月
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+//    @Excel(name = "结束月", width = 20, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "结束月")
+    private Date endMonth;
+
+    /**
+     * 库位外键
+     */
+    @ApiModelProperty(value = "结束月")
+    private Long locationId;
+
+    /**
+     * 入库人外键
+     */
+    @ApiModelProperty(value = "入库人外键")
+    private Long inputEmployeeId;
+
+    /**
+     * 凭证图片路径
+     */
+//    @Excel(name = "凭证图片路径")
+    @ApiModelProperty(value = "凭证图片路径")
+    private String proofUrl;
+
+    @ApiModelProperty("变更类型")
+    @TableField(exist = false)
+    private String alterType;
+    /**
+     * 合同编号
+     */
+    @Excel(name = "合同编号")
+    @ApiModelProperty(value = "合同编号")
+    private String contractNo;
+
+    /**
+     * 签约日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "签约日期", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "签约日期")
+    private Date formDate;
+
+    /**
+     * 签约金额
+     */
+    @Excel(name = "签约金额")
+    @ApiModelProperty(value = "签约金额")
+    private BigDecimal amount;
+
+    /**
+     * 优惠金额
+     **/
+    @Excel(name = "优惠金额")
+    @ApiModelProperty("优惠金额")
+    private BigDecimal discountAmount;
+
+    /**
+     * 优惠金额
+     **/
+    @Excel(name = "实付金额")
+    @ApiModelProperty("实付金额")
+    private BigDecimal trueAmount;
+
+    /**
+     * 合同审核状态
+     */
+    @Excel(name = "合同审核状态", readConverterExp = "1=已审核,0=未审核")
+    @ApiModelProperty(value = "合同审核状态")
+    private Integer verifyStatus;
+    @Excel(name = "客户标签")
+    @TableField(exist = false)
+    private String customerLabelName;
+    /**
+     * 合同类型
+     */
+    @Excel(name = "合同类型", readConverterExp = "0=新签,1=续签")
+    @ApiModelProperty(value = "合同类型")
+    private Integer contractType;
+
+    @Excel(name = "任务类型", readConverterExp = "1=循环,2=单次")
+    @ApiModelProperty("任务类型")
+    private Integer serviceType;
+
+    /**
+     * 证照类型
+     */
+    @ApiModelProperty(value = "证照类型")
+    private Long certificateTypeId;
+
+    /**
+     * 出库时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+//    @Excel(name = "出库时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "出库时间")
+    private Date outputDate;
+
+    /**
+     * 主程序账套外键
+     */
+    @ApiModelProperty(value = "出库时间")
+    private Long tenantId;
+
+    /**
+     * 月数
+     */
+//    @Excel(name = "月数")
+    @ApiModelProperty(value = "月数")
+    private Long monthNum;
+
+    /**
+     * 审核备注
+     */
+    @Excel(name = "审核备注")
+    @ApiModelProperty(value = "审核备注")
+    private String verifyRemark;
+
+    @TableField(exist = false)
+    private List<BizArchiveInputDetailUpdate> details;
+
+    @ApiModelProperty("来源类型外键")
+    private Long sourceCategoryId;
+
+    @TableField(exist = false)
+    private String sourceCategoryName;
+
+    @TableField(exist = false)
+    private String sourceName;
+    @TableField(exist = false)
+    private String referrerDataSource;
+
+    @ApiModelProperty("来源外键")
+    private Long sourceId;
+
+
+    @ApiModelProperty("状态")
+    private Integer status;
+
+    @TableField(exist = false)
+    private List<SysFileStorage> files;
+
+    @ApiModelProperty("解除合同状态")
+    private Integer dissolution;
+
+    @ApiModelProperty("变更次数")
+    @TableField(exist = false)
+    private Integer alterNumber;
+
+    @TableField(exist = false)
+    private Integer isKeepAccount;
+    @TableField(exist = false)
+    private Integer isSocialSecurity;
+    @TableField(exist = false)
+    private Integer isHousingFund;
+    @TableField(exist = false)
+    private Integer isReturnTax;
+
+    @TableField(exist = false)
+    private Integer isRegister;
+    @TableField(exist = false)
+    private Integer isAlter;
+    @TableField(exist = false)
+    private Integer isLogout;
+    @TableField(exist = false)
+    private Integer isQualified;
+    @TableField(exist = false)
+    private Integer isOther;
+    @TableField(exist = false)
+    private Long customerLabelId;
+    private String boss;
+    private String party;
+
+}

+ 76 - 0
src/main/java/cn/ezhizao/project/business/upgrade/domain/BizWorkOrderDetailUpdate.java

@@ -0,0 +1,76 @@
+package cn.ezhizao.project.business.upgrade.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import cn.ezhizao.framework.web.domain.BaseEntity;
+import lombok.Data;
+import io.swagger.annotations.ApiModelProperty;
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+
+import java.math.BigDecimal;
+
+/**
+ * 企业租户对象 biz_work_order_detail_update
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+@Data
+@TableName(value = "biz_work_order_detail_update")
+public class BizWorkOrderDetailUpdate extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+    /** 外键 */
+    @ApiModelProperty(value = "${comment}")
+    private Long workOrderId;
+
+    /** 客户外键 */
+    @ApiModelProperty(value = "${comment}")
+    private Long companyId;
+
+    /** 合同外键 */
+    @ApiModelProperty(value = "${comment}")
+    private Long contractId;
+
+    @ApiModelProperty("合同明细外键")
+    private Long contractDetailId;
+
+    /** 任务外键 */
+    @ApiModelProperty(value = "${comment}")
+    private Long taskTypeId;
+
+    /** 购买月数 */
+    @Excel(name = "购买月数")
+    @ApiModelProperty(value = "购买月数")
+    private Integer serviceNum;
+
+    /** 赠送月数 */
+    @Excel(name = "赠送月数")
+    @ApiModelProperty(value = "赠送月数")
+    private Integer freeNum;
+
+    @ApiModelProperty("租户外键")
+    private Long tenantId;
+
+    @ApiModelProperty("是否停止")
+    private Integer isStop;
+
+    //合同收款总金额
+    @TableField(exist = false)
+    private BigDecimal totalityMoney;
+
+    //合同应收款金额
+    @TableField(exist = false)
+    private BigDecimal accountsReceivable;
+
+    //月单价
+    @TableField(exist = false)
+    private BigDecimal monthPrice;
+
+    @TableField(exist = false)
+    //合同状态
+    private Integer status;
+
+    @TableField(exist = false)
+    private Long sourceWorkOrderDetailId;
+}

+ 249 - 0
src/main/java/cn/ezhizao/project/business/upgrade/domain/BizWorkOrderUpdate.java

@@ -0,0 +1,249 @@
+package cn.ezhizao.project.business.upgrade.domain;
+
+import java.util.Date;
+import java.util.List;
+
+import cn.ezhizao.project.business.entrust.domain.BizEntrust;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderRecord;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableName;
+import cn.ezhizao.framework.web.domain.BaseEntity;
+import lombok.Data;
+import io.swagger.annotations.ApiModelProperty;
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+
+/**
+ * 工单信息对象 biz_work_order
+ *
+ * @author ruoyi
+ * @date 2023-10-16
+ */
+@Data
+@TableName(value = "biz_work_order_update")
+public class BizWorkOrderUpdate extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 合同外键
+     */
+    @ApiModelProperty(value = "${comment}")
+    private Long contractId;
+
+    /**
+     * 客户外键
+     */
+    @ApiModelProperty(value = "${comment}")
+    private Long companyId;
+
+    @ApiModelProperty("客户名称")
+    @Excel(name = "客户名称", width = 35, sort = 1)
+    @TableField(exist = false)
+    private String companyName;
+
+    @ApiModelProperty("纳税性质")
+    @TableField(exist = false)
+    private String taxType;
+
+    @ApiModelProperty("税号")
+    @TableField(exist = false)
+    private String socialCreditCode;
+
+    @ApiModelProperty("合同明细外键")
+    private Long contractDetailId;
+
+    @ApiModelProperty("合同流程外键")
+    private Long contractDetailProcessId;
+
+    /**
+     * 工单类型 1循环 2代办
+     */
+    @Excel(name = "工单类型", readConverterExp = "1=循环工单,2=代办工单", sort = 2)
+    @ApiModelProperty(value = "工单类型 1循环 2代办")
+    private Integer type;
+
+
+    /**
+     * 无合同
+     */
+    @ApiModelProperty(value = "无合同")
+    private Integer noContract;
+
+    /**
+     * 编号
+     */
+    @ApiModelProperty(value = "编号")
+    private String workOrderNo;
+
+    /**
+     * 任务类型 任务表外键 任务明细表
+     */
+    @ApiModelProperty(value = "任务外键")
+    private Long taskTypeId;
+
+    @TableField(exist = false)
+    @Excel(name = "任务类型", sort = 5)
+    private String taskTypeName;
+
+    /**
+     * 任务类型 任务表外键 任务明细表
+     */
+    @ApiModelProperty(value = "任务明细外键")
+    private Long taskTypeDetailId;
+
+    @TableField(exist = false)
+//    @Excel(name = "任务详情", sort = 6)
+    private String taskTypeDetailName;
+
+    @Excel(name = "是否延续", sort = 6, readConverterExp = "0=否,1=是")
+    @ApiModelProperty(value = "是否延续")
+    private Integer isContinue;
+
+    /**
+     * 收款截至月
+     */
+    @TableField(exist = false)
+    private String closingMonth;
+
+    /**
+     * 单次合同收款状态
+     */
+    @TableField(exist = false)
+    private String onceContractStatus;
+
+    /**
+     * 开始月
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "开始月", width = 15, dateFormat = "yyyy年MM月", sort = 7)
+    @ApiModelProperty(value = "开始月")
+    private Date startMonth;
+
+    /**
+     * 结束月
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "结束月", width = 15, dateFormat = "yyyy年MM月", sort = 8)
+    @ApiModelProperty(value = "结束月")
+    private Date endMonth;
+
+    /**
+     * 月数
+     */
+    @Excel(name = "月数", sort = 9)
+    @ApiModelProperty(value = "月数")
+    private Integer monthNum;
+
+    /**
+     * 负责人
+     */
+    @ApiModelProperty(value = "负责人")
+    private Long managerId;
+
+    /**
+     * 主程序账套外键
+     */
+    @ApiModelProperty(value = "账套外键")
+    private Long tenantId;
+
+    /**
+     * 停止任务
+     */
+    @ApiModelProperty(value = "停止任务")
+    private Integer isStop;
+
+
+    //    @Excel(name = "注册省份编码")
+    @ApiModelProperty(value = "注册省份编码")
+    private String provinceCode;
+
+    /**
+     * 省
+     */
+//    @Excel(name = "省", sort = 11)
+    @ApiModelProperty(value = "省")
+    private String province;
+
+    /**
+     * 注册城市编码
+     */
+//    @Excel(name = "注册城市编码")
+    @ApiModelProperty(value = "注册城市编码")
+    private String cityCode;
+
+    /**
+     * 市
+     */
+//    @Excel(name = "市", sort = 12)
+    @ApiModelProperty(value = "市")
+    private String city;
+
+    /**
+     * 注册行政区编码
+     */
+//    @Excel(name = "注册行政区编码")
+    @ApiModelProperty(value = "注册行政区编码")
+    private String districtCode;
+
+    /**
+     * 区
+     */
+//    @Excel(name = "区", sort = 13)
+    @ApiModelProperty(value = "区")
+    private String district;
+
+    @TableField(exist = false)
+    private List<BizWorkOrderRecord> records;
+    @TableField(exist = false)
+    private List<BizWorkOrderDetailUpdate> details;
+
+    @TableField(exist = false)
+    private BizWorkOrderRecord record;
+
+    /**
+     * 服务管理查询条件
+     */
+    @TableField(exist = false)
+    private Integer status;
+    @TableField(exist = false)
+    private String year;
+    @TableField(exist = false)
+    private String month;
+
+    @ApiModelProperty("服务人员")
+    private Long serviceId;
+
+    @TableField(exist = false)
+    @Excel(name = "执行人", sort = 14)
+    private String serviceName;
+
+    @TableField(exist = false)
+    private List<BizEntrust> entrusts;
+
+    @TableField(exist = false)
+    private BizEntrust entrust;
+
+    @TableField(exist = false)
+    private List<Long> ids;
+
+    @TableField(exist = false)
+    private Integer isZero;
+
+    @TableField(exist = false)
+    private String alterType;
+    @TableField(exist = false)
+    private Integer addressStyle;
+    @TableField(exist = false)
+    private Long fictionAddressId;
+    @TableField(exist = false)
+    private String inputProvince;
+    @TableField(exist = false)
+    private String inputCity;
+    @TableField(exist = false)
+    private String inputDistrict;
+    @TableField(exist = false)
+    private String explain;
+    private Long sourceWorkOrderId;
+
+    public Integer isNew;
+}

+ 33 - 0
src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizArchiveInputDetailUpdateMapper.java

@@ -0,0 +1,33 @@
+package cn.ezhizao.project.business.upgrade.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 合同明细Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+public interface BizArchiveInputDetailUpdateMapper extends BaseMapper<BizArchiveInputDetailUpdate>
+{
+    /**
+     * 查询合同明细列表
+     *
+     * @param bizArchiveInputDetailUpdate 合同明细
+     * @return 合同明细集合
+     */
+    public List<BizArchiveInputDetailUpdate> getList(BizArchiveInputDetailUpdate bizArchiveInputDetailUpdate);
+
+    /**
+     * 物理删除
+     * @param bizArchiveInputDetailUpdate
+     * @return 删除结果
+    */
+    public int physicalDelete(BizArchiveInputDetailUpdate bizArchiveInputDetailUpdate);
+
+    BizArchiveInputDetailUpdate getDetail(BizArchiveInputDetailUpdate detail);
+    List<Long> selectByTaskIdAndCompanyId(@Param("companyId")Long companyId,@Param("taskIds") List<Long>taskIds);
+}

+ 32 - 0
src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizArchiveInputTempMapper.java

@@ -0,0 +1,32 @@
+package cn.ezhizao.project.business.upgrade.mapper;
+
+import java.util.List;
+
+import cn.ezhizao.project.business.order.domain.vo.InputVo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputUpdate;
+
+/**
+ * 档案入库Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-10-12
+ */
+public interface BizArchiveInputTempMapper extends BaseMapper<BizArchiveInputUpdate>
+{
+    /**
+     * 查询档案入库列表
+     *
+     * @param bizArchiveInputUpdate 档案入库
+     * @return 档案入库集合
+     */
+    public List<BizArchiveInputUpdate> getList(BizArchiveInputUpdate bizArchiveInputUpdate);
+
+    /**
+     * 物理删除
+     * @param bizArchiveInputUpdate
+     * @return 删除结果
+    */
+    public int physicalDelete(BizArchiveInputUpdate bizArchiveInputUpdate);
+    List<BizArchiveInputUpdate> getListByInput(InputVo bizArchiveInput);
+}

+ 32 - 0
src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizWorkOrderDetailUpdateMapper.java

@@ -0,0 +1,32 @@
+package cn.ezhizao.project.business.upgrade.mapper;
+
+import java.util.List;
+
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderDetailUpdate;
+
+/**
+ * 企业租户Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+public interface BizWorkOrderDetailUpdateMapper extends BaseMapper<BizWorkOrderDetailUpdate>
+{
+    /**
+     * 查询企业租户列表
+     *
+     * @param bizWorkOrderDetailUpdate 企业租户
+     * @return 企业租户集合
+     */
+    public List<BizWorkOrderDetailUpdate> getList(BizWorkOrderDetailUpdate bizWorkOrderDetailUpdate);
+
+    /**
+     * 物理删除
+     * @param detailUpdateList
+     * @return 删除结果
+    */
+    public int physicalDelete(List<BizWorkOrderDetailUpdate> detailUpdateList);
+    public List<BizWorkOrderDetail> selectByUpgradeId(BizWorkOrderDetail bizWorkOrderDetail);
+}

+ 36 - 0
src/main/java/cn/ezhizao/project/business/upgrade/mapper/BizWorkOrderUpdateMapper.java

@@ -0,0 +1,36 @@
+package cn.ezhizao.project.business.upgrade.mapper;
+
+import java.util.List;
+
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 企业租户Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+public interface BizWorkOrderUpdateMapper extends BaseMapper<BizWorkOrderUpdate>
+{
+    /**
+     * 查询企业租户列表
+     *
+     * @param bizWorkOrderUpdate 企业租户
+     * @return 企业租户集合
+     */
+    public List<BizWorkOrderUpdate> getList(BizWorkOrderUpdate bizWorkOrderUpdate);
+
+    /**
+     * 物理删除
+     * @param ids
+     * @return 删除结果
+    */
+    public int physicalDelete(@Param("ids")List<Long> ids);
+    List<BizWorkOrderUpdate> getList2(BizWorkOrderUpdate bizWorkOrder);
+
+    List<BizWorkOrderUpdate> gettoUpLoadList(BizWorkOrderUpdate bizWorkOrder);
+    List<BizWorkOrder> selectByUpgradeId(BizWorkOrder query);
+}

+ 33 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/IBizArchiveInputDetailUpdateService.java

@@ -0,0 +1,33 @@
+package cn.ezhizao.project.business.upgrade.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate;
+
+/**
+ * 合同明细Service接口
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+public interface IBizArchiveInputDetailUpdateService extends IService<BizArchiveInputDetailUpdate>
+{
+    /**
+     * 查询合同明细列表
+     *
+     * @param bizArchiveInputDetailUpdate 合同明细
+     * @return 合同明细集合
+     */
+    public List<BizArchiveInputDetailUpdate> getList(BizArchiveInputDetailUpdate bizArchiveInputDetailUpdate);
+
+    /**
+     * 物理删除
+     * @param bizArchiveInputDetailUpdate
+     * @return 删除结果
+     */
+    public int physicalDelete(BizArchiveInputDetailUpdate bizArchiveInputDetailUpdate);
+    public BizArchiveInputDetailUpdate getDetail(BizArchiveInputDetailUpdate detail);
+    List<Long> selectByTaskIdAndCompanyId(Long companyId,List<Long>taskIds);
+
+}

+ 36 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/IBizArchiveInputTempService.java

@@ -0,0 +1,36 @@
+package cn.ezhizao.project.business.upgrade.service;
+
+import java.util.List;
+
+import cn.ezhizao.project.business.order.domain.OrderExcelImportLoopModel;
+import cn.ezhizao.project.business.order.domain.vo.InputVo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputUpdate;
+
+/**
+ * 档案入库Service接口
+ *
+ * @author ruoyi
+ * @date 2024-10-12
+ */
+public interface IBizArchiveInputTempService extends IService<BizArchiveInputUpdate>
+{
+    /**
+     * 查询档案入库列表
+     *
+     * @param bizArchiveInputUpdate 档案入库
+     * @return 档案入库集合
+     */
+    public List<BizArchiveInputUpdate> getList(BizArchiveInputUpdate bizArchiveInputUpdate);
+
+    /**
+     * 物理删除
+     * @param bizArchiveInputUpdate
+     * @return 删除结果
+     */
+    public int physicalDelete(BizArchiveInputUpdate bizArchiveInputUpdate);
+    List<BizArchiveInputUpdate> getListByInput(InputVo bizArchiveInput);
+
+    String importLoop(List<OrderExcelImportLoopModel> orderList, Long userId, long l);
+    public boolean deleteArchiveInput(Long tentantId,Long inputId);
+}

+ 32 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/IBizWorkOrderDetailUpdateService.java

@@ -0,0 +1,32 @@
+package cn.ezhizao.project.business.upgrade.service;
+
+import java.util.List;
+
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderDetailUpdate;
+
+/**
+ * 企业租户Service接口
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+public interface IBizWorkOrderDetailUpdateService extends IService<BizWorkOrderDetailUpdate>
+{
+    /**
+     * 查询企业租户列表
+     *
+     * @param bizWorkOrderDetailUpdate 企业租户
+     * @return 企业租户集合
+     */
+    public List<BizWorkOrderDetailUpdate> getList(BizWorkOrderDetailUpdate bizWorkOrderDetailUpdate);
+
+    /**
+     * 物理删除
+     * @param detailUpdateList
+     * @return 删除结果
+     */
+    public int physicalDelete(List<BizWorkOrderDetailUpdate> detailUpdateList);
+    List<BizWorkOrderDetail> selectByUpgradeId(BizWorkOrderDetail bizWorkOrderDetail);
+}

+ 37 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/IBizWorkOrderUpdateService.java

@@ -0,0 +1,37 @@
+package cn.ezhizao.project.business.upgrade.service;
+
+import java.util.List;
+
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrder;
+import cn.ezhizao.project.system.domain.SysUser;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate;
+
+/**
+ * 企业租户Service接口
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+public interface IBizWorkOrderUpdateService extends IService<BizWorkOrderUpdate>
+{
+    /**
+     * 查询企业租户列表
+     *
+     * @param bizWorkOrderUpdate 企业租户
+     * @return 企业租户集合
+     */
+    public List<BizWorkOrderUpdate> getList(BizWorkOrderUpdate bizWorkOrderUpdate);
+
+    /**
+     * 物理删除
+     * @param ids
+     * @return 删除结果
+     */
+    public int physicalDelete(List<Long> ids);
+    List<BizWorkOrderUpdate> getList2(BizWorkOrderUpdate bizWorkOrder);
+
+    List<BizWorkOrderUpdate> gettoUpLoadList(BizWorkOrderUpdate bizWorkOrder);
+
+    void workerUpgrade(List<BizWorkOrder> bizWorkOrder, Long tenantId);
+}

+ 50 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizArchiveInputDetailUpdateServiceImpl.java

@@ -0,0 +1,50 @@
+package cn.ezhizao.project.business.upgrade.service.impl;
+
+import java.util.List;
+import javax.annotation.Resource;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import cn.ezhizao.project.business.upgrade.mapper.BizArchiveInputDetailUpdateMapper;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputDetailUpdateService;
+
+/**
+ * 合同明细Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+@Service
+public class BizArchiveInputDetailUpdateServiceImpl  extends ServiceImpl<BizArchiveInputDetailUpdateMapper, BizArchiveInputDetailUpdate> implements IBizArchiveInputDetailUpdateService
+{
+    @Resource
+    private BizArchiveInputDetailUpdateMapper bizArchiveInputDetailUpdateMapper;
+
+    /**
+     * 查询合同明细列表
+     *
+     * @param bizArchiveInputDetailUpdate 合同明细
+     * @return 合同明细
+     */
+    @Override
+    public List<BizArchiveInputDetailUpdate> getList(BizArchiveInputDetailUpdate bizArchiveInputDetailUpdate)
+    {
+        return bizArchiveInputDetailUpdateMapper.getList(bizArchiveInputDetailUpdate);
+    }
+
+    /**
+     * 物理删除
+     * @param bizArchiveInputDetailUpdate
+     * @return 删除结果
+     */
+    @Override
+    public int physicalDelete(BizArchiveInputDetailUpdate bizArchiveInputDetailUpdate){ return bizArchiveInputDetailUpdateMapper.physicalDelete(bizArchiveInputDetailUpdate); };
+    @Override
+    public BizArchiveInputDetailUpdate getDetail(BizArchiveInputDetailUpdate detail){
+        return bizArchiveInputDetailUpdateMapper.getDetail(detail);
+    }
+    public List<Long> selectByTaskIdAndCompanyId(Long companyId,List<Long>taskIds){
+        return bizArchiveInputDetailUpdateMapper.selectByTaskIdAndCompanyId(companyId,taskIds);
+    }
+}

+ 674 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizArchiveInputTempServiceImpl.java

@@ -0,0 +1,674 @@
+package cn.ezhizao.project.business.upgrade.service.impl;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
+
+import cn.ezhizao.common.exception.ServiceException;
+import cn.ezhizao.common.utils.bean.BeanUtils;
+import cn.ezhizao.common.utils.uuid.SnowflakeIdWorker;
+import cn.ezhizao.project.business.channel.domain.BizChannel;
+import cn.ezhizao.project.business.channel.service.IBizChannelService;
+import cn.ezhizao.project.business.company.domain.BizCompany;
+import cn.ezhizao.project.business.company.service.IBizCompanyService;
+import cn.ezhizao.project.business.order.domain.OrderExcelImportLoopGroupModel;
+import cn.ezhizao.project.business.order.domain.OrderExcelImportLoopModel;
+import cn.ezhizao.project.business.order.domain.vo.InputVo;
+import cn.ezhizao.project.business.settings.domain.BizSource;
+import cn.ezhizao.project.business.settings.service.IBizSourceService;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrder;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderDetail;
+import cn.ezhizao.project.business.workOrder.service.IBizWorkOrderDetailService;
+import cn.ezhizao.project.business.workOrder.service.IBizWorkOrderService;
+import cn.ezhizao.project.system.domain.SysUser;
+import cn.ezhizao.project.system.service.ISysUserService;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderDetailUpdate;
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputDetailUpdateService;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderDetailUpdateService;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderUpdateService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import cn.ezhizao.project.business.upgrade.mapper.BizArchiveInputTempMapper;
+import cn.ezhizao.project.business.upgrade.domain.BizArchiveInputUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizArchiveInputTempService;
+
+/**
+ * 档案入库Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2024-10-12
+ */
+@Service
+public class BizArchiveInputTempServiceImpl extends ServiceImpl<BizArchiveInputTempMapper, BizArchiveInputUpdate> implements IBizArchiveInputTempService {
+
+    @Resource
+    private IBizArchiveInputDetailUpdateService bizArchiveInputDetailUpdateService;
+    @Resource
+    private BizArchiveInputTempMapper bizArchiveInputTempMapper;
+    @Resource
+    private IBizCompanyService companyService;
+    @Resource
+    private IBizSourceService bizSourceService;
+    @Resource
+    SnowflakeIdWorker snowflakeIdWorker;
+    @Resource
+    private ISysUserService userService;
+    @Resource
+    private IBizChannelService channelService;
+    @Resource
+    private IBizWorkOrderService workOrderService;
+    @Resource
+    private IBizWorkOrderUpdateService workOrderUpdateService;
+    @Resource
+    private IBizWorkOrderDetailService workOrderDetailService;
+    @Resource
+    private IBizWorkOrderDetailUpdateService workOrderDetailUpdateService;
+    StringBuilder successMsg = new StringBuilder();
+    StringBuilder failureMsg = new StringBuilder();
+    int successNum = 0;
+    int failureNum = 0;
+
+    /**
+     * 查询档案入库列表
+     *
+     * @param bizArchiveInputUpdate 档案入库
+     * @return 档案入库
+     */
+    @Override
+    public List<BizArchiveInputUpdate> getList(BizArchiveInputUpdate bizArchiveInputUpdate) {
+        return bizArchiveInputTempMapper.getList(bizArchiveInputUpdate);
+    }
+
+    /**
+     * 物理删除
+     *
+     * @param bizArchiveInputUpdate
+     * @return 删除结果
+     */
+    @Override
+    public int physicalDelete(BizArchiveInputUpdate bizArchiveInputUpdate) {
+        return bizArchiveInputTempMapper.physicalDelete(bizArchiveInputUpdate);
+    }
+
+    /**
+     * 创建合同
+     */
+    private List<BizArchiveInputUpdate> createImportArchiveInput(List<OrderExcelImportLoopModel> orderList,
+                                                                 long tenantId) {
+
+        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
+        List<BizArchiveInputUpdate> archiveInputs = new ArrayList<>();
+        //最后需要保存的合同详情表list
+        List<BizArchiveInputDetailUpdate> inputDetailList = new ArrayList<>();
+        successNum = 0;
+        failureNum = 0;
+
+        successMsg = new 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());
+        BizSource sourceCondition = new BizSource();
+        sourceCondition.setTenantId(tenantId);
+        List<BizSource> sources = bizSourceService.getList(sourceCondition);
+        List<BizCompany> companies = companyService.query().eq("tenant_id", tenantId).list();
+
+        for (OrderExcelImportLoopModel loopModel : orderList) {
+
+            BizCompany company = companies.stream().filter(v -> v.getName().equals(loopModel.getCompanyName())).findFirst().orElse(null);
+            if (company == null) {
+                failureNum++;
+//                failureMsg.append("<br/>").append(failureNum).append("、客户 ").append(loopModel.getCompanyName()).append(" 不存在");
+                continue;
+            }
+
+            BizArchiveInputUpdate archiveInput = new BizArchiveInputUpdate();
+            //创建合同和合同明细
+            if (loopModel.getDiscountAmount() == null) {
+                loopModel.setDiscountAmount(BigDecimal.ZERO);
+            }
+            archiveInput.setCompanyId(company.getId());
+            archiveInput.setArchiveCode(String.valueOf(snowflakeIdWorker.nextId()));
+            archiveInput.setAmount(loopModel.getAmount());
+            archiveInput.setDiscountAmount(loopModel.getDiscountAmount());
+            archiveInput.setTrueAmount(loopModel.getTrueAmount());
+            archiveInput.setFormDate(loopModel.getFormDate());
+            archiveInput.setContractNo(loopModel.getContractNo());
+            SysUser user = userService.selectUserByUserNameAndTenantId(loopModel.getSignerName(), String.valueOf(tenantId));
+//            if (user == null) {
+//                failureNum++;
+//                failureMsg.append("<br/>").append(failureNum).append("、员工 ").append(item.getSignerName()).append(" 不存在");
+//                continue;
+//            }
+            // 判断下订单总价单价是否和录入相符
+            // 假设 amount - discountAmount != trueAmount 跳过该订单
+            if (loopModel.getAmount() == null) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(failureNum).append("服务金额不能为空");
+                continue;
+            }
+            if (loopModel.getTrueAmount() == null) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(failureNum).append("实收金额不能为空");
+                continue;
+            }
+            if (loopModel.getAmount().subtract(loopModel.getDiscountAmount() == null ? BigDecimal.ZERO : loopModel.getDiscountAmount()).compareTo(loopModel.getTrueAmount()) != 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(" 实际付款金额出错");
+                continue;
+            }
+            if (loopModel.getTrueAmount().compareTo(BigDecimal.ZERO) < 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(" 实际付款金额小于0");
+                continue;
+            }
+            // 假设子表金额不等于订单总金额
+            BigDecimal keepAccount = loopModel.getKeepAccountAmount() == null ? BigDecimal.ZERO : loopModel.getKeepAccountAmount();
+            BigDecimal security = loopModel.getSocialSecurityAmount() == null ? BigDecimal.ZERO : loopModel.getSocialSecurityAmount();
+            BigDecimal housingFund = loopModel.getHousingFundAmount() == null ? BigDecimal.ZERO : loopModel.getHousingFundAmount();
+            BigDecimal returnTax = loopModel.getReturnTaxAmount() == null ? BigDecimal.ZERO : loopModel.getReturnTaxAmount();
+            //优惠
+            BigDecimal keepFreeAccount = loopModel.getKeepAccountFreeAmount() == null ? BigDecimal.ZERO : loopModel.getKeepAccountFreeAmount();
+            BigDecimal securityFree = loopModel.getSocialSecurityFreeAmount() == null ? BigDecimal.ZERO : loopModel.getSocialSecurityFreeAmount();
+            BigDecimal housingFundFree = loopModel.getHousingFundFreeAmount() == null ? BigDecimal.ZERO : loopModel.getHousingFundFreeAmount();
+            BigDecimal returnTaxFree = loopModel.getReturnTaxFreeAmount() == null ? BigDecimal.ZERO : loopModel.getReturnTaxFreeAmount();
+//            if (item.getAmount().compareTo(keepAccount.add(security).add(housingFund).add(returnTax)) != 0) {
+            //update 6/12 实收金额 和各项金额比较 ,各项金额填写时应该为 单价*月-优惠金额
+            if (loopModel.getTrueAmount().compareTo(keepAccount.add(security).add(housingFund).add(returnTax)) != 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(" 实收金额不等于实际任务金额的和。");
+                continue;
+            }
+
+            if (loopModel.getDiscountAmount().compareTo(keepFreeAccount.add(securityFree).add(housingFundFree).add(returnTaxFree)) != 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append("优惠金额不等于任务优惠金额的和。");
+                continue;
+            }
+            BigDecimal keepAccountPrice = loopModel.getKeepAccountPrice() == null ? BigDecimal.ZERO : loopModel.getKeepAccountPrice();
+            BigDecimal securityPrice = loopModel.getSocialSecurityPrice() == null ? BigDecimal.ZERO : loopModel.getSocialSecurityPrice();
+            BigDecimal housingFundPrice = loopModel.getHousingFundPrice() == null ? BigDecimal.ZERO : loopModel.getHousingFundPrice();
+            BigDecimal returnTaxPrice = loopModel.getReturnTaxPrice() == null ? BigDecimal.ZERO : loopModel.getReturnTaxPrice();
+            BigDecimal keepAccountMonth = loopModel.getKeepAccountMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getKeepAccountMonth());
+            BigDecimal securityMonth = loopModel.getSocialSecurityMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getSocialSecurityMonth());
+            BigDecimal housingFundMonth = loopModel.getHousingFundMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getHousingFundMonth());
+            BigDecimal returnTaxMonth = loopModel.getReturnTaxMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getReturnTaxMonth());
+            if (loopModel.getKeepAccountStartMonth() != null && loopModel.getKeepAccountEndMonth() != null) {
+                Calendar startCalendar = Calendar.getInstance();
+                startCalendar.setTime(loopModel.getKeepAccountStartMonth());
+                Calendar endCalendar = Calendar.getInstance();
+                endCalendar.setTime(loopModel.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 = loopModel.getKeepAccountFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getKeepAccountFreeMonth());
+                if (totalMonthsBetween != keepAccountMonth.add(keeFreeMonth).intValue()) {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append(company.getName() + "的代理记账服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+                    continue;
+                }
+
+            }
+            if (loopModel.getSocialSecurityStartMonth() != null && loopModel.getSocialSecurityEndMonth() != null) {
+                Calendar startCalendar2 = Calendar.getInstance();
+                startCalendar2.setTime(loopModel.getSocialSecurityStartMonth());
+                Calendar endCalendar2 = Calendar.getInstance();
+                endCalendar2.setTime(loopModel.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 = loopModel.getSocialSecurityFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getSocialSecurityFreeMonth());
+                if (totalMonthsBetween2 != securityMonth.add(socialSecurityMonth).intValue()) {
+                    failureNum++;
+
+                    failureMsg.append("<br/>").append(failureNum).append(company.getName() + "的社保代缴服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+                    continue;
+                }
+            }
+
+
+            if (loopModel.getHousingFundStartMonth() != null && loopModel.getHousingFundEndMonth() != null) {
+                Calendar startCalendar3 = Calendar.getInstance();
+                startCalendar3.setTime(loopModel.getHousingFundStartMonth());
+                Calendar endCalendar3 = Calendar.getInstance();
+                endCalendar3.setTime(loopModel.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 = loopModel.getHousingFundFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getHousingFundFreeMonth());
+                if (totalMonthsBetween3 != housingFundMonth.add(housingFundMonths).intValue()) {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append(company.getName() + "的公积金服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+                    continue;
+                }
+            }
+
+            if (loopModel.getReturnTaxStartMonth() != null && loopModel.getReturnTaxEndMonth() != null) {
+                Calendar startCalendar4 = Calendar.getInstance();
+                startCalendar4.setTime(loopModel.getReturnTaxStartMonth());
+                Calendar endCalendar4 = Calendar.getInstance();
+                endCalendar4.setTime(loopModel.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 = loopModel.getReturnTaxFreeMonth() == null ? BigDecimal.ZERO : BigDecimal.valueOf(loopModel.getReturnTaxFreeMonth());
+                if (totalMonthsBetween4 != returnTaxMonth.add(returnTaxFreeMonth).intValue()) {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append(company.getName() + "的返税申报服务的服务月数+赠送月数跟结束月-开始月的时间不等,请检查数据");
+                    continue;
+                }
+            }
+
+            if (nameCountMap.get(loopModel.getContractNo()) > 1L) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("导入的合同编号 ").append(loopModel.getContractNo()).append("不能重复");
+                continue;
+            }
+            if (contNOs.contains(loopModel.getContractNo())) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("合同编号 ").append(loopModel.getContractNo()).append("已存在不能重复导入");
+                continue;
+            }
+            //update 6/12 加单条优惠才为当月总金额
+            if (keepAccount.add(keepFreeAccount).compareTo(keepAccountPrice.multiply(keepAccountMonth)) != 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(" 记账总金额计算值与记账单价不符。");
+                continue;
+            }
+            if (security.add(securityFree).compareTo(securityPrice.multiply(securityMonth)) != 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(" 社保总金额计算值与社保单价不符。");
+                continue;
+            }
+            if (housingFund.add(housingFundFree).compareTo(housingFundPrice.multiply(housingFundMonth)) != 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(" 公积金总金额计算值与公积金单价不符。");
+                continue;
+            }
+            if (returnTax.add(returnTaxFree).compareTo(returnTaxMonth.multiply(returnTaxPrice)) != 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(loopModel.getContractNo()).append(" 返税总金额计算值与返税单价不符。");
+                continue;
+            }
+            archiveInput.setSignerId(user != null ? user.getUserId() : null);
+            archiveInput.setContractType("新签".equals(loopModel.getOrderType()) ? 0 : "续签".equals(loopModel.getOrderType()) ? 1 : 3);
+            archiveInput.setServiceType(1);
+            archiveInput.setTenantId(tenantId);
+            archiveInput.setId(snowflakeIdWorker.nextId());
+            archiveInput.setStatus(1);
+            archiveInput.setVerifyStatus(1);
+            archiveInput.setRemark(loopModel.getRemark());
+            String sourceName = loopModel.getSourceName();
+            String sourceCategory = loopModel.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;
+                }
+            }
+            archiveInputs.add(archiveInput);
+
+            if ("是".equals(loopModel.getKeepAccount())) {
+                BizArchiveInputDetailUpdate detail = new BizArchiveInputDetailUpdate();
+                detail.setTaskTypeId(1L);
+                detail.setAmount(loopModel.getKeepAccountAmount());
+                //update 6/12
+                detail.setDiscountAmount(loopModel.getKeepAccountFreeAmount());
+                detail.setPrice(loopModel.getKeepAccountPrice());
+                detail.setServiceNum(loopModel.getKeepAccountMonth());
+                detail.setFreeNum(loopModel.getKeepAccountFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setStartMonth(loopModel.getKeepAccountStartMonth());
+                detail.setEndMonth(loopModel.getKeepAccountEndMonth());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                inputDetailList.add(detail);
+            }
+            if ("是".equals(loopModel.getSocialSecurity())) {
+                BizArchiveInputDetailUpdate detail = new BizArchiveInputDetailUpdate();
+                detail.setTaskTypeId(2L);
+                detail.setAmount(loopModel.getSocialSecurityAmount());
+                detail.setDiscountAmount(loopModel.getSocialSecurityFreeAmount());
+                detail.setPrice(loopModel.getSocialSecurityPrice());
+                detail.setServiceNum(loopModel.getSocialSecurityMonth());
+                detail.setFreeNum(loopModel.getSocialSecurityFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setStartMonth(loopModel.getSocialSecurityStartMonth());
+                detail.setEndMonth(loopModel.getSocialSecurityEndMonth());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                inputDetailList.add(detail);
+            }
+            if ("是".equals(loopModel.getHousingFund())) {
+                BizArchiveInputDetailUpdate detail = new BizArchiveInputDetailUpdate();
+                detail.setTaskTypeId(3L);
+                detail.setAmount(loopModel.getHousingFundAmount());
+                detail.setPrice(loopModel.getHousingFundPrice());
+                detail.setDiscountAmount(loopModel.getHousingFundFreeAmount());
+                detail.setServiceNum(loopModel.getHousingFundMonth());
+                detail.setFreeNum(loopModel.getHousingFundFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setStartMonth(loopModel.getHousingFundStartMonth());
+                detail.setEndMonth(loopModel.getHousingFundEndMonth());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                inputDetailList.add(detail);
+            }
+            if ("是".equals(loopModel.getReturnTax())) {
+                BizArchiveInputDetailUpdate detail = new BizArchiveInputDetailUpdate();
+                detail.setTaskTypeId(4L);
+                detail.setAmount(loopModel.getReturnTaxAmount());
+                detail.setDiscountAmount(loopModel.getReturnTaxFreeAmount());
+                detail.setPrice(loopModel.getReturnTaxPrice());
+                detail.setServiceNum(loopModel.getReturnTaxMonth());
+                detail.setFreeNum(loopModel.getReturnTaxFreeMonth());
+                detail.setContractId(archiveInput.getId());
+                detail.setCompanyId(archiveInput.getCompanyId());
+                detail.setStartMonth(loopModel.getReturnTaxStartMonth());
+                detail.setEndMonth(loopModel.getReturnTaxEndMonth());
+                detail.setId(snowflakeIdWorker.nextId());
+                detail.setTenantId(tenantId);
+                inputDetailList.add(detail);
+            }
+
+            archiveInput.setDetails(inputDetailList);
+
+            successNum++;
+            successMsg.append("<br/>").append(successNum).append("、订单 ").append(archiveInput.getContractNo()).append(" 导入成功");
+        }
+
+        super.saveBatch(archiveInputs);
+        bizArchiveInputDetailUpdateService.saveBatch(inputDetailList);
+
+        archiveInputs.stream().forEach(archiveInput -> {
+            archiveInput.setDetails(inputDetailList.stream()
+                    .filter(detail -> Objects.equals(detail.getContractId(), archiveInput.getId())).collect(Collectors.toList()));
+        });
+        return archiveInputs;
+    }
+
+    @Override
+    public String importLoop(List<OrderExcelImportLoopModel> orderList, Long userId, long tenantId) {
+
+
+        List<BizArchiveInputUpdate> archiveInputList = this.createImportArchiveInput(orderList, tenantId);
+        if(archiveInputList.isEmpty()){
+            return failureMsg.toString();
+        }
+        archiveInputList = this.resetOldContract(tenantId, archiveInputList);
+        importarchiveinput(tenantId, archiveInputList);
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            return failureMsg.toString();
+//            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
+    private List<BizArchiveInputUpdate> resetOldContract(long tenantId, List<BizArchiveInputUpdate> archiveInputList) {
+
+        List<BizArchiveInputUpdate> resultList = new ArrayList<>(archiveInputList);
+
+        // 重新导入的合同
+        Set<Long> reloopContractIdList = new HashSet<>();
+        for (BizArchiveInputUpdate inputUpdate : archiveInputList) {
+            Long companyId = inputUpdate.getCompanyId();
+            List<BizArchiveInputDetailUpdate> inputDetailList = bizArchiveInputDetailUpdateService
+                    .lambdaQuery()
+                    .eq(BizArchiveInputDetailUpdate::getContractId, inputUpdate.getId())
+                    .list();
+            List<Long> taskidList = inputDetailList.stream()
+                    .map(BizArchiveInputDetailUpdate::getTaskTypeId)
+                    .collect(Collectors.toList());
+
+            List<BizArchiveInputDetailUpdate> bizArchiveInputDetailUpdateList= bizArchiveInputDetailUpdateService.lambdaQuery()
+                    .eq(BizArchiveInputDetailUpdate::getCompanyId, companyId)
+                    .in(BizArchiveInputDetailUpdate::getTaskTypeId, taskidList)
+                    .list();
+            List<Long> contractIds = bizArchiveInputDetailUpdateList.stream()
+                    .map(BizArchiveInputDetailUpdate::getContractId).collect(Collectors.toList());
+            reloopContractIdList.addAll(contractIds);
+        }
+
+        if (!reloopContractIdList.isEmpty()) {
+            //删除工单详细表
+            List<BizWorkOrderDetailUpdate> workOrderUpdateList = workOrderDetailUpdateService.lambdaQuery()
+                    .in(BizWorkOrderDetailUpdate::getContractId, reloopContractIdList).list();
+            if(!workOrderUpdateList.isEmpty()){
+                workOrderDetailUpdateService.physicalDelete(workOrderUpdateList);
+            }
+            //删除工单表
+            List<Long> workOrderId = workOrderUpdateList.stream().map(BizWorkOrderDetailUpdate::getWorkOrderId).collect(Collectors.toList());
+            if(!workOrderId.isEmpty()){
+                workOrderUpdateService.physicalDelete(workOrderId);
+            }
+            resultList = bizArchiveInputTempMapper.selectBatchIds(reloopContractIdList);
+//                    .in(BizArchiveInputUpdate::getId, reloopContractIdList).list();
+            //resultList.addAll(reloopContractList);
+        }
+        return resultList;
+    }
+
+    private void importarchiveinput(long tenantId, List<BizArchiveInputUpdate> archiveInputList) {
+
+        List<Long> contractId = archiveInputList.stream().map(BizArchiveInputUpdate::getId).collect(Collectors.toList());
+        List<BizArchiveInputDetailUpdate> allInputDetailList = bizArchiveInputDetailUpdateService
+                .lambdaQuery()
+                .in(BizArchiveInputDetailUpdate::getContractId, contractId)
+                .list();
+        List<BizArchiveInputDetailUpdate> InputDetailList = allInputDetailList.stream().sorted(Comparator.comparing(BizArchiveInputDetailUpdate::getStartMonth)).collect(Collectors.toList());
+
+        //分组数据
+        List<OrderExcelImportLoopGroupModel> groupList = new ArrayList<>();
+
+        for (BizArchiveInputDetailUpdate bizArchiveInputDetailUpdate : InputDetailList) {
+            Long companyId = bizArchiveInputDetailUpdate.getCompanyId();
+            int index = -1;
+            for (int i = 0; i < groupList.size(); i++) {
+                //分组 如果
+                if (groupList.get(i).getCompanyId().equals(companyId)
+                        && groupList.get(i).getTaskTypeId().equals(bizArchiveInputDetailUpdate.getTaskTypeId())
+                        && groupList.get(i).isIncludeModel(bizArchiveInputDetailUpdate)) {
+                    index = i;
+                    break;
+                }
+            }
+            if (index >= 0) {
+                groupList.get(index).addModel(bizArchiveInputDetailUpdate);
+            } else {
+                OrderExcelImportLoopGroupModel groupModel = new OrderExcelImportLoopGroupModel();
+                groupModel.setCompanyId(companyId);
+                groupModel.setTaskTypeId(bizArchiveInputDetailUpdate.getTaskTypeId());
+                groupModel.addModel(bizArchiveInputDetailUpdate);
+                groupList.add(groupModel);
+            }
+        }
+
+        //最后需要保存的工单表list
+        List<BizWorkOrderUpdate> workOrderUpdates = new ArrayList<>();
+        List<BizWorkOrderDetailUpdate> workOrderDetailUpdates = new ArrayList<>();
+        // 处理
+        for (OrderExcelImportLoopGroupModel groupModel : groupList) {
+
+            // 如果没查到, 新建
+            BizWorkOrder workOrder = null;
+            BizWorkOrderUpdate workOrderUpdate = null;
+            List<BizWorkOrder> workOrders = workOrderService.query()
+                    .eq("company_id", groupModel.getCompanyId())
+                    .eq("task_type_id", groupModel.getTaskTypeId())
+                    .ge("start_month", groupModel.getStartMonth())
+                    .le("start_month", groupModel.getEndMonth())
+                    .list(); // 根据company_id + task_type_id + start_month包含在group_start...end
+            if (!workOrders.isEmpty()) {
+                workOrder = workOrders.get(0);
+            }
+
+            if (null != workOrder) {
+                workOrderUpdate = new BizWorkOrderUpdate();
+                BeanUtils.copyProperties(workOrder, workOrderUpdate);
+                workOrderUpdate.setSourceWorkOrderId(workOrder.getId());
+                workOrderUpdate.setIsNew(0);
+            } else {
+                workOrderUpdate = new BizWorkOrderUpdate();
+                workOrderUpdate.setTenantId(tenantId);
+                workOrderUpdate.setCompanyId(groupModel.getCompanyId());
+                workOrderUpdate.setTaskTypeId(groupModel.getTaskTypeId());
+                workOrderUpdate.setId(snowflakeIdWorker.nextId());
+                workOrderUpdate.setIsNew(1);
+            }
+
+            workOrderUpdate.setStartMonth(groupModel.getStartMonth());
+            workOrderUpdate.setEndMonth(groupModel.getEndMonth());
+            workOrderUpdate.setMonthNum(groupModel.getMonthNum());
+
+            workOrderUpdate.setContractId(groupModel.getModelList().get(0).getContractId());
+            workOrderUpdate.setContractDetailId(groupModel.getModelList().get(0).getId());
+
+            // TODO: 根据当前时间
+            Date date = new Date();
+            if (0 > date.compareTo(groupModel.getEndMonth())) {
+                workOrderUpdate.setIsStop(0);
+            } else {
+                workOrderUpdate.setIsStop(1);
+            }
+
+            workOrderUpdates.add(workOrderUpdate);
+
+            List<BizWorkOrderDetail> existWorkOrderDetailList = new ArrayList<>();
+            if (workOrderUpdate.getSourceWorkOrderId() != null) {
+                // 从数据库查找工单明细
+                existWorkOrderDetailList = workOrderDetailService.query()
+                        .eq("work_order_id", workOrderUpdate.getId())
+                        .list();
+            }
+
+            for (int i = 0; i < groupModel.getModelList().size(); i++) {
+
+                BizArchiveInputDetailUpdate inputDetail = groupModel.getModelList().get(i);
+
+                // 工单明细
+                BizWorkOrderDetailUpdate workOrderDetailUpdate = new BizWorkOrderDetailUpdate();
+
+                if (!existWorkOrderDetailList.isEmpty()) {
+                    BizWorkOrderDetail workOrderDetail = existWorkOrderDetailList.get(0);
+                    BeanUtils.copyProperties(workOrderDetail, workOrderDetailUpdate);
+                    workOrderDetailUpdate.setId(workOrderDetail.getId());
+                    existWorkOrderDetailList.remove(0);
+                } else {
+                    workOrderDetailUpdate = new BizWorkOrderDetailUpdate();
+                    workOrderDetailUpdate.setId(snowflakeIdWorker.nextId());
+                    workOrderDetailUpdate.setTenantId(tenantId);
+                    workOrderDetailUpdate.setCompanyId(groupModel.getCompanyId());
+                    workOrderDetailUpdate.setTaskTypeId(groupModel.getTaskTypeId());
+                }
+
+                workOrderDetailUpdate.setWorkOrderId(workOrderUpdate.getId());
+                workOrderDetailUpdate.setContractDetailId(inputDetail.getId());
+                workOrderDetailUpdate.setContractId(inputDetail.getContractId());
+                workOrderDetailUpdate.setContractDetailId(inputDetail.getId());
+                workOrderDetailUpdate.setFreeNum(inputDetail.getFreeNum());
+                workOrderDetailUpdate.setServiceNum(inputDetail.getServiceNum());
+                workOrderDetailUpdates.add(workOrderDetailUpdate);
+            }
+
+        }
+
+        workOrderUpdateService.saveBatch(workOrderUpdates);
+        workOrderDetailUpdateService.saveBatch(workOrderDetailUpdates);
+    }
+
+    @Override
+    public List<BizArchiveInputUpdate> getListByInput(InputVo bizArchiveInput) {
+        return bizArchiveInputTempMapper.getListByInput(bizArchiveInput);
+    }
+
+    public boolean deleteArchiveInput(Long tenantId, Long inputId) {
+        // 找到跟要删除的合同 -> 相同的 company_id和task_type -> 合同明细 -> 合同列表
+        // 4个表全部真删除
+        // 移除当前删除
+        // 如果删除完 isNotEmpty
+        Long companyId = 0L;
+        BizArchiveInputUpdate inputUpdate = this.query().eq("id", inputId).one();
+        companyId = inputUpdate.getCompanyId();
+        List<BizArchiveInputDetailUpdate> inputDetailList = bizArchiveInputDetailUpdateService
+                .lambdaQuery()
+                .eq(BizArchiveInputDetailUpdate::getContractId, inputUpdate.getId())
+                .list();
+
+
+        List<Long> taskidList = inputDetailList.stream()
+                .map(BizArchiveInputDetailUpdate::getTaskTypeId)
+                .collect(Collectors.toList());
+
+        List<BizArchiveInputDetailUpdate> bizArchiveInputDetailUpdateList= bizArchiveInputDetailUpdateService.lambdaQuery()
+                .eq(BizArchiveInputDetailUpdate::getCompanyId, companyId)
+                .in(BizArchiveInputDetailUpdate::getTaskTypeId, taskidList)
+                .list();
+        List<Long> contractIds = bizArchiveInputDetailUpdateList.stream()
+                .map(BizArchiveInputDetailUpdate::getContractId).collect(Collectors.toList());
+
+        List<BizArchiveInputUpdate> inputUpdates = this.query()
+                .in("id", contractIds)
+                .ne("id", inputId)
+                .list();
+        for(BizArchiveInputUpdate archiveInputUpdate : inputUpdates){
+            archiveInputUpdate.setDetails(bizArchiveInputDetailUpdateList.stream()
+                    .filter(l->l.getContractId().equals(archiveInputUpdate.getId())).collect(Collectors.toList()));
+        }
+        //删除合同详细表
+        BizArchiveInputDetailUpdate delDetail = new BizArchiveInputDetailUpdate();
+        delDetail.setContractId(inputUpdate.getId());
+        bizArchiveInputDetailUpdateService.physicalDelete(delDetail);
+        //删除合同表
+        bizArchiveInputTempMapper.physicalDelete(inputUpdate);
+        //删除工单详细表
+        List<BizWorkOrderDetailUpdate> workOrderUpdateList = workOrderDetailUpdateService.lambdaQuery()
+                .in(BizWorkOrderDetailUpdate::getContractId, contractIds).list();
+        workOrderDetailUpdateService.physicalDelete(workOrderUpdateList);
+        //删除工单表
+        List<Long> workOrderId = workOrderUpdateList.stream().map(BizWorkOrderDetailUpdate::getWorkOrderId).collect(Collectors.toList());
+        workOrderUpdateService.physicalDelete(workOrderId);
+
+        //调用保存工单逻辑,删除合同后,原先连续的工单关联的合同id会缺失(并且会把工单和工单详情从表里真删掉),所以在删除之后需要从新调用保存工单逻辑
+        importarchiveinput(tenantId, inputUpdates);
+        return true;
+    }
+}

+ 54 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizWorkOrderDetailUpdateServiceImpl.java

@@ -0,0 +1,54 @@
+package cn.ezhizao.project.business.upgrade.service.impl;
+
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.Resource;
+
+import cn.ezhizao.project.business.upgrade.mapper.BizWorkOrderDetailUpdateMapper;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderDetail;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderDetailUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderDetailUpdateService;
+
+/**
+ * 企业租户Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+@Service
+public class BizWorkOrderDetailUpdateServiceImpl  extends ServiceImpl<BizWorkOrderDetailUpdateMapper, BizWorkOrderDetailUpdate> implements IBizWorkOrderDetailUpdateService
+{
+    @Resource
+    private BizWorkOrderDetailUpdateMapper bizWorkOrderDetailUpdateMapper;
+
+    /**
+     * 查询企业租户列表
+     *
+     * @param bizWorkOrderDetailUpdate 企业租户
+     * @return 企业租户
+     */
+    @Override
+    public List<BizWorkOrderDetailUpdate> getList(BizWorkOrderDetailUpdate bizWorkOrderDetailUpdate)
+    {
+        return bizWorkOrderDetailUpdateMapper.getList(bizWorkOrderDetailUpdate);
+    }
+
+    /**
+     * 物理删除
+     * @param bizWorkOrderDetailUpdate
+     * @return 删除结果
+     */
+    @Override
+    public int physicalDelete(List<BizWorkOrderDetailUpdate> bizWorkOrderDetailUpdate){ return bizWorkOrderDetailUpdateMapper.physicalDelete(bizWorkOrderDetailUpdate); }
+
+    @Override
+    public List<BizWorkOrderDetail> selectByUpgradeId(BizWorkOrderDetail bizWorkOrderDetail) {
+        return bizWorkOrderDetailUpdateMapper.selectByUpgradeId(bizWorkOrderDetail);
+    }
+
+    ;
+
+}

+ 84 - 0
src/main/java/cn/ezhizao/project/business/upgrade/service/impl/BizWorkOrderUpdateServiceImpl.java

@@ -0,0 +1,84 @@
+package cn.ezhizao.project.business.upgrade.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.Resource;
+
+import cn.ezhizao.project.business.upgrade.mapper.BizWorkOrderDetailUpdateMapper;
+import cn.ezhizao.project.business.upgrade.mapper.BizWorkOrderUpdateMapper;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrder;
+import cn.ezhizao.project.business.workOrder.domain.BizWorkOrderDetail;
+import cn.ezhizao.project.business.workOrder.service.impl.BizWorkOrderDetailServiceImpl;
+import cn.ezhizao.project.business.workOrder.service.impl.BizWorkOrderServiceImpl;
+import cn.ezhizao.project.system.domain.SysUser;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate;
+import cn.ezhizao.project.business.upgrade.service.IBizWorkOrderUpdateService;
+
+/**
+ * 企业租户Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2024-10-14
+ */
+@Service
+public class BizWorkOrderUpdateServiceImpl  extends ServiceImpl<BizWorkOrderUpdateMapper, BizWorkOrderUpdate> implements IBizWorkOrderUpdateService
+{
+    @Resource
+    private BizWorkOrderUpdateMapper bizWorkOrderUpdateMapper;
+    @Resource
+    private BizWorkOrderServiceImpl bizWorkOrderService;
+    @Resource
+    private BizWorkOrderDetailServiceImpl bizWorkOrderDetailService;
+    @Autowired
+    private BizWorkOrderDetailUpdateServiceImpl bizWorkOrderDetailUpdateService;
+
+    /**
+     * 查询企业租户列表
+     *
+     * @param bizWorkOrderUpdate 企业租户
+     * @return 企业租户
+     */
+    @Override
+    public List<BizWorkOrderUpdate> getList(BizWorkOrderUpdate bizWorkOrderUpdate)
+    {
+        return bizWorkOrderUpdateMapper.getList(bizWorkOrderUpdate);
+    }
+    /**
+     * 物理删除
+     * @param  ids
+     * @return 删除结果
+     */
+    @Override
+    public int physicalDelete(List<Long> ids) {
+        return bizWorkOrderUpdateMapper.physicalDelete(ids);
+    }
+
+
+    @Override
+    public List<BizWorkOrderUpdate> getList2(BizWorkOrderUpdate bizWorkOrder) {
+        return bizWorkOrderUpdateMapper.getList2(bizWorkOrder);
+    }
+
+    @Override
+    public List<BizWorkOrderUpdate> gettoUpLoadList(BizWorkOrderUpdate bizWorkOrder) {
+        return bizWorkOrderUpdateMapper.gettoUpLoadList(bizWorkOrder);
+    }
+
+    @Override
+    public void workerUpgrade(List<BizWorkOrder> waitingForUpgradingList, Long tenantId) {
+
+        BizWorkOrder query = new BizWorkOrder();
+        query.setTenantId(tenantId);
+        BizWorkOrderDetail query2 = new BizWorkOrderDetail();
+        query2.setTenantId(tenantId);
+        //从BizWorkOrderUpdate中获取获取同账套下的工单 并且不用BizWorkOrderUpdate接受,改用BizWorkOrder 保存时不用赋值了
+        List<BizWorkOrder> bizWorkOrderList = bizWorkOrderUpdateMapper.selectByUpgradeId(query);
+        List<BizWorkOrderDetail> bizWorkOrderDetailList = bizWorkOrderDetailUpdateService.selectByUpgradeId(query2);
+        bizWorkOrderService.saveOrUpdateBatch(bizWorkOrderList);
+        bizWorkOrderDetailService.saveOrUpdateBatch(bizWorkOrderDetailList);
+    }
+}

+ 75 - 0
src/main/resources/mybatis/business/BizArchiveInputDetailUpdateMapper.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.ezhizao.project.business.upgrade.mapper.BizArchiveInputDetailUpdateMapper">
+    <resultMap type="cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate"
+               id="BizArchiveInputDetailUpdateResult">
+        <id column="id" property="id"/>
+    </resultMap>
+    <resultMap type="cn.ezhizao.project.business.upgrade.domain.BizArchiveInputDetailUpdate" id="BizArchiveInputDetailResult">
+        <id column="id" property="id"/>
+    </resultMap>
+
+    <select id="getList" parameterType="BizArchiveInputDetailUpdate" resultMap="BizArchiveInputDetailResult">
+        SELECT t1.*, t2.name as task_type_name, t2.pay_address,t3.dict_label as regionName,t4.dict_label as
+        fictionAddress
+        FROM biz_archive_input_detail_update t1
+        left join biz_task_type t2 on t2.id = t1.task_type_id
+        left join sys_dict_data t3 on t1.belong_region = t3.dict_code
+        left join sys_dict_data t4 on t1.fiction_address_id = t4.dict_code
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            t1.deleted = 0
+            <if test="companyId != null ">
+                AND t1.company_id = #{companyId}
+            </if>
+            <if test="contractId != null ">
+                AND t1.contract_id = #{contractId}
+            </if>
+            <if test="serviceNum != null ">
+                AND t1.service_num = #{serviceNum}
+            </if>
+            <if test="price != null ">
+                AND t1.price = #{price}
+            </if>
+            <if test="amount != null ">
+                AND t1.amount = #{amount}
+            </if>
+        </trim>
+    </select>
+    <select id="getDetail" parameterType="BizArchiveInputDetailUpdate" resultMap="BizArchiveInputDetailResult">
+        SELECT *
+        FROM biz_archive_input_detail_update
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            deleted = 0
+            <if test="contractId != null ">
+                AND contract_id = #{contractId}
+            </if>
+            <if test="taskTypeId != null ">
+                AND task_type_id = #{taskTypeId}
+            </if>
+            <if test="fromId  !=  null ">
+                AND from_id = #{fromId}
+            </if>
+            <if test="companyId  !=  null ">
+                AND company_id = #{companyId}
+            </if>
+        </trim>
+    </select>
+    <delete id="physicalDelete">
+        DELETE FROM biz_archive_input_detail_update
+        <where>
+            AND contract_id = #{contractId}
+        </where>
+        <!-- 删除条件为其他外键可以在这里加 -->
+    </delete>
+    <select id="selectByTaskIdAndCompanyId" resultType="java.lang.Long">
+        select contract_id from biz_archive_input_detail_update t1
+        left join biz_archive_input_update t2 on t1.contract_id = t1.id
+        where t2.company_id = #{companyId}
+        and t1.task_type_id in
+        <foreach item="taskId" index="index" collection="taskIds" open="(" separator="," close=")">
+            #{taskId}
+        </foreach>
+    </select>
+</mapper>

+ 227 - 0
src/main/resources/mybatis/business/BizArchiveInputTempMapper.xml

@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.ezhizao.project.business.upgrade.mapper.BizArchiveInputTempMapper">
+    <resultMap type="cn.ezhizao.project.business.upgrade.domain.BizArchiveInputUpdate" id="BizArchiveInputResult">
+        <id column="id" property="id"/>
+        <result column="source_id" property="sourceId"/>
+        <result column="referrer_data_source" property="referrerDataSource"/>
+        <association property="sourceName"
+                     column="{ source_id = source_id, referrer_data_source = referrer_data_source }"
+                     select="getSourceName"/>
+        <association property="alterNumber" column="{ id = id, from_id = from_id }" select="getAlterNumber"/>
+    </resultMap>
+
+    <resultMap type="cn.ezhizao.project.business.upgrade.domain.BizArchiveInputUpdate" id="BizArchiveInputDetailResult">
+        <id column="id" property="id"/>
+        <collection property="details" select="getdetails" column="id" />
+    </resultMap>
+
+    <select id="getdetails" resultMap="BizArchiveInputDetailResult">
+        select *
+        from biz_archive_input_detail_update
+        where contract_id = #{id}
+    </select>
+
+    <select id="selectBatchIds" resultMap="BizArchiveInputDetailResult">
+        select * from biz_archive_input_update where id in
+        <foreach item="id" index="index" collection="coll" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+
+    </select>
+    <select id="getSourceName" resultType="java.lang.String">
+        <if test="referrer_data_source == null">
+            select '' as name
+        </if>
+        <if test="referrer_data_source == 'company'">
+            select name from biz_company where biz_company.id = #{source_id}
+        </if>
+        <if test="referrer_data_source == 'employee'">
+            select nick_name from sys_user where sys_user.user_id = #{source_id}
+        </if>
+        <if test="referrer_data_source == 'channel'">
+            select name from biz_channel where biz_channel.id = #{source_id}
+        </if>
+        <if test="referrer_data_source == ''">
+            select '' as name
+        </if>
+    </select>
+
+    <select id="getAlterNumber" resultType="java.lang.Integer">
+        select count(1) from biz_archive_input_update t where t.deleted = 0
+        <if test="from_id == 0">
+            and t.from_id = #{id}
+        </if>
+        <if test="from_id != 0">
+            and t.from_id = #{from_id} or t.id = #{from_id}
+        </if>
+    </select>
+
+    <select id="getList" parameterType="InputVo" resultMap="BizArchiveInputResult">
+        SELECT
+        t1.*,
+        t2.name as company_name,
+        t2.social_credit_code as social_credit_code,
+        t3.nick_name as signer_name,
+        t4.title as source_category_name,
+        t4.referrer_data_source
+        FROM biz_archive_input_update t1
+        left join biz_company t2 on t2.id = t1.company_id
+        left join sys_user t3 on t3.user_id = t1.signer_id
+        left join biz_source t4 on t4.id = t1.source_category_id
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            t1.deleted = 0
+            <if test="fromId != null">AND (t1.from_id = #{fromId} or t1.id = #{fromId})</if>
+            <if test="id != null  and id != ''">AND t1.id = #{id}</if>
+            <if test="companyName != null  and companyName != ''">AND t2.name like concat("%", #{companyName}, "%")</if>
+            <if test="archiveTypeId != null">and archive_type_id = #{archiveTypeId}</if>
+            <if test="companyId != null  and companyId != ''">AND t1.company_id = #{companyId}</if>
+            <if test="archiveCode != null  and archiveCode != ''">AND t1.archive_code = #{archiveCode}</if>
+            <if test="startMonth != null ">AND t1.start_month = #{startMonth}</if>
+            <if test="endMonth != null ">AND t1.end_month = #{endMonth}</if>
+            <if test="proofUrl != null  and proofUrl != ''">AND t1.proof_url = #{proofUrl}</if>
+            <if test="contractNo != null  and contractNo != ''">AND t1.contract_no = #{contractNo}</if>
+            <if test="formDate != null ">AND t1.form_date = #{formDate}</if>
+            <if test="amount != null ">AND t1.amount = #{amount}</if>
+            <if test="verifyStatus != null ">AND t1.verify_status = #{verifyStatus}</if>
+            <if test="contractType != null ">AND t1.contract_type = #{contractType}</if>
+            <if test="serviceType != null ">AND t1.service_type = #{serviceType}</if>
+            <if test="outputDate != null ">AND t1.output_date = #{outputDate}</if>
+            <if test="monthNum != null ">AND t1.month_num = #{monthNum}</if>
+            <if test="companyName != null and companyName != '' ">AND t2.name like concat('%', #{companyName}, '%')</if>
+            <if test="verifyRemark != null  and verifyRemark != ''">AND t1.verify_remark = #{verifyRemark}</if>
+            <if test="tenantId != null">AND t1.tenant_id = #{tenantId}</if>
+            <if test="isKeepAccount != null">AND <if test="isKeepAccount == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 1)
+            </if>
+            <if test="isSocialSecurity != null">AND <if test="isSocialSecurity == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 2)
+            </if>
+            <if test="isHousingFund != null">AND <if test="isHousingFund == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 3)
+            </if>
+            <if test="isReturnTax != null">AND <if test="isReturnTax == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 4)
+            </if>
+            <if test="isRegister != null">AND <if test="isRegister == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 5)
+            </if>
+            <if test="isAlter != null">AND <if test="isAlter == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 6)
+            </if>
+            <if test="isLogout != null">AND <if test="isLogout == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 7)
+            </if>
+            <if test="isQualified != null">AND <if test="isQualified == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 8)
+            </if>
+            <if test="isOther != null">AND <if test="isOther == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 9)
+            </if>
+
+        </trim>
+    </select>
+    <select id="getListByInput" parameterType="InputVo" resultMap="BizArchiveInputResult">
+        SELECT
+        t1.*,
+        t2.name as company_name,
+        t2.customer_label_id as customerLabelId,
+        t5.lable as customerLabelName,
+        t2.social_credit_code as social_credit_code,
+        t3.nick_name as signer_name,
+        t4.title as source_category_name,
+        t4.referrer_data_source
+        FROM biz_archive_input_update t1
+        left join biz_company t2 on t2.id = t1.company_id
+        left join sys_user t3 on t3.user_id = t1.signer_id
+        left join biz_source t4 on t4.id = t1.source_category_id
+        left join biz_lable t5 on t5.id = t2.customer_label_id
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            t1.deleted = 0
+            <if test="fromId != null">AND (t1.from_id = #{fromId} or t1.id = #{fromId})</if>
+            <if test="id != null  and id != ''">AND t1.id = #{id}</if>
+            <if test="contractNo!=null and contractNo != '' ">AND t1.contract_no like concat("%",#{contractNo}, "%")</if>
+            <if test="companyName != null  and companyName != ''">AND t2.name like concat("%", #{companyName}, "%")</if>
+            <if test="archiveTypeId != null">and archive_type_id = #{archiveTypeId}</if>
+            <if test="companyId != null  and companyId != ''">AND t1.company_id = #{companyId}</if>
+            <if test="archiveCode != null  and archiveCode != ''">AND t1.archive_code = #{archiveCode}</if>
+            <if test="startMonth != null ">AND t1.start_month = #{startMonth}</if>
+            <if test="endMonth != null ">AND t1.end_month = #{endMonth}</if>
+            <if test="proofUrl != null  and proofUrl != ''">AND t1.proof_url = #{proofUrl}</if>
+            <if test="boss != null  and boss != ''">AND  t1.boss like concat("%",#{boss}, "%")</if>
+            <if test="formDate!= null and formDate.size() ">
+                AND (
+                DATE_FORMAT(t1.form_date,'%Y-%m-%d') &gt;= #{formDate[0]}
+                AND
+                DATE_FORMAT(t1.form_date,'%Y-%m-%d') &lt;= #{formDate[1]}
+                )
+            </if>
+            <if test="amount != null ">AND t1.amount = #{amount}</if>
+            <if test="verifyStatus != null ">AND t1.verify_status = #{verifyStatus}</if>
+            <if test="contractType != null ">AND t1.contract_type = #{contractType}</if>
+            <if test="serviceType != null ">AND t1.service_type = #{serviceType}</if>
+            <if test="outputDate != null ">AND t1.output_date = #{outputDate}</if>
+            <if test="monthNum != null ">AND t1.month_num = #{monthNum}</if>
+            <if test="companyName != null and companyName != '' ">AND t2.name like concat('%', #{companyName}, '%')</if>
+            <if test="verifyRemark != null  and verifyRemark != ''">AND t1.verify_remark = #{verifyRemark}</if>
+            <if test="tenantId != null">AND t1.tenant_id = #{tenantId}</if>
+            <if test="isKeepAccount != null">AND <if test="isKeepAccount == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 1)
+            </if>
+            <if test="isSocialSecurity != null">AND <if test="isSocialSecurity == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 2)
+            </if>
+            <if test="isHousingFund != null">AND <if test="isHousingFund == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 3)
+            </if>
+            <if test="isReturnTax != null">AND <if test="isReturnTax == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 4)
+            </if>
+            <if test="isRegister != null">AND <if test="isRegister == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 5)
+            </if>
+            <if test="isAlter != null">AND <if test="isAlter == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 6)
+            </if>
+            <if test="isLogout != null">AND <if test="isLogout == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 7)
+            </if>
+            <if test="isQualified != null">AND <if test="isQualified == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 8)
+            </if>
+            <if test="isOther != null">AND <if test="isOther == 0">not</if> exists (select 1 from
+                biz_archive_input_update_detail t5 where t5.deleted = 0 and t5.contract_id = t1.id and t5.task_type_id = 9)
+            </if>
+            <if test="customerLabelId != null and customerLabelId.size() > 0">
+                AND t2.customer_label_id IN
+                <foreach collection="customerLabelId" index="index" item="item" separator="," open="(" close=")">
+                    #{item,jdbcType=BIGINT}
+                </foreach>
+            </if>
+
+        </trim>
+    </select>
+
+
+
+    <update id="removeByIds">
+        UPDATE biz_archive_input_update
+        SET deleted=1
+        WHERE id in
+        <foreach collection="ids" item="id" index="index" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <delete id="physicalDelete">
+        DELETE FROM biz_archive_input_update
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            <if test="id != null">
+                id = #{id} AND
+            </if>
+            <!-- 删除条件为其他外键可以在这里加 -->
+        </trim>
+    </delete>
+</mapper>

+ 70 - 0
src/main/resources/mybatis/business/BizWorkOrderDetailUpdateMapper.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.ezhizao.project.business.upgrade.mapper.BizWorkOrderDetailUpdateMapper">
+
+    <resultMap type="cn.ezhizao.project.business.upgrade.domain.BizWorkOrderDetailUpdate" id="BizWorkOrderDetailResult">
+        <id column="id" property="id"/>
+        <result column="contract_id" jdbcType="BIGINT" property="contractId"/>
+        <association property="totalityMoney" javaType="java.math.BigDecimal" select="getTotalityMoney" column="contract_id"/>
+        <association property="accountsReceivable" javaType="java.math.BigDecimal" select="getAccountsReceivable" column="contract_id"/>
+    </resultMap>
+
+
+    <select id="getList" parameterType="BizWorkOrderDetailUpdate" resultMap="BizWorkOrderDetailResult">
+        SELECT * FROM biz_work_order_detail_update
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            deleted = 0
+            <if test="id != null "> AND id = #{id}</if>
+            <if test="tenantId != null "> AND tenant_id = #{tenantId}</if>
+            <if test="workOrderId != null "> AND work_order_id = #{workOrderId}</if>
+            <if test="companyId != null "> AND company_id = #{companyId}</if>
+            <if test="contractDetailId != null "> AND contract_detail_id = #{contractDetailId}</if>
+            <if test="contractId != null "> AND contract_id = #{contractId}</if>
+            <if test="serviceNum != null "> AND service_num = #{serviceNum}</if>
+            <if test="freeNum != null "> AND free_num = #{freeNum}</if>
+        </trim>
+    </select>
+    <select id="selectByUpgradeId" parameterType="BizWorkOrderDetail" resultType="cn.ezhizao.project.business.workOrder.domain.BizWorkOrderDetail">
+        SELECT * FROM biz_work_order_detail_update
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            deleted = 0
+            <if test="id != null "> AND id = #{id}</if>
+            <if test="tenantId != null "> AND tenant_id = #{tenantId}</if>
+            <if test="workOrderId != null "> AND work_order_id = #{workOrderId}</if>
+            <if test="companyId != null "> AND company_id = #{companyId}</if>
+            <if test="contractDetailId != null "> AND contract_detail_id = #{contractDetailId}</if>
+            <if test="contractId != null "> AND contract_id = #{contractId}</if>
+            <if test="serviceNum != null "> AND service_num = #{serviceNum}</if>
+            <if test="freeNum != null "> AND free_num = #{freeNum}</if>
+        </trim>
+    </select>
+    <select id="getAccountsReceivable" resultType="java.math.BigDecimal">
+        SELECT true_amount FROM biz_archive_input_update
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            deleted= 0
+            <if test="contractId!= null "> AND id =#{contractId}</if>
+        </trim>
+    </select>
+
+    <select id="getTotalityMoney" resultType="java.math.BigDecimal">
+        SELECT SUM(arrive_amount)FROM biz_collection
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            deleted= 0
+            AND  status = 1
+            <if test="contractId!= null "> AND contract_id =#{contractId}</if>
+
+        </trim>
+    </select>
+
+    <delete id="physicalDelete">
+        DELETE FROM biz_work_order_detail_update
+        <where>
+            AND id  IN
+            <foreach item="item" index="index" collection="detailUpdateList" open="(" separator="," close=")">
+                #{item.id}
+            </foreach>
+        </where>
+    </delete>
+</mapper>

+ 154 - 0
src/main/resources/mybatis/business/BizWorkOrderUpdateMapper.xml

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.ezhizao.project.business.upgrade.mapper.BizWorkOrderUpdateMapper">
+
+    <resultMap type="cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate" id="BizWorkOrderUpdateResult">
+        <id column="id" property="id"/>
+    </resultMap>
+    <resultMap type="cn.ezhizao.project.business.upgrade.domain.BizWorkOrderUpdate" id="BizWorkOrderResult">
+        <id column="id" property="id"/>
+        <result column="company_id" jdbcType="BIGINT" property="companyId"/>
+        <collection property="records"   select="getRecords" column="id"/>
+    </resultMap>
+
+    <resultMap type="cn.ezhizao.project.business.workOrder.domain.BizWorkOrderRecord"
+               id="BizWorkOrderRecordResult">
+        <id column="id" property="id"/>
+    </resultMap>
+
+    <select id="getList" parameterType="BizWorkOrderUpdate" resultMap="BizWorkOrderUpdateResult">
+        SELECT * FROM biz_work_order_update
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            deleted = 0
+            <if test="type != null "> AND type = #{type}</if>
+            <if test="noContract != null "> AND no_contract = #{noContract}</if>
+            <if test="workOrderNo != null  and workOrderNo != ''"> AND work_order_no = #{workOrderNo}</if>
+            <if test="startMonth != null "> AND start_month = #{startMonth}</if>
+            <if test="endMonth != null "> AND end_month = #{endMonth}</if>
+            <if test="monthNum != null "> AND month_num = #{monthNum}</if>
+            <if test="isStop != null "> AND is_stop = #{isStop}</if>
+            <if test="provinceCode != null  and provinceCode != ''"> AND province_code = #{provinceCode}</if>
+            <if test="province != null  and province != ''"> AND province = #{province}</if>
+            <if test="cityCode != null  and cityCode != ''"> AND city_code = #{cityCode}</if>
+            <if test="city != null  and city != ''"> AND city = #{city}</if>
+            <if test="districtCode != null  and districtCode != ''"> AND district_code = #{districtCode}</if>
+            <if test="district != null  and district != ''"> AND district = #{district}</if>
+            <if test="isContinue != null "> AND is_continue = #{isContinue}</if>
+            <if test="hasImportTasks != null "> AND has_import_tasks = #{hasImportTasks}</if>
+        </trim>
+    </select>
+    <select id="getList2" parameterType="BizWorkOrderUpdate" resultMap="BizWorkOrderResult">
+        SELECT t1.*, t2.name as company_name, t2.social_credit_code, t3.name as task_type_name, t4.name as
+        task_type_detail_name, t5.nick_name as service_name, t2.is_zero,t2.tax_type FROM biz_work_order_update t1
+        left join biz_company t2 on t2.id = t1.company_id
+        left join biz_task_type t3 on t3.id = t1.task_type_id
+        left join biz_task_type_detail t4 on t4.id = t1.task_type_detail_id
+        left join sys_user t5 on t5.user_id = t1.service_id
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            t1.deleted = 0
+            <if test="id != null "> AND t1.id = #{id}</if>
+            <if test="contractDetailId != null "> AND t1.contract_detail_id = #{contractDetailId}</if>
+            <if test="tenantId != null "> AND t1.tenant_id = #{tenantId}</if>
+            <if test="companyId != null "> AND t1.company_id = #{companyId}</if>
+            <if test="type != null ">AND t1.type = #{type}</if>
+            <if test=" serviceId != null">AND t1.service_id = #{serviceId}</if>
+            <if test="noContract != null ">AND t1.no_contract = #{noContract}</if>
+            <if test="workOrderNo != null  and workOrderNo != ''">AND t1.work_order_no = #{workOrderNo}</if>
+            <if test="startMonth != null ">AND t1.start_month = #{startMonth}</if>
+            <if test="endMonth != null ">AND t1.end_month = #{endMonth}</if>
+            <if test="monthNum != null ">AND t1.month_num = #{monthNum}</if>
+            <if test="companyName != null and companyName != '' "> AND t2.name like concat('%', #{companyName}, '%')</if>
+            <if test="isStop != null ">AND t1.is_stop = #{isStop}</if>
+            <if test="year != null ">
+                AND t1.start_month > 0
+                <if test="month != null and month != ''">
+                    AND concat(#{year}, '-', #{month}, '-01') &gt;= (case when t1.task_type_id = 1 then DATE_ADD(t1.start_month, interval 1 month) else t1.start_month end) and concat(#{year}, '-', #{month}, '-01') &lt;= (case when t1.task_type_id = 1 then DATE_ADD(t1.end_month,interval 1 month) else t1.end_month end)
+                </if>
+                <if test="month == null or month == ''">
+                    AND #{year} >= (case when t1.task_type_id = 1 then DATE_FORMAT(DATE_ADD(t1.start_month,interval 1 month), '%Y') else DATE_FORMAT(t1.start_month, '%Y') end) AND #{year} &lt;= (case when t1.end_month = 0 then #{year} when t1.task_type_id = 1 then DATE_FORMAT(DATE_ADD(t1.end_month,interval 1 month), '%Y') else DATE_FORMAT(t1.end_month, '%Y') end)
+                </if>
+            </if>
+
+
+        </trim>
+    </select>
+    <select id="gettoUpLoadList" parameterType="BizWorkOrderUpdate" resultMap="BizWorkOrderResult">
+        SELECT t1.*, t2.name as company_name, t2.social_credit_code, t3.name as task_type_name, t4.name as
+        task_type_detail_name, t5.nick_name as service_name, t2.is_zero,t2.tax_type FROM biz_work_order t1
+        left join biz_company t2 on t2.id = t1.company_id
+        left join biz_work_order_update orderupdate on orderupdate.id = t1.id and orderupdate.deleted = 0
+        left join biz_task_type t3 on t3.id = t1.task_type_id
+        left join biz_task_type_detail t4 on t4.id = t1.task_type_detail_id
+        left join sys_user t5 on t5.user_id = t1.service_id
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            t1.deleted = 0 and t1.is_stop = 0 and orderupdate.id is null and t1.type = 1
+            <if test="id != null "> AND t1.id = #{id}</if>
+            <if test="contractDetailId != null "> AND t1.contract_detail_id = #{contractDetailId}</if>
+            <if test="tenantId != null "> AND t1.tenant_id = #{tenantId}</if>
+            <if test="companyId != null "> AND t1.company_id = #{companyId}</if>
+            <if test="type != null ">AND t1.type = #{type}</if>
+            <if test=" serviceId != null">AND t1.service_id = #{serviceId}</if>
+            <if test="workOrderNo != null  and workOrderNo != ''">AND t1.work_order_no = #{workOrderNo}</if>
+            <if test="startMonth != null ">AND t1.start_month = #{startMonth}</if>
+            <if test="endMonth != null ">AND t1.end_month = #{endMonth}</if>
+            <if test="monthNum != null ">AND t1.month_num = #{monthNum}</if>
+            <if test="companyName != null and companyName != '' "> AND t2.name like concat('%', #{companyName}, '%')</if>
+            <if test="isStop != null ">AND t1.is_stop = #{isStop}</if>
+            <if test="year != null ">
+                AND t1.start_month > 0
+                <if test="month != null and month != ''">
+                    AND concat(#{year}, '-', #{month}, '-01') &gt;= (case when t1.task_type_id = 1 then DATE_ADD(t1.start_month, interval 1 month) else t1.start_month end) and concat(#{year}, '-', #{month}, '-01') &lt;= (case when t1.task_type_id = 1 then DATE_ADD(t1.end_month,interval 1 month) else t1.end_month end)
+                </if>
+                <if test="month == null or month == ''">
+                    AND #{year} >= (case when t1.task_type_id = 1 then DATE_FORMAT(DATE_ADD(t1.start_month,interval 1 month), '%Y') else DATE_FORMAT(t1.start_month, '%Y') end) AND #{year} &lt;= (case when t1.end_month = 0 then #{year} when t1.task_type_id = 1 then DATE_FORMAT(DATE_ADD(t1.end_month,interval 1 month), '%Y') else DATE_FORMAT(t1.end_month, '%Y') end)
+                </if>
+            </if>
+
+
+        </trim>
+    </select>
+    <select id="selectByUpgradeId" resultType="cn.ezhizao.project.business.workOrder.domain.BizWorkOrder">
+        select * from biz_work_order_update t1
+        <where>
+                t1.deleted = 0 and t1.is_stop = 0 and t1.type = 1
+                <if test="id != null "> AND t1.id = #{id}</if>
+                <if test="contractDetailId != null "> AND t1.contract_detail_id = #{contractDetailId}</if>
+                <if test="tenantId != null "> AND t1.tenant_id = #{tenantId}</if>
+                <if test="companyId != null "> AND t1.company_id = #{companyId}</if>
+                <if test=" serviceId != null">AND t1.service_id = #{serviceId}</if>
+                <if test="workOrderNo != null  and workOrderNo != ''">AND t1.work_order_no = #{workOrderNo}</if>
+                <if test="startMonth != null ">AND t1.start_month = #{startMonth}</if>
+                <if test="endMonth != null ">AND t1.end_month = #{endMonth}</if>
+                <if test="monthNum != null ">AND t1.month_num = #{monthNum}</if>
+                <if test="companyName != null and companyName != '' "> AND t2.name like concat('%', #{companyName}, '%')</if>
+                <if test="isStop != null ">AND t1.is_stop = #{isStop}</if>
+                <if test="year != null ">
+                    AND t1.start_month > 0
+                    <if test="month != null and month != ''">
+                        AND concat(#{year}, '-', #{month}, '-01') &gt;= (case when t1.task_type_id = 1 then DATE_ADD(t1.start_month, interval 1 month) else t1.start_month end) and concat(#{year}, '-', #{month}, '-01') &lt;= (case when t1.task_type_id = 1 then DATE_ADD(t1.end_month,interval 1 month) else t1.end_month end)
+                    </if>
+                    <if test="month == null or month == ''">
+                        AND #{year} >= (case when t1.task_type_id = 1 then DATE_FORMAT(DATE_ADD(t1.start_month,interval 1 month), '%Y') else DATE_FORMAT(t1.start_month, '%Y') end) AND #{year} &lt;= (case when t1.end_month = 0 then #{year} when t1.task_type_id = 1 then DATE_FORMAT(DATE_ADD(t1.end_month,interval 1 month), '%Y') else DATE_FORMAT(t1.end_month, '%Y') end)
+                    </if>
+                </if>
+        </where>
+
+    </select>
+    <select id="getRecords" resultMap="BizWorkOrderRecordResult">
+        SELECT * FROM biz_work_order_record WHERE deleted = 0 AND work_order_id = #{id}
+    </select>
+    <delete id="physicalDelete">
+        DELETE FROM biz_work_order_update
+
+
+        <trim prefix=" WHERE" suffix="" suffixOverrides="AND">
+            id in
+            <foreach item="id" index="index" collection="ids" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+       <!-- 删除条件为其他外键可以在这里加 -->
+        </trim>
+    </delete>
+</mapper>