ezhizao_zx 1 жил өмнө
parent
commit
c5a2751817

+ 2 - 2
src/main/java/cn/ezhizao/project/business/account/controller/BizAccountController.java

@@ -76,7 +76,7 @@ public class BizAccountController extends BaseController
     /**
      * 新增银行账户
      */
-    @PreAuthorize("@ss.hasPermi('business:account:save')")
+    @PreAuthorize("@ss.hasPermi('business:account:add')")
     @Log(title = "银行账户", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody BizAccount bizAccount) throws NoSuchFieldException, IllegalAccessException
@@ -88,7 +88,7 @@ public class BizAccountController extends BaseController
     /**
      * 修改银行账户
      */
-    @PreAuthorize("@ss.hasPermi('business:account:save')")
+    @PreAuthorize("@ss.hasPermi('business:account:edit')")
     @Log(title = "银行账户", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody BizAccount bizAccount) throws NoSuchFieldException, IllegalAccessException

+ 50 - 12
src/main/java/cn/ezhizao/project/business/order/controller/BizArchiveInputController.java

@@ -1,17 +1,13 @@
 package cn.ezhizao.project.business.order.controller;
 
 import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
 import java.io.OutputStream;
-import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import javax.annotation.Resource;
-import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 
 import cn.ezhizao.common.exception.ServiceException;
@@ -20,7 +16,6 @@ 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.company.service.impl.BizCompanyServiceImpl;
 import cn.ezhizao.project.business.order.domain.*;
 import cn.ezhizao.project.business.order.service.IBizArchiveInputDetailProcessService;
 import cn.ezhizao.project.business.order.service.IBizArchiveInputDetailService;
@@ -30,15 +25,14 @@ import cn.ezhizao.project.business.taskType.service.IBizTaskTypeDetailService;
 import cn.ezhizao.project.business.taskType.service.IBizTaskTypeService;
 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.SysFileStorage;
 import cn.ezhizao.project.system.domain.SysUser;
 import cn.ezhizao.project.system.service.ISysFileStorageService;
 import cn.ezhizao.project.system.service.ISysUserService;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.poi.excel.ExcelWriter;
-import org.apache.commons.io.IOUtils;
-import org.checkerframework.checker.units.qual.A;
-import org.springframework.core.io.ClassPathResource;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
@@ -89,6 +83,8 @@ public class BizArchiveInputController extends BaseController {
     private IBizChannelService channelService;
     @Resource
     private ISysFileStorageService fileStorageService;
+    @Resource
+    private IBizWorkOrderService workOrderService;
 
     /**
      * 查询档案入库列表
@@ -183,7 +179,7 @@ public class BizArchiveInputController extends BaseController {
 
     @PreAuthorize("@ss.hasPermi('business:archive:order:verify')")
     @PostMapping("/verify")
-    @Log(title = "档案入库", businessType = BusinessType.UPDATE)
+    @Log(title = "档案审核", businessType = BusinessType.UPDATE)
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult verify(@RequestBody BizArchiveInput bizArchiveInput) {
         return toAjax(bizArchiveInputService.verify(bizArchiveInput));
@@ -282,7 +278,7 @@ public class BizArchiveInputController extends BaseController {
         List<BizArchiveInputDetail> changeList = new ArrayList<>();
         List<BizArchiveInputDetailProcess> changeProcess = new ArrayList<>();
         oldArchiveInput.getDetails().forEach(l -> {
-            if (newBizArchiveInput.getDetails().stream().noneMatch(e -> e.getId().equals(l.getId()))) {
+            if (newBizArchiveInput.getDetails().stream().noneMatch(e -> l.getId().equals(e.getId()))) {
                 delList.add(l);
                 delProcess.addAll(l.getProcesses());
             } else {
@@ -384,4 +380,46 @@ public class BizArchiveInputController extends BaseController {
             }
         }
     }
+
+    @Log(title = "合同审核前检测")
+    @PreAuthorize("@ss.hasPermi('business:archive:order:verify')")
+    @PostMapping("/verifyCheck")
+    public AjaxResult verifyCheck(@RequestBody BizArchiveInput archiveInput) {
+        // 判断是否是循环合同
+        List<BizArchiveInput> list = bizArchiveInputService.getList(archiveInput);
+        if (!list.isEmpty()) {
+            BizArchiveInput item = list.get(0);
+            if (item.getServiceType().equals(1)) {
+                BizArchiveInputDetail conditions = new BizArchiveInputDetail();
+                conditions.setContractId(item.getId());
+                List<BizArchiveInputDetail> details = archiveInputDetailService.getList(conditions);
+                List<BizArchiveInputDetail> checkResult = new ArrayList<>();
+                // 判断循环工单是否有旧工单
+                for (BizArchiveInputDetail detail: details) {
+                    BizWorkOrder workOrder = workOrderService.query().eq("company_id", item.getCompanyId()).eq("task_type_id", detail.getTaskTypeId()).orderByDesc("end_month").eq("is_stop", 0).last("limit 1").one();
+                    if (workOrder != null && workOrder.getEndMonth() != null) {
+                        DateTime endMonth = DateTime.of(workOrder.getEndMonth());
+                        if (workOrder.getTaskTypeId().equals(1L)) {
+                            // 记账报税做前一个月的所以结束月为上上个月的要判断是否接着上个工单
+                            if (DateTime.now().offset(DateField.MONTH, -2).toString("yyyyMM").compareTo( endMonth.toString("yyyyMM")) > 0) {
+                                detail.setEndMonth(workOrder.getEndMonth());
+                                checkResult.add(detail);
+                            }
+                        } else {
+                            // 社保公积金还有返税申报是这个月的所以结束月是上个月的判断是否接上个工单。
+                             if (DateTime.now().offset(DateField.MONTH, -1).toString("yyyyMM").compareTo( endMonth.toString("yyyyMM")) > 0) {
+                                 detail.setEndMonth(workOrder.getEndMonth());
+                                 checkResult.add(detail);
+                             }
+                        }
+                    }
+                }
+                if (!checkResult.isEmpty()) {
+                    return success(checkResult);
+                }
+            }
+        }
+        return success();
+    }
+
 }

+ 10 - 0
src/main/java/cn/ezhizao/project/business/order/domain/BizArchiveInputDetail.java

@@ -1,11 +1,13 @@
 package cn.ezhizao.project.business.order.domain;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 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;
@@ -117,4 +119,12 @@ public class BizArchiveInputDetail extends BaseEntity
     @ApiModelProperty("变更来源外键")
     private Long fromId;
 
+    @TableField(exist = false)
+    private Boolean redirect;
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endMonth;
+
+    @ApiModelProperty("变更类型")
+    private String alterType;
 }

+ 126 - 27
src/main/java/cn/ezhizao/project/business/order/service/impl/BizArchiveInputServiceImpl.java

@@ -110,11 +110,17 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
     public boolean verify(BizArchiveInput bizArchiveInput) {
         super.updateById(bizArchiveInput);
         List<BizArchiveInputDetail> details = archiveInputDetailService.query().eq("contract_id", bizArchiveInput.getId()).list();
+        details.forEach(l -> {
+            BizArchiveInputDetail detail = bizArchiveInput.getDetails().stream().filter(v -> v.getId().equals(l.getId())).findFirst().orElse(l);
+            l.setRedirect(detail.getRedirect() != null ? detail.getRedirect() : false);
+        });
         List<BizArchiveInputDetailProcess> processes = archiveInputDetailProcessService.query().eq("contract_id", bizArchiveInput.getId()).list();
         List<BizWorkOrder> newWorkOrders = new ArrayList<>();
         List<BizWorkOrder> changeWorkOrders = new ArrayList<>();
+        List<BizWorkOrder> stopWorkOrders = new ArrayList<>();
         List<BizWorkOrderDetail> newWorkOrderDetails = new ArrayList<>();
         List<BizWorkOrderDetail> changeWorkOrderDetails = new ArrayList<>();
+        List<BizWorkOrderDetail> stopWorkOrderDetails = new ArrayList<>();
         if (bizArchiveInput.getVerifyStatus().equals(1)) {
             // 审核通过插入不存在的工单
             // 判断是循环还是单次
@@ -122,7 +128,7 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                 // 假设是循环 判断是否已有该任务并没有签出
                 details.forEach(l -> {
                     List<BizWorkOrder> workOrders = workOrderService.query().eq("company_id", bizArchiveInput.getCompanyId()).eq("task_type_id", l.getTaskTypeId()).eq("is_stop", 0).list();
-                    List<BizWorkOrderDetail> workOrderDetails = workOrderDetailService.query().eq("contract_detail_id", l.getId()).list();
+                    List<BizWorkOrderDetail> workOrderDetails = workOrderDetailService.query().eq("contract_detail_id", l.getId()).eq("is_stop", 0).list();
                     // 假设未有该任务 添加任务记录
                     if (workOrders.isEmpty()) {
                         BizWorkOrder workOrder = new BizWorkOrder();
@@ -142,42 +148,119 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                         bizWorkOrderDetail.setCompanyId(l.getCompanyId());
                         bizWorkOrderDetail.setWorkOrderId(workOrder.getId());
                         bizWorkOrderDetail.setContractDetailId(l.getId());
+                        bizWorkOrderDetail.setTaskTypeId(l.getTaskTypeId());
                         bizWorkOrderDetail.setServiceNum(l.getServiceNum());
                         bizWorkOrderDetail.setFreeNum(l.getFreeNum());
                         bizWorkOrderDetail.setTenantId(l.getTenantId());
                         bizWorkOrderDetail.setContractId(bizArchiveInput.getId());
                         newWorkOrderDetails.add(bizWorkOrderDetail);
 //                        addLoopTasks(workOrder);
-                    } else {
-                        // 假设已有该任务 修改任务月数和结束月
-                        // 判断是否有变更 是变更的先改下
-                        workOrders.forEach(v -> {
-                            Integer monthNum = v.getMonthNum();
-                            BizWorkOrderDetail bizWorkOrderDetail = workOrderDetails.stream().filter(t -> t.getWorkOrderId().equals(v.getId())
-                            ).findFirst().orElse(new BizWorkOrderDetail());
-                            monthNum = monthNum - (bizWorkOrderDetail.getServiceNum() == null ? 0 : bizWorkOrderDetail.getServiceNum()) - (bizWorkOrderDetail.getFreeNum() == null ? 0 : bizWorkOrderDetail.getFreeNum()) + l.getFreeNum() + l.getServiceNum();
+                    }
+                    else {
+                        // 假设已有该任务 判断是否重建任务 修改任务月数和结束月
+                        if(l.getRedirect() != null && l.getRedirect()) {
+                            // 重建任务将旧任务停止
+                            workOrders.forEach(v -> v.setIsStop(1));
+                            changeWorkOrders.addAll(workOrders);
+                            workOrderDetails.forEach(v -> v.setIsStop(1));
+                            changeWorkOrderDetails.addAll(workOrderDetails);
+                            // 新建新任务。
+                            BizWorkOrder workOrder = new BizWorkOrder();
+                            workOrder.setCompanyId(bizArchiveInput.getCompanyId());
+                            workOrder.setContractId(bizArchiveInput.getId());
+                            workOrder.setNoContract(0);
+                            workOrder.setContractDetailId(l.getId());
+                            workOrder.setIsStop(0);
+                            workOrder.setTenantId(l.getTenantId());
+                            workOrder.setTaskTypeId(l.getTaskTypeId());
+                            workOrder.setType(bizArchiveInput.getServiceType());
+                            workOrder.setMonthNum(l.getFreeNum() + l.getServiceNum());
+                            workOrder.setWorkOrderNo("workOrder_" + snowflakeIdWorker.nextId());
+                            workOrder.setId(snowflakeIdWorker.nextId());
+                            newWorkOrders.add(workOrder);
+                            BizWorkOrderDetail bizWorkOrderDetail = new BizWorkOrderDetail();
                             bizWorkOrderDetail.setCompanyId(l.getCompanyId());
-                            bizWorkOrderDetail.setWorkOrderId(v.getId());
+                            bizWorkOrderDetail.setWorkOrderId(workOrder.getId());
                             bizWorkOrderDetail.setContractDetailId(l.getId());
+                            bizWorkOrderDetail.setTaskTypeId(l.getTaskTypeId());
                             bizWorkOrderDetail.setServiceNum(l.getServiceNum());
                             bizWorkOrderDetail.setFreeNum(l.getFreeNum());
                             bizWorkOrderDetail.setTenantId(l.getTenantId());
                             bizWorkOrderDetail.setContractId(bizArchiveInput.getId());
-                            if (bizWorkOrderDetail.getId() == null) {
-                                newWorkOrderDetails.add(bizWorkOrderDetail);
-                            } else {
-                                changeWorkOrderDetails.add(bizWorkOrderDetail);
-                            }
-                            v.setMonthNum(monthNum);
-                            DateTime startMonth = DateTime.of(v.getStartMonth());
-                            v.setEndMonth(startMonth.offset(DateField.MONTH, monthNum - 1).toSqlDate());
-                            changeWorkOrders.add(v);
-                        });
+                            newWorkOrderDetails.add(bizWorkOrderDetail);
+                        } else {
+                            // 判断是否有变更 是变更的先改下
+                            workOrders.forEach(v -> {
+                                Integer monthNum = v.getMonthNum();
+                                BizWorkOrderDetail bizWorkOrderDetail = workOrderDetails.stream().filter(t -> t.getWorkOrderId().equals(v.getId())
+                                ).findFirst().orElse(new BizWorkOrderDetail());
+                                monthNum = monthNum - (bizWorkOrderDetail.getServiceNum() == null ? 0 : bizWorkOrderDetail.getServiceNum()) - (bizWorkOrderDetail.getFreeNum() == null ? 0 : bizWorkOrderDetail.getFreeNum()) + l.getFreeNum() + l.getServiceNum();
+                                bizWorkOrderDetail.setCompanyId(l.getCompanyId());
+                                bizWorkOrderDetail.setWorkOrderId(v.getId());
+                                bizWorkOrderDetail.setContractDetailId(l.getId());
+                                bizWorkOrderDetail.setTaskTypeId(l.getTaskTypeId());
+                                bizWorkOrderDetail.setServiceNum(l.getServiceNum());
+                                bizWorkOrderDetail.setFreeNum(l.getFreeNum());
+                                bizWorkOrderDetail.setTenantId(l.getTenantId());
+                                bizWorkOrderDetail.setContractId(bizArchiveInput.getId());
+                                if (bizWorkOrderDetail.getId() == null) {
+                                    newWorkOrderDetails.add(bizWorkOrderDetail);
+                                } else {
+                                    changeWorkOrderDetails.add(bizWorkOrderDetail);
+                                }
+                                v.setMonthNum(monthNum);
+                                if (v.getStartMonth() != null) {
+                                    DateTime startMonth = DateTime.of(v.getStartMonth());
+                                    v.setEndMonth(startMonth.offset(DateField.MONTH, monthNum - 1).toSqlDate());
+                                }
+                                changeWorkOrders.add(v);
+                            });
+                        }
                     }
                 });
+                List<BizWorkOrderDetail> workOrderDetails = workOrderDetailService.query().eq("contract_id", bizArchiveInput.getId()).eq("is_stop", 0).eq("is_stop", 0).list();
+                stopWorkOrderDetails.addAll(workOrderDetails.stream().filter(v -> changeWorkOrderDetails.stream().noneMatch(e -> e.getId().equals(v.getId()))).collect(Collectors.toList()));
+                if (!stopWorkOrderDetails.isEmpty()) {
+                    List<BizWorkOrder> workOrders = workOrderService.query().in("id", stopWorkOrderDetails.stream().map(BizWorkOrderDetail::getWorkOrderId).collect(Collectors.toList())).list();
+                    // 停用的工单判断是否为空
+                    workOrders.forEach(l -> {
+                        BizWorkOrderDetail detail = stopWorkOrderDetails.stream().filter(v -> v.getWorkOrderId().equals(l.getId())).findFirst().orElse(null);
+                        if (changeWorkOrders.stream().noneMatch(v -> v.getId().equals(l.getId())) && detail != null) {
+                            BizWorkOrder v = changeWorkOrders.stream().filter(e -> e.getId().equals(l.getId())).findFirst().orElse(l);
+                            int monthNum = v.getMonthNum() - (detail.getServiceNum() == null ? 0 : detail.getServiceNum()) - (detail.getFreeNum() == null ? 0 : detail.getFreeNum());
+                            v.setMonthNum(monthNum);
+                            if (v.getStartMonth() != null) {
+                                DateTime startMonth = DateTime.of(v.getStartMonth());
+                                v.setEndMonth(startMonth.offset(DateField.MONTH, monthNum - 1).toSqlDate());
+                            }
+                        }
+                        else if (detail != null) {
+                            int monthNum = l.getMonthNum() - (detail.getServiceNum() == null ? 0 : detail.getServiceNum()) - (detail.getFreeNum() == null ? 0 : detail.getFreeNum());
 
-
-            } else if (bizArchiveInput.getServiceType().equals(2)) {
+                            if (monthNum == 0) {
+                                l.setIsStop(1);
+                                stopWorkOrders.add(l);
+                            } else {
+                                l.setMonthNum(monthNum);
+                                if (l.getStartMonth() != null) {
+                                    DateTime startMonth = DateTime.of(l.getStartMonth());
+                                    l.setEndMonth(startMonth.offset(DateField.MONTH, monthNum - 1).toSqlDate());
+                                }
+                                changeWorkOrders.add(l);
+                            }
+                        }
+//                        Integer workMonth = l.getMonthNum() - (detail != null ? detail.getFreeNum() + detail.getServiceNum() : 0);
+//                        if (workMonth.equals(0)) {
+//                            l.setIsStop(1);
+//                            stopWorkOrders.add(l);
+//                        } else {
+//                            l.setMonthNum(workMonth);
+//                            changeWorkOrders.add(l);
+//                        }
+                    });
+                }
+            }
+            else if (bizArchiveInput.getServiceType().equals(2)) {
                 List<BizWorkOrder> workOrders = workOrderService.query().eq("company_id", bizArchiveInput.getCompanyId()).eq("contract_id", bizArchiveInput.getId()).eq("is_stop", 0).list();
                 // 假设是单次任务 添加该任务
                 details.forEach(l -> {
@@ -206,13 +289,20 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                         }
                     });
                 });
+                // 假设有删除的工单 则 停止工单
+                stopWorkOrders.addAll(workOrders.stream().filter(e -> changeWorkOrders.stream().noneMatch(v -> v.getId().equals(e.getId()))).collect(Collectors.toList()));
+                stopWorkOrders.forEach(l -> l.setIsStop(1));
             }
         }
         boolean status = (newWorkOrderDetails.isEmpty() || workOrderDetailService.saveBatch(newWorkOrderDetails))
                 && (newWorkOrders.isEmpty() || workOrderService.saveBatch(newWorkOrders))
+                && (stopWorkOrders.isEmpty() || workOrderService.updateBatchById(stopWorkOrders))
                 && (changeWorkOrders.isEmpty() || workOrderService.updateBatchById(changeWorkOrders))
-                && (changeWorkOrderDetails.isEmpty() || workOrderDetailService.updateBatchById(changeWorkOrderDetails));
+                && (changeWorkOrderDetails.isEmpty() || workOrderDetailService.updateBatchById(changeWorkOrderDetails))
+                && (stopWorkOrderDetails.isEmpty() || workOrderDetailService.updateBatchById(stopWorkOrderDetails));
         newWorkOrders.forEach(this::addLoopTasks);
+        stopWorkOrders.forEach(this::stopLoopTasks);
+        changeWorkOrders.stream().filter(v -> v.getIsStop().equals(1)).forEach(this::stopLoopTasks);
         return status;
     }
 
@@ -504,16 +594,20 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
 
     @Override
     public boolean checkWorkOrderChangeStatus(List<BizArchiveInputDetail> changeList) {
-        List<BizWorkOrderDetail> details = workOrderDetailService.query().in("contract_detail_id", changeList.stream().map(BizArchiveInputDetail::getId).collect(Collectors.toList())).list();
+        // 该合同的工单明细
+        List<BizWorkOrderDetail> details = workOrderDetailService.query().in("contract_id", changeList.stream().map(BizArchiveInputDetail::getContractId).collect(Collectors.toList())).list();
+        // 该合同的工单
         List<BizWorkOrder> workOrders = workOrderService.query().in("id", details.stream().map(BizWorkOrderDetail::getWorkOrderId).collect(Collectors.toList())).list();
+        // 其他合同的工单明细
         List<BizWorkOrderDetail> otherDetails = workOrderDetailService.query().eq("is_stop", 0).in("work_order_id", workOrders.stream().map(BizWorkOrder::getId).collect(Collectors.toList())).notIn("id", details.stream().map(BizWorkOrderDetail::getId).collect(Collectors.toList())).list();
-        List<BizWorkOrderRecord> records = workOrderRecordService.query().in("work_order_id", workOrders.stream().map(BizWorkOrder::getId).collect(Collectors.toList())).list();
+        // 这些工单的完成情况
+        List<BizWorkOrderRecord> records = workOrderRecordService.query().in("work_order_id", workOrders.stream().map(BizWorkOrder::getId).collect(Collectors.toList())).eq("from_id", 0).list();
         AtomicBoolean status = new AtomicBoolean(true);
         workOrders.forEach(l -> {
             // 除了删除的工单明细之外的工单
             l.setDetails(otherDetails.stream().filter(v -> v.getWorkOrderId().equals(l.getId())).collect(Collectors.toList()));
             BizWorkOrderDetail item = details.stream().filter(v -> v.getWorkOrderId().equals(l.getId())).findFirst().orElse(new BizWorkOrderDetail());
-            BizArchiveInputDetail itemDetail = changeList.stream().filter(v -> v.getId().equals(item.getContractDetailId())).findFirst().orElse(new BizArchiveInputDetail());
+            BizArchiveInputDetail itemDetail = changeList.stream().filter(v -> v.getId().equals(item.getTaskTypeId())).findFirst().orElse(new BizArchiveInputDetail());
 
             // 完成的部分
             l.setRecords(records.stream().filter(v -> v.getWorkOrderId().equals(l.getId())).collect(Collectors.toList()));
@@ -522,7 +616,8 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                 int monthNun = l.getDetails().stream().mapToInt(v -> v.getServiceNum() + v.getFreeNum()).sum() + (itemDetail.getServiceNum() == null ? 0 : itemDetail.getServiceNum()) + (itemDetail.getFreeNum() == null ? 0 : itemDetail.getFreeNum());
                 DateTime startDate = DateTime.of(l.getStartMonth());
                 DateTime endDate = startDate.offsetNew(DateField.MONTH, monthNun - 1);
-                if (records.stream().noneMatch(v -> (v.getYear() + v.getMonth()).compareTo(endDate.toString("yyyyMM")) >= 0)) {
+                // 任务完成月没有比更改后工单的完成月更大的。
+                if (!records.isEmpty() && records.stream().noneMatch(v -> (v.getYear() + v.getMonth()).compareTo(endDate.toString("yyyyMM")) >= 0)) {
                     status.set(false);
                 } else {
                     status.set(status.get());
@@ -697,6 +792,7 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                 workOrderDetail.setCompanyId(archiveInput.getCompanyId());
                 workOrderDetail.setContractDetailId(detail.getId());
                 workOrderDetail.setContractId(archiveInput.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
                 workOrderDetail.setWorkOrderId(workOrder.getId());
                 workOrderDetail.setFreeNum(detail.getFreeNum());
                 workOrderDetail.setServiceNum(detail.getServiceNum());
@@ -742,6 +838,7 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                 workOrderDetail.setCompanyId(archiveInput.getCompanyId());
                 workOrderDetail.setContractDetailId(detail.getId());
                 workOrderDetail.setContractId(archiveInput.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
                 workOrderDetail.setWorkOrderId(workOrder.getId());
                 workOrderDetail.setFreeNum(detail.getFreeNum());
                 workOrderDetail.setServiceNum(detail.getServiceNum());
@@ -786,6 +883,7 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                 BizWorkOrderDetail workOrderDetail = new BizWorkOrderDetail();
                 workOrderDetail.setCompanyId(archiveInput.getCompanyId());
                 workOrderDetail.setContractDetailId(detail.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
                 workOrderDetail.setContractId(archiveInput.getId());
                 workOrderDetail.setWorkOrderId(workOrder.getId());
                 workOrderDetail.setFreeNum(detail.getFreeNum());
@@ -831,6 +929,7 @@ public class BizArchiveInputServiceImpl extends ServiceImpl<BizArchiveInputMappe
                 BizWorkOrderDetail workOrderDetail = new BizWorkOrderDetail();
                 workOrderDetail.setCompanyId(archiveInput.getCompanyId());
                 workOrderDetail.setContractDetailId(detail.getId());
+                workOrderDetail.setTaskTypeId(detail.getTaskTypeId());
                 workOrderDetail.setContractId(archiveInput.getId());
                 workOrderDetail.setWorkOrderId(workOrder.getId());
                 workOrderDetail.setFreeNum(detail.getFreeNum());

+ 2 - 2
src/main/java/cn/ezhizao/project/business/workOrder/controller/WorkOrderServiceController.java

@@ -150,7 +150,7 @@ public class WorkOrderServiceController extends BaseController {
         return getDataTable(list);
     }
 
-    @PreAuthorize("@ss.hasAnyPermi('business:customer:service:loop:edit,business:customer:service:loop:view,business:customer:service:loop:verify')")
+    @PreAuthorize("@ss.hasAnyPermi('business:customer:service:loop:edit,business:customer:service:once:query,business:customer:service:loop:view,business:customer:service:loop:verify,business:customer:service:loop:query')")
     @PostMapping("/getDetail")
     public AjaxResult getDetail(@RequestBody BizWorkOrderRecord bizWorkOrderRecord) {
         List<BizWorkOrderRecord> bizWorkOrderRecords = bizWorkOrderRecordService.getList(bizWorkOrderRecord);
@@ -340,7 +340,7 @@ public class WorkOrderServiceController extends BaseController {
         }
         return success(record);
     }
-    @PreAuthorize("@ss.hasAnyPermi('business:customer:service:once:edit,business:customer:service:once:view,business:customer:service:once:verify')")
+    @PreAuthorize("@ss.hasAnyPermi('business:customer:service:once:query,business:customer:service:once:edit,business:customer:service:once:view,business:customer:service:once:verify')")
     @PostMapping("/getOnceDetail")
     public AjaxResult getOnceDetail(@RequestBody BizWorkOrderRecord bizWorkOrderRecord) {
         List<BizWorkOrderRecord> bizWorkOrderRecords = bizWorkOrderRecordService.getList(bizWorkOrderRecord);

+ 4 - 0
src/main/java/cn/ezhizao/project/business/workOrder/domain/BizWorkOrderDetail.java

@@ -33,6 +33,10 @@ public class BizWorkOrderDetail extends BaseEntity
     @ApiModelProperty("合同明细外键")
     private Long contractDetailId;
 
+    /** 任务外键 */
+    @ApiModelProperty(value = "${comment}")
+    private Long taskTypeId;
+
     /** 购买月数 */
     @Excel(name = "购买月数")
     @ApiModelProperty(value = "购买月数")

+ 3 - 0
src/main/resources/mybatis/business/BizArchiveInputMapper.xml

@@ -11,6 +11,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <association property="sourceName" column="{ source_id = source_id, referrer_data_source = referrer_data_source }" select="getSourceName" />
     </resultMap>
     <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>

+ 1 - 0
src/main/resources/mybatis/business/BizWorkOrderMapper.xml

@@ -30,6 +30,7 @@
             <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>