Forráskód Böngészése

Merge remote-tracking branch 'origin/dev_v1.0.0' into dev_v1.0.0

wangliang 1 éve
szülő
commit
7a1d2aff79
46 módosított fájl, 1346 hozzáadás és 87 törlés
  1. 44 0
      sop-business/src/main/java/com/qmth/sop/business/bean/params/ServiceScopeParam.java
  2. 43 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/CrmSubTotalResult.java
  3. 2 1
      sop-business/src/main/java/com/qmth/sop/business/bean/result/SysCustomResult.java
  4. 34 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/SysDeviceResult.java
  5. 24 5
      sop-business/src/main/java/com/qmth/sop/business/bean/result/SysDingGroupResult.java
  6. 34 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/SysDingGroupRoleResult.java
  7. 2 1
      sop-business/src/main/java/com/qmth/sop/business/bean/result/SysLevelResult.java
  8. 247 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingCountQueryResult.java
  9. 68 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingCountResult.java
  10. 9 6
      sop-business/src/main/java/com/qmth/sop/business/entity/SysDevice.java
  11. 2 1
      sop-business/src/main/java/com/qmth/sop/business/mapper/SysDeviceMapper.java
  12. 5 0
      sop-business/src/main/java/com/qmth/sop/business/mapper/SysDingObjMapper.java
  13. 9 1
      sop-business/src/main/java/com/qmth/sop/business/mapper/TBCrmMapper.java
  14. 27 7
      sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingMapper.java
  15. 2 1
      sop-business/src/main/java/com/qmth/sop/business/service/SysDeviceService.java
  16. 4 0
      sop-business/src/main/java/com/qmth/sop/business/service/SysDingObjService.java
  17. 29 0
      sop-business/src/main/java/com/qmth/sop/business/service/TBCrmService.java
  18. 25 7
      sop-business/src/main/java/com/qmth/sop/business/service/TBDingService.java
  19. 7 0
      sop-business/src/main/java/com/qmth/sop/business/service/TBServiceRegionService.java
  20. 2 1
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SysDeviceServiceImpl.java
  21. 7 6
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SysDingGroupServiceImpl.java
  22. 7 0
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SysDingObjServiceImpl.java
  23. 4 4
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SysLevelServiceImpl.java
  24. 72 2
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmServiceImpl.java
  25. 36 7
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java
  26. 59 3
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBServiceRegionServiceImpl.java
  27. 79 0
      sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncDingCountExportService.java
  28. 8 0
      sop-business/src/main/java/com/qmth/sop/business/templete/service/TaskLogicService.java
  29. 27 1
      sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java
  30. 2 0
      sop-business/src/main/resources/db/log/shudonghui_update_log.sql
  31. 3 2
      sop-business/src/main/resources/mapper/SysDeviceMapper.xml
  32. 2 1
      sop-business/src/main/resources/mapper/SysDingGroupMapper.xml
  33. 9 1
      sop-business/src/main/resources/mapper/SysDingObjMapper.xml
  34. 29 0
      sop-business/src/main/resources/mapper/TBCrmMapper.xml
  35. 131 1
      sop-business/src/main/resources/mapper/TBDingMapper.xml
  36. 1 0
      sop-business/src/main/resources/mapper/TBServiceRegionMapper.xml
  37. 5 1
      sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java
  38. 4 3
      sop-server/src/main/java/com/qmth/sop/server/api/SysDeviceController.java
  39. 2 2
      sop-server/src/main/java/com/qmth/sop/server/api/SysDingGroupController.java
  40. 1 1
      sop-server/src/main/java/com/qmth/sop/server/api/SysLevelController.java
  41. 4 2
      sop-server/src/main/java/com/qmth/sop/server/api/SysSupplierController.java
  42. 6 1
      sop-server/src/main/java/com/qmth/sop/server/api/TBCrmController.java
  43. 107 9
      sop-server/src/main/java/com/qmth/sop/server/api/TBDingController.java
  44. 1 1
      sop-server/src/main/java/com/qmth/sop/server/api/TBServiceController.java
  45. 48 4
      sop-server/src/main/java/com/qmth/sop/server/api/TBServiceRegionController.java
  46. 73 4
      sop-server/src/main/java/com/qmth/sop/server/api/TBServiceScopeController.java

+ 44 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/params/ServiceScopeParam.java

@@ -0,0 +1,44 @@
+package com.qmth.sop.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @Description: 服务单元批量划定参数
+ * @Author: CaoZixuan
+ * @Date: 2023-08-11
+ */
+public class ServiceScopeParam {
+    @ApiModelProperty("服务单元id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "请提供划定服务单元")
+    @Range(min = 1L, message = "请提供划定服务单元")
+    private Long serviceUnitId;
+
+    @ApiModelProperty("派单id集合")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotEmpty(message = "请提供划定派单集合")
+    private List<Long> crmIdList;
+
+    public Long getServiceUnitId() {
+        return serviceUnitId;
+    }
+
+    public void setServiceUnitId(Long serviceUnitId) {
+        this.serviceUnitId = serviceUnitId;
+    }
+
+    public List<Long> getCrmIdList() {
+        return crmIdList;
+    }
+
+    public void setCrmIdList(List<Long> crmIdList) {
+        this.crmIdList = crmIdList;
+    }
+}

+ 43 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/CrmSubTotalResult.java

@@ -0,0 +1,43 @@
+package com.qmth.sop.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 服务范围管理 - 派单小计
+ * @Author: CaoZixuan
+ * @Date: 2023-08-11
+ */
+public class CrmSubTotalResult {
+    @ApiModelProperty("共计服务派单")
+    private Integer totalCrmCount;
+
+    @ApiModelProperty("已划定派单")
+    private Integer bindCrmCount;
+
+    @ApiModelProperty("待划定派单")
+    private Integer unbindCrmCount;
+
+    public Integer getTotalCrmCount() {
+        return totalCrmCount;
+    }
+
+    public void setTotalCrmCount(Integer totalCrmCount) {
+        this.totalCrmCount = totalCrmCount;
+    }
+
+    public Integer getBindCrmCount() {
+        return bindCrmCount;
+    }
+
+    public void setBindCrmCount(Integer bindCrmCount) {
+        this.bindCrmCount = bindCrmCount;
+    }
+
+    public Integer getUnbindCrmCount() {
+        return unbindCrmCount;
+    }
+
+    public void setUnbindCrmCount(Integer unbindCrmCount) {
+        this.unbindCrmCount = unbindCrmCount;
+    }
+}

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/result/SysCustomResult.java

@@ -5,6 +5,7 @@ import com.qmth.sop.business.entity.SysCustomRole;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -30,7 +31,7 @@ public class SysCustomResult extends SysCustom implements Serializable {
     private String createName;
 
     @ApiModelProperty(value = "项目角色配置")
-    private List<SysCustomRoleResult>  roleList;
+    private List<SysCustomRoleResult>  roleList= new ArrayList<>();;
 
     public List<SysCustomRoleResult> getRoleList() {
         return roleList;

+ 34 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/SysDeviceResult.java

@@ -0,0 +1,34 @@
+package com.qmth.sop.business.bean.result;
+
+import com.qmth.sop.business.entity.SysCustom;
+import com.qmth.sop.business.entity.SysDevice;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 客户表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-08-01
+ */
+
+public class SysDeviceResult extends SysDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "客户经理")
+    private String supplier;
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+}

+ 24 - 5
sop-business/src/main/java/com/qmth/sop/business/bean/result/SysDingGroupResult.java

@@ -2,9 +2,11 @@ package com.qmth.sop.business.bean.result;
 
 import com.qmth.sop.business.entity.SysDingGroup;
 import com.qmth.sop.business.entity.SysDingObj;
+import com.qmth.sop.common.enums.ServiceStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -12,7 +14,7 @@ import java.util.List;
  * 考勤组表
  * </p>
  *
- * @author wangliang
+ * @author dhshu
  * @since 2023-08-01
  */
 
@@ -23,19 +25,23 @@ public class SysDingGroupResult extends SysDingGroup implements Serializable {
     @ApiModelProperty(value = "服务单元")
     private String service;
 
-
+    @ApiModelProperty(value = "创建人")
+    private String createName;
 
     @ApiModelProperty(value = "供应商")
     private Long supplier;
 
+    @ApiModelProperty(value = "服务单元状态")
+    private ServiceStatusEnum status;
+
     @ApiModelProperty(value = "适用考勤对象")
-    private List<SysDingObj> dingObjs;
+    private List<SysDingGroupRoleResult> dingObjs= new ArrayList<>();
 
-    public List<SysDingObj> getDingObjs() {
+    public List<SysDingGroupRoleResult> getDingObjs() {
         return dingObjs;
     }
 
-    public void setDingObjs(List<SysDingObj> dingObjs) {
+    public void setDingObjs(List<SysDingGroupRoleResult> dingObjs) {
         this.dingObjs = dingObjs;
     }
 
@@ -58,6 +64,19 @@ public class SysDingGroupResult extends SysDingGroup implements Serializable {
     }
 
 
+    public String getCreateName() {
+        return createName;
+    }
 
+    public void setCreateName(String createName) {
+        this.createName = createName;
+    }
 
+    public ServiceStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(ServiceStatusEnum status) {
+        this.status = status;
+    }
 }

+ 34 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/SysDingGroupRoleResult.java

@@ -0,0 +1,34 @@
+package com.qmth.sop.business.bean.result;
+
+import com.qmth.sop.business.entity.SysDingGroup;
+import com.qmth.sop.business.entity.SysDingObj;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 考勤组表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-08-01
+ */
+
+public class SysDingGroupRoleResult extends SysDingObj implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "角色名称")
+    private String roleName;
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/result/SysLevelResult.java

@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -31,7 +32,7 @@ public class SysLevelResult extends SysLevel implements Serializable {
 
 
     @ApiModelProperty(value = "项目角色配置")
-    private List<SysLevelRoleResult> roleList;
+    private List<SysLevelRoleResult> roleList = new ArrayList<>();
 
     public String getCreateName() {
         return createName;

+ 247 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingCountQueryResult.java

@@ -0,0 +1,247 @@
+package com.qmth.sop.business.bean.result;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author dhshu
+ * @since 2023-08-01
+ */
+@ApiModel(value = "TBDingCountQueryResult对象", description = "考勤打卡统计查询")
+@ColumnWidth(value = 30)
+@HeadStyle(fillForegroundColor = 11)
+@HeadFontStyle(color = 1)
+public class TBDingCountQueryResult implements Serializable {
+
+
+    @ApiModelProperty(value = "服务单元")
+    @ExcelProperty(value = "服务单元")
+    private String service;
+    @ApiModelProperty(value = "SOP流水号")
+    @ExcelProperty(value = "SOP流水号")
+    private String sopNo;
+    @ApiModelProperty(value = "客户名称")
+    @ExcelProperty(value = "客户名称")
+    private String custom;
+    @ApiModelProperty(value = "省份")
+    @ExcelProperty(value = "省份")
+    private String province;
+    @ApiModelProperty(value = "城市")
+    @ExcelProperty(value = "城市")
+    private String city;
+    @ApiModelProperty(value = "项目开始时间")
+    @ExcelProperty(value = "项目开始时间")
+    private String examStartTime;
+    @ApiModelProperty(value = "项目结束时间")
+    @ExcelProperty(value = "项目结束时间")
+    private String examEndTime;
+    @ApiModelProperty(value = "姓名")
+    @ExcelProperty(value = "姓名")
+    private String userName;
+    @ApiModelProperty(value = "人员档案号")
+    @ExcelProperty(value = "人员档案号")
+    private String userNo;
+    @ApiModelProperty(value = "项目角色")
+    @ExcelProperty(value = "项目角色")
+    private String roleName;
+    @ApiModelProperty(value = "供应商")
+    @ExcelProperty(value = "供应商")
+    private String supplier;
+    @ApiModelProperty(value = "实际出勤(天)")
+    @ExcelProperty(value = "实际出勤(天)")
+    private String attendance;
+    @ApiModelProperty(value = "工作日(天)")
+    @ExcelProperty(value = "工作日(天)")
+    private String weekdays;
+    @ApiModelProperty(value = "周末(天)")
+    @ExcelProperty(value = "周末(天)")
+    private String weekends;
+    @ApiModelProperty(value = "法定节假日(天)")
+    @ExcelProperty(value = "法定节假日(天)")
+    private String holidays;
+    @ApiModelProperty(value = "累计工时(小时)")
+    @ExcelProperty(value = "累计工时(小时)")
+    private String workHours;
+    @ApiModelProperty(value = "违规工时(天)")
+    @ExcelProperty(value = "违规工时(天)")
+    private String violationDays;
+    @ApiModelProperty(value = "提交人")
+    @ExcelProperty(value = "提交人")
+    private String submitter;
+    @ApiModelProperty(value = "提交时间")
+    @ExcelProperty(value = "提交时间")
+    private String submissionTime;
+    @ApiModelProperty(value = "状态,START:已开始,AUDITING:审核中,REJECT:已驳回,END:已终止,FINISH:已结束")
+    @ExcelProperty(value = "提交状态")
+    private String status;
+
+    public String getService() {
+        return service;
+    }
+
+    public void setService(String service) {
+        this.service = service;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public String getCustom() {
+        return custom;
+    }
+
+    public void setCustom(String custom) {
+        this.custom = custom;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(String examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public String getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(String examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserNo() {
+        return userNo;
+    }
+
+    public void setUserNo(String userNo) {
+        this.userNo = userNo;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+    public String getAttendance() {
+        return attendance;
+    }
+
+    public void setAttendance(String attendance) {
+        this.attendance = attendance;
+    }
+
+    public String getWeekdays() {
+        return weekdays;
+    }
+
+    public void setWeekdays(String weekdays) {
+        this.weekdays = weekdays;
+    }
+
+    public String getWeekends() {
+        return weekends;
+    }
+
+    public void setWeekends(String weekends) {
+        this.weekends = weekends;
+    }
+
+    public String getHolidays() {
+        return holidays;
+    }
+
+    public void setHolidays(String holidays) {
+        this.holidays = holidays;
+    }
+
+    public String getWorkHours() {
+        return workHours;
+    }
+
+    public void setWorkHours(String workHours) {
+        this.workHours = workHours;
+    }
+
+    public String getViolationDays() {
+        return violationDays;
+    }
+
+    public void setViolationDays(String violationDays) {
+        this.violationDays = violationDays;
+    }
+
+    public String getSubmitter() {
+        return submitter;
+    }
+
+    public void setSubmitter(String submitter) {
+        this.submitter = submitter;
+    }
+
+    public String getSubmissionTime() {
+        return submissionTime;
+    }
+
+    public void setSubmissionTime(String submissionTime) {
+        this.submissionTime = submissionTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}

+ 68 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingCountResult.java

@@ -0,0 +1,68 @@
+package com.qmth.sop.business.bean.result;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Param:
+ * @return:
+ * @Author: dhshu
+ * @Date: 2023/8/10
+ */
+@ApiModel(value = "TBDingCountResult对象", description = "工时统计")
+public class TBDingCountResult implements Serializable {
+
+
+    @ApiModelProperty(value = "考勤总计")
+    Long total;
+    @ApiModelProperty(value = "已提交")
+    Long submitted;
+    @ApiModelProperty(value = "待提交")
+    Long unSubmitted;
+    @ApiModelProperty(value = "已提交累计人天")
+    Long allDays;
+    @ApiModelProperty(value = "已提交累计工时")
+    Long allHours;
+
+    public Long getTotal() {
+        return total;
+    }
+
+    public void setTotal(Long total) {
+        this.total = total;
+    }
+
+    public Long getSubmitted() {
+        return submitted;
+    }
+
+    public void setSubmitted(Long submitted) {
+        this.submitted = submitted;
+    }
+
+    public Long getUnSubmitted() {
+        return unSubmitted;
+    }
+
+    public void setUnSubmitted(Long unSubmitted) {
+        this.unSubmitted = unSubmitted;
+    }
+
+    public Long getAllDays() {
+        return allDays;
+    }
+
+    public void setAllDays(Long allDays) {
+        this.allDays = allDays;
+    }
+
+    public Long getAllHours() {
+        return allHours;
+    }
+
+    public void setAllHours(Long allHours) {
+        this.allHours = allHours;
+    }
+}

+ 9 - 6
sop-business/src/main/java/com/qmth/sop/business/entity/SysDevice.java

@@ -1,5 +1,7 @@
 package com.qmth.sop.business.entity;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.sop.common.base.BaseEntity;
 import com.qmth.sop.common.enums.DeviceStatusEnum;
 import io.swagger.annotations.ApiModel;
@@ -32,8 +34,9 @@ public class SysDevice extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "购买时间")
     private Long buyTime;
 
-    @ApiModelProperty(value = "供应商")
-    private String supplier;
+    @ApiModelProperty(value = "供应商id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long supplierId;
 
     @ApiModelProperty(value = "状态,NORMAL:正常,BREAK_DOWN:故障")
     private DeviceStatusEnum status;
@@ -82,12 +85,12 @@ public class SysDevice extends BaseEntity implements Serializable {
         this.buyTime = buyTime;
     }
 
-    public String getSupplier() {
-        return supplier;
+    public Long getSupplierId() {
+        return supplierId;
     }
 
-    public void setSupplier(String supplier) {
-        this.supplier = supplier;
+    public void setSupplierId(Long supplierId) {
+        this.supplierId = supplierId;
     }
 
     public DeviceStatusEnum getStatus() {

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/mapper/SysDeviceMapper.java

@@ -3,6 +3,7 @@ package com.qmth.sop.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.sop.business.bean.result.SysDeviceResult;
 import com.qmth.sop.business.entity.SysDevice;
 import org.apache.ibatis.annotations.Param;
 import java.util.Map;
@@ -24,5 +25,5 @@ public interface SysDeviceMapper extends BaseMapper<SysDevice> {
 	 * @return
 	 */
 
-    <T> IPage<SysDevice> query(Page<T> iPage, @Param("query") String query);
+    <T> IPage<SysDeviceResult> query(Page<T> iPage, @Param("query") String query);
 }

+ 5 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/SysDingObjMapper.java

@@ -1,7 +1,11 @@
 package com.qmth.sop.business.mapper;
 
+import com.qmth.sop.business.bean.result.SysDingGroupRoleResult;
 import com.qmth.sop.business.entity.SysDingObj;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface SysDingObjMapper extends BaseMapper<SysDingObj> {
 
+    List<SysDingGroupRoleResult> getList(@Param("id") long id);
 }

+ 9 - 1
sop-business/src/main/java/com/qmth/sop/business/mapper/TBCrmMapper.java

@@ -9,6 +9,8 @@ import com.qmth.sop.business.entity.TBCrm;
 import com.qmth.sop.common.enums.ProductTypeEnum;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 派单信息表 Mapper 接口
@@ -57,5 +59,11 @@ public interface TBCrmMapper extends BaseMapper<TBCrm> {
                                                 @Param("startTime") Long startTime,
                                                 @Param("endTime") Long endTime);
 
-    // TODO: 2023/8/10  根据服务单元id查询 
+    /**
+     * 根据服务单元id集合查询派单部分信息
+     *
+     * @param serviceIdList 服务单元id集合
+     * @return 派单信息
+     */
+    List<CrmServiceResult> findOrderListByServiceIds(@Param("serviceIdList") List<Long> serviceIdList);
 }

+ 27 - 7
sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingMapper.java

@@ -1,16 +1,36 @@
 package com.qmth.sop.business.mapper;
 
-import com.qmth.sop.business.entity.TBDing;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
+import com.qmth.sop.business.entity.TBDing;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
- * <p>
- * 考勤打卡表 Mapper 接口
- * </p>
+ * 考勤打卡表 Mapper 接口.
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:07
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
 public interface TBDingMapper extends BaseMapper<TBDing> {
 
-}
+    /**
+     * 查询列表
+     *
+     * @param iPage
+     * @return
+     */
+
+    IPage<TBDingCountQueryResult> query(IPage<Map> iPage, @Param("serviceId") Long serviceId, @Param("status") String status, @Param("createId") Long createId, @Param("userName") String userName, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("days") Long days);
+
+    List<TBDingCountQueryResult> query(@Param("serviceId") Long serviceId, @Param("status") String status, @Param("createId") Long createId, @Param("userName") String userName, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("days") Long days);
+
+    TBDingCountResult count(@Param("serviceId") Long serviceId, @Param("createId") Long createId, @Param("userName") String userName, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo);
+}

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/service/SysDeviceService.java

@@ -3,6 +3,7 @@ package com.qmth.sop.business.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.result.SysDeviceResult;
 import com.qmth.sop.business.entity.SysDevice;
 import java.util.Map;
 
@@ -23,7 +24,7 @@ public interface SysDeviceService extends IService<SysDevice>{
     * @param
     * @return
     */
-    <T> IPage<SysDevice> query(Page<T> tPage, String query);
+    <T> IPage<SysDeviceResult> query(Page<T> tPage, String query);
 
     /**
     * 新增设备配置表

+ 4 - 0
sop-business/src/main/java/com/qmth/sop/business/service/SysDingObjService.java

@@ -1,8 +1,11 @@
 package com.qmth.sop.business.service;
 
+import com.qmth.sop.business.bean.result.SysDingGroupRoleResult;
 import com.qmth.sop.business.entity.SysDingObj;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  * 考勤组对象表 服务类
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface SysDingObjService extends IService<SysDingObj> {
 
+    List<SysDingGroupRoleResult> getList(long id);
 }

+ 29 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBCrmService.java

@@ -2,7 +2,9 @@ package com.qmth.sop.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.params.ServiceScopeParam;
 import com.qmth.sop.business.bean.result.CrmServiceResult;
+import com.qmth.sop.business.bean.result.CrmSubTotalResult;
 import com.qmth.sop.business.entity.TBCrm;
 import com.qmth.sop.common.enums.ProductTypeEnum;
 
@@ -54,4 +56,31 @@ public interface TBCrmService extends IService<TBCrm> {
      * @return 派单部分信息
      */
     List<CrmServiceResult> findCrmOrderByServiceIdList(List<Long> serviceIdList);
+
+    /**
+     * 服务范围管理 - 批量划定派单和服务单元关系
+     *
+     * @param crmIdList     派单id集合
+     * @param serviceUnitId 服务单元id
+     */
+    /**
+     * 服务范围管理 - 批量划定派单和服务单元关系
+     *
+     * @param serviceScopeParam 服务范围划定参数
+     */
+    void bindCrmWithServiceBatch(ServiceScopeParam serviceScopeParam);
+
+    /**
+     * 服务范围管理 - 移除(解绑派单和服务单元)
+     *
+     * @param crmId 派单id
+     */
+    void unbindCrmWithService(Long crmId);
+
+    /**
+     * 服务范围管理 - 查询派单小计
+     *
+     * @return 派单小计
+     */
+    CrmSubTotalResult findCrmSubTotalData();
 }

+ 25 - 7
sop-business/src/main/java/com/qmth/sop/business/service/TBDingService.java

@@ -1,16 +1,34 @@
 package com.qmth.sop.business.service;
 
-import com.qmth.sop.business.entity.TBDing;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
+import com.qmth.sop.business.entity.TBDing;
+
+import java.util.List;
+import java.util.Map;
 
 /**
- * <p>
  * 考勤打卡表 服务类
- * </p>
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:08
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
-public interface TBDingService extends IService<TBDing> {
+public interface TBDingService extends IService<TBDing>{
+
+    /**
+    * 查询列表
+    *
+    * @param iPage
+    * @return
+    */
+    IPage<TBDingCountQueryResult> query(IPage<Map> iPage, Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days);
+    List<TBDingCountQueryResult> query(Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days);
 
-}
+    TBDingCountResult count(Long serviceId, Long createId, String userName, Long supplierId, String custom, String sopNo);
+}

+ 7 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBServiceRegionService.java

@@ -36,4 +36,11 @@ public interface TBServiceRegionService extends IService<TBServiceRegion> {
      * @return 服务区域规划id
      */
     Long editServiceRegion(ServiceRegionParam serviceRegionParam);
+
+    /**
+     * 删除大区规划
+     *
+     * @param serviceRegionId 删除服务区域规划
+     */
+    void removeServiceRegion(Long serviceRegionId);
 }

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysDeviceServiceImpl.java

@@ -3,6 +3,7 @@ package com.qmth.sop.business.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.result.SysDeviceResult;
 import com.qmth.sop.business.entity.SysDevice;
 import com.qmth.sop.business.entity.SysSupplier;
 import com.qmth.sop.business.entity.SysUser;
@@ -33,7 +34,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
      * @return
      */
     @Override
-    public <T> IPage<SysDevice> query(Page<T> iPage, String query) {
+    public <T> IPage<SysDeviceResult> query(Page<T> iPage, String query) {
         return this.baseMapper.query(iPage, query);
     }
 

+ 7 - 6
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysDingGroupServiceImpl.java

@@ -43,7 +43,7 @@ public class SysDingGroupServiceImpl extends ServiceImpl<SysDingGroupMapper, Sys
     public IPage<SysDingGroupResult> query(IPage<Map> iPage, String query, Long serviceId) {
         IPage<SysDingGroupResult> dingGroupResultIPage = this.baseMapper.query(iPage, query, serviceId);
         dingGroupResultIPage.getRecords().forEach(e -> {
-            e.setDingObjs(sysDingObjService.list(new QueryWrapper<SysDingObj>().lambda().eq(SysDingObj::getDingGroupId, e.getId())));
+            e.setDingObjs(sysDingObjService.getList(e.getId()));
         });
         return dingGroupResultIPage;
     }
@@ -56,14 +56,15 @@ public class SysDingGroupServiceImpl extends ServiceImpl<SysDingGroupMapper, Sys
     @Override
     @Transactional
     public void add(SysDingGroupResult sysDingGroup) {
-        sysDingGroup.getDingObjs().forEach(e -> {
-            e.setDingGroupId(sysDingGroup.getId());
-        });
-        sysDingObjService.saveBatch(sysDingGroup.getDingObjs());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         sysDingGroup.setCreateId(sysUser.getId());
         sysDingGroup.setCreateTime(System.currentTimeMillis());
         this.saveOrUpdate(sysDingGroup);
+        sysDingGroup.getDingObjs().forEach(e -> {
+            e.setDingGroupId(sysDingGroup.getId());
+            sysDingObjService.save(e);
+        });
+
     }
 
     /**
@@ -82,8 +83,8 @@ public class SysDingGroupServiceImpl extends ServiceImpl<SysDingGroupMapper, Sys
         sysDingObjService.remove(new QueryWrapper<SysDingObj>().lambda().eq(SysDingObj::getDingGroupId, sysDingGroup.getId()));
         sysDingGroup.getDingObjs().forEach(e -> {
             e.setDingGroupId(sysDingGroup.getId());
+            sysDingObjService.save(e);
         });
-        sysDingObjService.saveBatch(sysDingGroup.getDingObjs());
     }
 
     /**

+ 7 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysDingObjServiceImpl.java

@@ -1,11 +1,14 @@
 package com.qmth.sop.business.service.impl;
 
+import com.qmth.sop.business.bean.result.SysDingGroupRoleResult;
 import com.qmth.sop.business.entity.SysDingObj;
 import com.qmth.sop.business.mapper.SysDingObjMapper;
 import com.qmth.sop.business.service.SysDingObjService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  * 考勤组对象表 服务实现类
@@ -17,4 +20,8 @@ import org.springframework.stereotype.Service;
 @Service
 public class SysDingObjServiceImpl extends ServiceImpl<SysDingObjMapper, SysDingObj> implements SysDingObjService {
 
+    @Override
+    public List<SysDingGroupRoleResult> getList(long id) {
+        return this.baseMapper.getList(id);
+    }
 }

+ 4 - 4
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysLevelServiceImpl.java

@@ -55,14 +55,14 @@ public class SysLevelServiceImpl extends ServiceImpl<SysLevelMapper, SysLevel> i
     @Override
     @Transactional
     public void add(SysLevelResult sysLevel) {
-        sysLevel.getRoleList().forEach(e->{
-            e.setLevelId(sysLevel.getId());
-            sysLevelRoleService.saveOrUpdate(e);
-        });
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         sysLevel.setCreateId(sysUser.getId());
         sysLevel.setCreateTime(System.currentTimeMillis());
         this.saveOrUpdate(sysLevel);
+        sysLevel.getRoleList().forEach(e->{
+            e.setLevelId(sysLevel.getId());
+            sysLevelRoleService.saveOrUpdate(e);
+        });
     }
 
     /**

+ 72 - 2
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmServiceImpl.java

@@ -1,17 +1,29 @@
 package com.qmth.sop.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.params.ServiceScopeParam;
 import com.qmth.sop.business.bean.result.CrmServiceResult;
+import com.qmth.sop.business.bean.result.CrmSubTotalResult;
 import com.qmth.sop.business.entity.TBCrm;
+import com.qmth.sop.business.entity.TBService;
 import com.qmth.sop.business.mapper.TBCrmMapper;
 import com.qmth.sop.business.service.TBCrmService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.service.TBServiceService;
 import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.ProductTypeEnum;
+import com.qmth.sop.common.enums.ServiceStatusEnum;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -23,6 +35,8 @@ import java.util.List;
  */
 @Service
 public class TBCrmServiceImpl extends ServiceImpl<TBCrmMapper, TBCrm> implements TBCrmService {
+    @Resource
+    private TBServiceService tbServiceService;
 
     @Override
     public IPage<CrmServiceResult> findServiceScopePage(Long serviceUnitId, String city, ProductTypeEnum productType, String customName, Boolean bindStatus, Integer pageNumber, Integer pageSize) {
@@ -48,7 +62,63 @@ public class TBCrmServiceImpl extends ServiceImpl<TBCrmMapper, TBCrm> implements
 
     @Override
     public List<CrmServiceResult> findCrmOrderByServiceIdList(List<Long> serviceIdList) {
+        return this.baseMapper.findOrderListByServiceIds(serviceIdList);
+    }
+
+    @Transactional
+    @Override
+    public void bindCrmWithServiceBatch(ServiceScopeParam serviceScopeParam) {
+        List<Long> crmIdList = serviceScopeParam.getCrmIdList();
+        Long serviceUnitId = serviceScopeParam.getServiceUnitId();
+        if (CollectionUtils.isEmpty(crmIdList)) {
+            throw ExceptionResultEnum.ERROR.exception("未选择要划定的派单");
+        }
+
+        TBService tbService = tbServiceService.getById(serviceUnitId);
+        if (Objects.isNull(tbService) || !tbService.getEnable()) {
+            throw ExceptionResultEnum.ERROR.exception("服务单元不存在");
+        } else {
+            ServiceStatusEnum status = tbService.getStatus();
+            if (ServiceStatusEnum.FINISH.equals(status) || ServiceStatusEnum.CANCEL.equals(status)) {
+                throw ExceptionResultEnum.ERROR.exception("不能划定进已完结或已作废的服务单元");
+            }
+        }
+        List<TBCrm> tbCrmList = this.listByIds(crmIdList);
+        tbCrmList = tbCrmList.stream().peek(e -> e.setServiceId(serviceUnitId)).collect(Collectors.toList());
+        this.updateBatchById(tbCrmList);
+    }
+
+    @Transactional
+    @Override
+    public void unbindCrmWithService(Long crmId) {
+        TBCrm tbCrm = this.getById(crmId);
+        if (Objects.isNull(tbCrm)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到派单信息");
+        }
+        Long serviceUnitId = tbCrm.getServiceId();
+        TBService tbService = tbServiceService.getById(serviceUnitId);
+        if (Objects.nonNull(tbService)) {
+            ServiceStatusEnum status = tbService.getStatus();
+            if (ServiceStatusEnum.FINISH.equals(status)) {
+                throw ExceptionResultEnum.ERROR.exception("服务单元的当前状态更新为" + ServiceStatusEnum.FINISH.name() + "不允许移除");
+            }
+        }
+    }
 
-        return null;
+    @Override
+    public CrmSubTotalResult findCrmSubTotalData() {
+        List<TBCrm> tbCrmList = this.list(new QueryWrapper<TBCrm>().lambda().eq(TBCrm::getEnable, true));
+        int totalCrmCount = tbCrmList.size();
+        int bindCrmCount = 0;
+        int unbindCrmCount = 0;
+        if (totalCrmCount > 0) {
+            bindCrmCount = (int) tbCrmList.stream().filter(e -> e.getServiceId() != null).count();
+            unbindCrmCount = (int) tbCrmList.stream().filter(e -> e.getServiceId() == null).count();
+        }
+        CrmSubTotalResult crmSubTotalResult = new CrmSubTotalResult();
+        crmSubTotalResult.setTotalCrmCount(totalCrmCount);
+        crmSubTotalResult.setBindCrmCount(bindCrmCount);
+        crmSubTotalResult.setUnbindCrmCount(unbindCrmCount);
+        return crmSubTotalResult;
     }
 }

+ 36 - 7
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java

@@ -1,20 +1,49 @@
 package com.qmth.sop.business.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
 import com.qmth.sop.business.entity.TBDing;
 import com.qmth.sop.business.mapper.TBDingMapper;
 import com.qmth.sop.business.service.TBDingService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Map;
+
 /**
- * <p>
- * 考勤打卡表 服务实现类
- * </p>
+ * 考勤打卡表 服务实现.
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:08
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
 @Service
 public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> implements TBDingService {
 
-}
+
+    /**
+     * 查询列表
+     *
+     * @param iPage
+     * @return
+     */
+
+    @Override
+    public IPage<TBDingCountQueryResult> query(IPage<Map> iPage, Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days) {
+        return this.baseMapper.query(iPage, serviceId, status, createId, userName, supplierId, custom, sopNo, days);
+    }
+
+    @Override
+    public List<TBDingCountQueryResult> query(Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days) {
+        return this.baseMapper.query(serviceId, status, createId, userName, supplierId, custom, sopNo, days);
+    }
+
+    @Override
+    public TBDingCountResult count(Long serviceId,  Long createId, String userName, Long supplierId, String custom, String sopNo) {
+        return this.baseMapper.count(serviceId, createId, userName, supplierId, custom, sopNo);
+    }
+}

+ 59 - 3
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBServiceRegionServiceImpl.java

@@ -1,20 +1,24 @@
 package com.qmth.sop.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.sop.business.bean.dto.AreaDto;
 import com.qmth.sop.business.bean.params.ServiceRegionParam;
+import com.qmth.sop.business.bean.result.CrmServiceResult;
 import com.qmth.sop.business.bean.result.ServiceRegionResult;
 import com.qmth.sop.business.entity.SysUser;
 import com.qmth.sop.business.entity.TBService;
 import com.qmth.sop.business.entity.TBServiceRegion;
+import com.qmth.sop.business.entity.TBServiceRegionDetail;
 import com.qmth.sop.business.mapper.TBServiceRegionMapper;
 import com.qmth.sop.business.service.*;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.RoleTypeEnum;
 import com.qmth.sop.common.enums.ServiceStatusEnum;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -51,9 +55,50 @@ public class TBServiceRegionServiceImpl extends ServiceImpl<TBServiceRegionMappe
         }
         IPage<ServiceRegionResult> page = this.baseMapper.findServiceRegionPage(new Page<>(pageNumber, pageSize), serviceUnitId, leadId, city, ServiceStatusEnum.CANCEL);
         List<ServiceRegionResult> records = page.getRecords();
-        // 涉及的服务单元id集合
-        List<Long> serviceUnitIdList = records.stream().map(ServiceRegionResult::getServiceUnitId).distinct().collect(Collectors.toList());
-        // TODO: 2023/8/10 和派单关联
+        if (records.size() > 0) {
+            // 涉及的服务单元id集合
+            List<Long> serviceUnitIdList = records.stream().map(ServiceRegionResult::getServiceUnitId).distinct().collect(Collectors.toList());
+
+            // 派单
+            List<CrmServiceResult> crmServiceResultList = tbCrmService.findCrmOrderByServiceIdList(serviceUnitIdList);
+            // 规划位置
+            List<Long> serviceRegionIdList = records.stream().map(ServiceRegionResult::getServiceRegionId).distinct().collect(Collectors.toList());
+            List<TBServiceRegionDetail> tbServiceRegionDetailList = tbServiceRegionDetailService.list(new QueryWrapper<TBServiceRegionDetail>().lambda().eq(TBServiceRegionDetail::getServiceRegionId, serviceRegionIdList));
+
+            for (ServiceRegionResult record : records) {
+                Long unitId = record.getServiceUnitId();
+                Long regionId = record.getServiceRegionId();
+
+                List<TBServiceRegionDetail> detailList = tbServiceRegionDetailList
+                        .stream()
+                        .filter(e -> regionId.equals(e.getServiceRegionId()))
+                        .collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(detailList)) {
+                    int orderCount = 0;
+                    StringBuilder regionInfo = new StringBuilder();
+                    for (TBServiceRegionDetail detail : detailList) {
+                        String detailProvince = detail.getProvince();
+                        String detailCity = detail.getCity();
+                        String regionInfoCell = detailProvince + detailCity;
+
+                        List<CrmServiceResult> crmList = crmServiceResultList.stream()
+                                .filter(e -> unitId.equals(e.getServiceUnitId())
+                                        && detailProvince.equals(e.getProvince())
+                                        && detailCity.equals(e.getCity()))
+                                .collect(Collectors.toList());
+                        int count = crmList.size();
+                        regionInfoCell = regionInfoCell + "(" + count + ")";
+                        orderCount = orderCount + count;
+                        regionInfo.append(regionInfoCell).append("、");
+                    }
+                    if (regionInfo.length() > 0) {
+                        regionInfo = new StringBuilder(regionInfo.substring(0, regionInfo.length() - 1));
+                    }
+                    record.setOrderCount(orderCount);
+                    record.setRegionInfo(regionInfo.toString());
+                }
+            }
+        }
         return page;
     }
 
@@ -98,4 +143,15 @@ public class TBServiceRegionServiceImpl extends ServiceImpl<TBServiceRegionMappe
         tbServiceRegionDetailService.bindServiceRegionAreas(serviceRegionId, areaDtoList);
         return serviceRegionId;
     }
+
+    @Transactional
+    @Override
+    public void removeServiceRegion(Long serviceRegionId) {
+        TBServiceRegion tbServiceRegion = this.getById(serviceRegionId);
+        if (Objects.isNull(tbServiceRegion)) {
+            throw ExceptionResultEnum.ERROR.exception("服务区域规划不存在");
+        }
+        tbServiceRegion.setEnable(false);
+        this.updateById(tbServiceRegion);
+    }
 }

+ 79 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncDingCountExportService.java

@@ -0,0 +1,79 @@
+package com.qmth.sop.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.entity.BasicAttachment;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.templete.export.AsyncExportTaskTemplete;
+import com.qmth.sop.business.templete.service.TaskLogicService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskResultEnum;
+import com.qmth.sop.common.enums.TaskStatusEnum;
+import com.qmth.sop.common.enums.TaskTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 考勤打卡统计导出
+ * @Param:
+ * @return:
+ * @Author: dhshu
+ * @Date: 2023/8/7
+ */
+@Service
+public class AsyncDingCountExportService extends AsyncExportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncDingCountExportService.class);
+    public static final String OBJ_TITLE = "考勤打卡统计导出";
+
+    @Resource
+    TaskLogicService taskLogicService;
+
+    @Resource
+    TBTaskService tbTaskService;
+
+    @Override
+    public Result exportTask(Map<String, Object> map) throws Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        tbTask.setSummary(stringJoinerSummary.toString());
+        tbTaskService.updateById(tbTask);
+        try {
+            Map<String, Object> result = taskLogicService.executeExportDingCountLogic(map);
+            List<TBDingCountQueryResult> archivesImportDtoList = (List<TBDingCountQueryResult>) result.get(SystemConstant.EXCEL_DATA);
+            BasicAttachment basicAttachment = (BasicAttachment) result.get(SystemConstant.EXCEL_ATTACHMENT);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, !CollectionUtils.isEmpty(archivesImportDtoList) ? archivesImportDtoList.size() : 0, FINISH_SIZE));
+
+            tbTask.setImportFileName(TaskTypeEnum.MESSAGE_EXPORT.getTitle());
+            tbTask.setResultFilePath(basicAttachment.getPath());
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok();
+    }
+}

+ 8 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/service/TaskLogicService.java

@@ -46,4 +46,12 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String, Object> executeExportSysMessageLogic(Map<String, Object> map) throws Exception;
+    /**
+     * 考勤打卡统计导出
+     *
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String, Object> executeExportDingCountLogic(Map<String, Object> map) throws Exception;
 }

+ 27 - 1
sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -7,12 +7,14 @@ import com.qmth.sop.business.bean.dto.SysMessageExportDto;
 import com.qmth.sop.business.bean.dto.UserArchivesImportDto;
 import com.qmth.sop.business.bean.result.SysCustomResult;
 import com.qmth.sop.business.bean.result.SysMessageResult;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.service.*;
 import com.qmth.sop.business.templete.service.TaskLogicService;
 import com.qmth.sop.business.util.ImportExportUtil;
 import com.qmth.sop.business.util.excel.BasicExcelListener;
 import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.FlowStatusEnum;
 import com.qmth.sop.common.enums.ProductTypeEnum;
 import com.qmth.sop.common.enums.UploadFileEnum;
 import com.qmth.sop.common.util.ServletUtil;
@@ -59,7 +61,8 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 
     @Resource
     SysMessageService sysMessageService;
-
+    @Resource
+    TBDingService tbDingService;
 
     /**
      * 处理导入人员档案数据
@@ -211,6 +214,29 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return map;
     }
 
+    @Override
+    public Map<String, Object> executeExportDingCountLogic(Map<String, Object> map) throws Exception {
+        File fileTemp = null;
+        try {
+            fileTemp = SystemConstant.getFileTempVar(SystemConstant.XLSX_PREFIX);
+
+            List<TBDingCountQueryResult> tbDingCountQueryResults = tbDingService.query((Long) map.get("serviceId"), (String) map.get("status"), (Long) map.get("createId"), (String) map.get("userName"), (Long) map.get("supplierId"), (String) map.get("String"), (String) map.get("sopNo"), (Long) map.get("days"));
+            tbDingCountQueryResults.forEach(e->{
+                e.setStatus(FlowStatusEnum.convertToEnum(e.getStatus()).getTitle());
+            });
+            EasyExcel.write(fileTemp, TBDingCountQueryResult.class).sheet("考勤打卡统计导出").doWrite(tbDingCountQueryResults);
+
+            BasicAttachment basicAttachment = basicAttachmentService.saveAttachment(fileTemp, UploadFileEnum.FILE);
+            map.computeIfAbsent(SystemConstant.EXCEL_DATA, v -> tbDingCountQueryResults);
+            map.computeIfAbsent(SystemConstant.EXCEL_ATTACHMENT, v -> basicAttachment);
+        } finally {
+            if (Objects.nonNull(fileTemp)) {
+                fileTemp.delete();
+            }
+        }
+        return map;
+    }
+
     /**
      * 处理导出人员档案数据
      *

+ 2 - 0
sop-business/src/main/resources/db/log/shudonghui_update_log.sql

@@ -169,3 +169,5 @@ INSERT INTO `sys_ding_date` (`id`, `year`, `month`, `day`, `type`) VALUES (10, 2
 ALTER TABLE `t_b_ding`
     ADD COLUMN `date_type` varchar(20) NULL COMMENT '日期类型:WEEKDAY("工作日"),WEEKEND("周末"),LEGAL_HOLIDAYS("法定节假日")' AFTER `sign_date`;
 -------------------------------
+ALTER TABLE `sys_device`
+    CHANGE COLUMN `supplier` `supplier_id` bigint NULL DEFAULT NULL COMMENT '供应商id' AFTER `buy_time`;

+ 3 - 2
sop-business/src/main/resources/mapper/SysDeviceMapper.xml

@@ -2,8 +2,9 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.sop.business.mapper.SysDeviceMapper">
 
-    <select id="query" resultType="com.qmth.sop.business.entity.SysDevice">
-        select * from sys_device a
+    <select id="query" resultType="com.qmth.sop.business.bean.result.SysDeviceResult">
+        select a.*,s.name supplier  from sys_device a
+        left join sys_supplier s on s.id=a.supplier_id
         <where>
             <if test="query != null and query != ''">
                 and ( a.name like concat('%', #{query} , '%') or a.serial_no like concat('%', #{query} , '%')

+ 2 - 1
sop-business/src/main/resources/mapper/SysDingGroupMapper.xml

@@ -3,7 +3,8 @@
 <mapper namespace="com.qmth.sop.business.mapper.SysDingGroupMapper">
 
     <select id="query" resultType="com.qmth.sop.business.bean.result.SysDingGroupResult">
-        select a.*,s.name supplier,t.name service from sys_ding_group a
+        select a.*,s.name supplier,t.name service,u.real_name create_name,t.status from sys_ding_group a
+        left join sys_user u on u.id = a.create_id
         left join sys_supplier s on s.id = a.supplier_id
         left join t_b_service t on t.id = a.service_id
         <where>

+ 9 - 1
sop-business/src/main/resources/mapper/SysDingObjMapper.xml

@@ -1,5 +1,13 @@
 <?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="com.qmth.sop.business.mapper.SysDingObjMapper">
-
+    <select id="getList" resultType="com.qmth.sop.business.bean.result.SysDingGroupRoleResult">
+        select a.*,r.name role_name from sys_ding_obj a
+        left join sys_role r on r.id=a.role_id
+        <where>
+            <if test="id != null and id != ''">
+                and a.ding_group_id = #{id}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 29 - 0
sop-business/src/main/resources/mapper/TBCrmMapper.xml

@@ -24,6 +24,7 @@
                 LEFT JOIN
             sys_level sl ON sc.level_id = sl.id
         <where>
+            AND tbc.enable
             <if test="serviceUnitId != null">
                 AND tbc.service_id = #{serviceUnitId}
             </if>
@@ -78,6 +79,7 @@
                 LEFT JOIN
             sys_user creator ON tbc.create_id = creator.id
         <where>
+            AND tbc.enable
             AND tbc.service_id IS NULL
             <if test="crmUserId != null">
                 AND tbc.custom_id = #{crmUserId}
@@ -100,4 +102,31 @@
         </where>
         ORDER BY tbc.create_time DESC
     </select>
+
+    <select id="findOrderListByServiceIds" resultType="com.qmth.sop.business.bean.result.CrmServiceResult">
+        SELECT
+            tbc.id AS crmId,
+            tbc.name AS crmNo,
+            tbc.custom_id AS customId,
+            sc.type AS productType,
+            sc.name AS customName,
+            sc.province,
+            sc.city,
+            tbc.service_id AS serviceUnitId
+        FROM
+            t_b_crm tbc
+                LEFT JOIN
+            t_b_service tbs ON tbc.service_id = tbs.id AND tbs.enable
+                LEFT JOIN
+            sys_custom sc ON tbc.custom_id = sc.id
+        <where>
+            AND tbc.enable
+            <if test="serviceIdList != null and serviceIdList.size > 0">
+                AND tbc.service_id IN
+                <foreach collection="serviceIdList" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
 </mapper>

+ 131 - 1
sop-business/src/main/resources/mapper/TBDingMapper.xml

@@ -2,4 +2,134 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.sop.business.mapper.TBDingMapper">
 
-</mapper>
+    <select id="query" resultType="com.qmth.sop.business.bean.result.TBDingCountQueryResult">
+        SELECT * from (
+        SELECT
+        bs.NAME service,
+        d.sop_no,
+        c.NAME custom,
+        ua.province,
+        ua.city,
+        crm.exam_start_time,
+        crm.exam_end_time,
+        u.real_name user_name,
+        ua.`code` user_no,
+        r.`name` role_name,
+        s.NAME supplier,
+        count( d.id ) attendance,
+        SUM( CASE WHEN d.date_type = 'WEEKDAY' THEN 1 ELSE 0 END ) weekdays,
+        SUM( CASE WHEN d.date_type = 'WEEKEND' THEN 1 ELSE 0 END ) weekends,
+        SUM( CASE WHEN d.date_type = 'LEGAL_HOLIDAYS' THEN 1 ELSE 0 END ) holidays,
+        SUM( CASE WHEN d.sign_out_time is not null and d.sign_in_time is not null   THEN TIMESTAMPDIFF(HOUR, DATE_FORMAT(FROM_UNIXTIME(d.sign_out_time), '%Y-%m-%d %H:%i:%s'), DATE_FORMAT(FROM_UNIXTIME(d.sign_in_time), '%Y-%m-%d %H:%i:%s')) ELSE 0 END ) work_hours,
+        DATEDIFF(DATE_FORMAT(FROM_UNIXTIME(crm.exam_start_time), '%Y-%m-%d'), DATE_FORMAT(FROM_UNIXTIME(crm.exam_end_time), '%Y-%m-%d'))-count( d.id )+1 violation_days,
+        f.`status`,
+        sub.real_name submitter,
+        f.create_time submission_time ,
+        d.service_id,
+        f.create_id,
+        s.id supplier_id
+
+        FROM
+        t_b_ding d
+        LEFT JOIN sys_user u ON u.id = d.user_id
+        LEFT JOIN t_b_user_archives ua ON u.mobile_number = ua.mobile_number
+        LEFT JOIN t_b_user_archives_supplier us ON us.user_archives_id = ua.id
+        LEFT JOIN t_b_service bs ON bs.id = d.service_id
+        LEFT JOIN t_b_sop_info sop ON sop.crm_no = d.crm_no
+        AND sop.sop_no = d.sop_no
+        LEFT JOIN t_b_engineer_allocation ea ON ea.crm_no = d.crm_no
+        AND ea.sop_no = d.sop_no
+        LEFT JOIN sys_role r ON ea.role_id = r.id
+        LEFT JOIN t_b_crm crm ON crm.crm_no = d.crm_no
+        LEFT JOIN sys_custom c ON c.id = sop.custom_id
+        LEFT JOIN t_f_flow_approve f ON f.flow_id = d.flow_id
+        LEFT JOIN sys_user sub ON sub.id = f.create_id
+        LEFT JOIN sys_supplier s ON s.id = us.supplier_id
+        GROUP BY
+        bs.NAME,
+        d.sop_no,
+        c.NAME,
+        ua.province,
+        ua.city,
+        crm.exam_start_time,
+        crm.exam_end_time,
+        u.real_name,
+        ua.`code`,
+        r.`name`,
+        s.NAME,
+        f.`status`,
+        f.create_id,
+        f.create_time,
+        d.service_id,
+        s.id  ) a
+
+        <where>
+            <if test="serviceId != null and serviceId != ''">
+                and a.service_id = #{serviceId}
+            </if>
+            <if test="status != null and status != ''">
+                and a.status = #{status}
+            </if>
+            <if test="createId != null and createId != ''">
+                and a.create_id = #{create_id}
+            </if>
+            <if test="userName != null and userName != ''">
+                and a.real_name like concat('%', #{userName} , '%')
+            </if>
+            <if test="supplierId != null and supplierId != ''">
+                and a.supplier_id = #{supplierId}
+            </if>
+            <if test="custom != null and custom != ''">
+                and a.name like concat('%', #{custom} , '%')
+            </if>
+            <if test="sopNo != null and sopNo != ''">
+                and a.sop_no like concat('%', #{sopNo} , '%')
+            </if>
+            <if test="days != null and days != '' ">
+                <![CDATA[
+               and a.days > #{days}
+               ]]>
+            </if>
+        </where>
+
+    </select>
+
+
+    <select id="count" resultType="com.qmth.sop.business.bean.result.TBDingCountResult">
+        SELECT
+        count( d.id ) total,
+        SUM( CASE WHEN f.`status`='FINISH' THEN 1 ELSE 0 END ) submitted,
+        SUM( CASE WHEN f.`status`!='FINISH' THEN 1 ELSE 0 END ) un_submitted,
+        SUM( CASE WHEN f.`status`='FINISH' THEN 1 ELSE 0 END ) all_days,
+        SUM( CASE WHEN f.`status`='FINISH'  THEN TIMESTAMPDIFF(HOUR, DATE_FORMAT(FROM_UNIXTIME(d.sign_out_time), '%Y-%m-%d %H:%i:%s'), DATE_FORMAT(FROM_UNIXTIME(d.sign_in_time), '%Y-%m-%d %H:%i:%s')) ELSE 0 END ) all_hours
+        FROM
+        t_b_ding d
+        LEFT JOIN sys_user u ON u.id = d.user_id
+        LEFT JOIN t_b_user_archives ua ON u.mobile_number = ua.mobile_number
+        LEFT JOIN t_b_user_archives_supplier us ON us.user_archives_id = ua.id
+        LEFT JOIN t_b_sop_info sop ON sop.crm_no = d.crm_no
+        AND sop.sop_no = d.sop_no
+        LEFT JOIN sys_custom c ON c.id = sop.custom_id
+        LEFT JOIN t_f_flow_approve f ON f.flow_id = d.flow_id
+        <where>
+            <if test="serviceId != null and serviceId != ''">
+                and d.service_id = #{serviceId}
+            </if>
+            <if test="createId != null and createId != ''">
+                and f.create_id = #{create_id}
+            </if>
+            <if test="userName != null and userName != ''">
+                and u.real_name like concat('%', #{userName} , '%')
+            </if>
+            <if test="supplierId != null and supplierId != ''">
+                and ud.supplier_id = #{supplierId}
+            </if>
+            <if test="custom != null and custom != ''">
+                and c.name like concat('%', #{custom} , '%')
+            </if>
+            <if test="sopNo != null and sopNo != ''">
+                and d.sop_no like concat('%', #{sopNo} , '%')
+            </if>
+        </where>
+    </select>
+</mapper>

+ 1 - 0
sop-business/src/main/resources/mapper/TBServiceRegionMapper.xml

@@ -16,6 +16,7 @@
                 LEFT JOIN
             sys_user leader ON tbsr.lead_id = leader.id
         <where>
+            AND tbsr.enable
             AND tbs.enable
             <if test="serviceUnitId != null">
                 AND tbsr.service_id = #{serviceUnitId}

+ 5 - 1
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -132,12 +132,16 @@ public class SystemConstant {
     public static final String PREFIX_URL_LOG = "/sys/log";
     public static final String PREFIX_URL_NOTICE = "/sys/notice";
     public static final String PREFIX_URL_MESSAGE = "/sys/message";
-    public static final String PREFIX_URL_SERVICE_UNIT = "/service/unit";
+    public static final String PREFIX_URL_SERVICE_CRM = "/service/crm";
+    public static final String PREFIX_URL_SERVICE_SERVICE_UNIT = "/service/service/unit";
+    public static final String PREFIX_URL_SERVICE_SERVICE_SCOPE = "/service/service/scope";
+    public static final String PREFIX_URL_SERVICE_SERVICE_REGION = "/service/service/region";
     public static final String PREFIX_URL_ROLE = "/admin/role";
     public static final String PREFIX_URL_DELAY_WARN = "/admin/tb/delay/warn";
     public static final String PREFIX_URL_DELAY_WARN_DETAIL = "/admin/tb/delay/warn/detail";
     public static final String PREFIX_URL_VIOLATION = "/admin/tb/violation";
     public static final String PREFIX_URL_VIOLATION_DETAIL = "/admin/tb/violation/detail";
+    public static final String PREFIX_URL_DING = "/admin/tb/ding";
 
     /**
      * 缓存配置

+ 4 - 3
sop-server/src/main/java/com/qmth/sop/server/api/SysDeviceController.java

@@ -9,6 +9,7 @@ import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.sop.business.bean.result.EditResult;
+import com.qmth.sop.business.bean.result.SysDeviceResult;
 import com.qmth.sop.business.entity.SysDevice;
 import com.qmth.sop.business.entity.SysLevel;
 import com.qmth.sop.business.entity.TFCustomFlow;
@@ -47,12 +48,12 @@ public class SysDeviceController {
    
     @ApiOperation(value = "设备配置表查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "设备配置表列表信息", response = SysDevice.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "设备配置表列表信息", response = SysDeviceResult.class)})
     public Result query(
                 @ApiParam(value = "查询条件", required = false) @RequestParam(required = false) String query,
                 @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                 @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<SysDevice> resultIPage = sysDeviceService.query(new Page<>(pageNumber, pageSize),query);
+        IPage<SysDeviceResult> resultIPage = sysDeviceService.query(new Page<>(pageNumber, pageSize),query);
 
         return ResultUtil.ok(resultIPage);
     }
@@ -93,7 +94,7 @@ public class SysDeviceController {
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "设备配置表列表", response = SysDevice.class)})
     public Result list(@ApiParam(value = "查询条件", required = false) @RequestParam(required = false) Boolean enable) {
-        return ResultUtil.ok(sysDeviceService.list(Objects.nonNull(enable)?new QueryWrapper<SysDevice>().lambda().eq(SysDevice::getEnable, enable):new QueryWrapper<>()));
+        return ResultUtil.ok(sysDeviceService.list(new QueryWrapper<SysDevice>().lambda().eq(Objects.nonNull(enable),SysDevice::getEnable, enable)));
     }
 
     /**

+ 2 - 2
sop-server/src/main/java/com/qmth/sop/server/api/SysDingGroupController.java

@@ -100,7 +100,7 @@ public class SysDingGroupController {
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ApiResponses({@ApiResponse(code = 200, message = "考勤组表列表", response = SysDingGroup.class, responseContainer = "List")})
     public Result list(@ApiParam(value = "查询条件", required = false) @RequestParam(required = false) Boolean enable) {
-        return ResultUtil.ok(sysDingGroupService.list(Objects.nonNull(enable)?new QueryWrapper<SysDingGroup>().lambda().eq(SysDingGroup::getEnable, enable):new QueryWrapper<>()));
+        return ResultUtil.ok(sysDingGroupService.list(new QueryWrapper<SysDingGroup>().lambda().eq(Objects.nonNull(enable),SysDingGroup::getEnable, enable)));
     }
     /**
      * 获取单个
@@ -114,7 +114,7 @@ public class SysDingGroupController {
     public Result get(@ApiParam(value = "id", required = true) @RequestParam(value = "id") long id) {
         SysDingGroup sysDingGroup = sysDingGroupService.getById(id);
         SysDingGroupResult sysDingGroupResult= JSON.toJavaObject((JSON) JSON.toJSON(sysDingGroup),SysDingGroupResult.class);
-        sysDingGroupResult.setDingObjs(sysDingObjService.list(new QueryWrapper<SysDingObj>().lambda().eq(SysDingObj::getDingGroupId, id)));
+        sysDingGroupResult.setDingObjs(sysDingObjService.getList(id));
         return ResultUtil.ok(sysDingGroupResult);
     }
 

+ 1 - 1
sop-server/src/main/java/com/qmth/sop/server/api/SysLevelController.java

@@ -96,7 +96,7 @@ public class SysLevelController {
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ApiResponses({@ApiResponse(code = 200, message = "档位表列表", response = SysLevel.class)})
     public Result list(@ApiParam(value = "查询条件", required = false) @RequestParam(required = false) Boolean enable) {
-        return ResultUtil.ok(sysLevelService.list(Objects.nonNull(enable) ? new QueryWrapper<SysLevel>().lambda().eq(SysLevel::getEnable, enable) : new QueryWrapper<>()));
+        return ResultUtil.ok(sysLevelService.list(new QueryWrapper<SysLevel>().lambda().eq(Objects.nonNull(enable),SysLevel::getEnable, enable)));
     }
 
     /**

+ 4 - 2
sop-server/src/main/java/com/qmth/sop/server/api/SysSupplierController.java

@@ -7,6 +7,7 @@ import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.sop.business.entity.SysSupplier;
 import com.qmth.sop.business.service.SysSupplierService;
 import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.SupplierTypeEnum;
 import com.qmth.sop.common.util.Result;
 import com.qmth.sop.common.util.ResultUtil;
 import io.swagger.annotations.*;
@@ -87,8 +88,9 @@ public class SysSupplierController {
     @ApiOperation(value = "查询供应商表信息接口")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ApiResponses({@ApiResponse(code = 200, message = "供应商表信息", response = SysSupplier.class)})
-    public Result list(@ApiParam(value = "查询条件", required = false) @RequestParam(required = false) Boolean enable) {
-        return ResultUtil.ok(sysSupplierService.list(Objects.nonNull(enable)?new QueryWrapper<SysSupplier>().lambda().eq(SysSupplier::getEnable, enable):new QueryWrapper<>()));
+    public Result list(@ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Boolean enable,
+                       @ApiParam(value = "类型", required = false) @RequestParam(required = false) SupplierTypeEnum type) {
+        return ResultUtil.ok(sysSupplierService.list(new QueryWrapper<SysSupplier>().lambda().eq(Objects.nonNull(enable),SysSupplier::getEnable, enable).eq(Objects.nonNull(enable),SysSupplier::getType, type)));
     }
 
     /**

+ 6 - 1
sop-server/src/main/java/com/qmth/sop/server/api/TBCrmController.java

@@ -1,6 +1,9 @@
 package com.qmth.sop.server.api;
 
 
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.common.contant.SystemConstant;
+import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -13,8 +16,10 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2023-08-01
  */
+
+@Api(tags = "派单管理前端控制器")
 @RestController
-@RequestMapping("/t-bcrm")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SERVICE_CRM)
 public class TBCrmController {
 
 }

+ 107 - 9
sop-server/src/main/java/com/qmth/sop/server/api/TBDingController.java

@@ -1,20 +1,118 @@
 package com.qmth.sop.server.api;
 
-
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
+import com.qmth.sop.business.entity.TBDing;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBDingService;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.templete.execute.AsyncDingCountExportService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
-
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.Map;
+
 /**
- * <p>
- * 考勤打卡表 前端控制器
- * </p>
+ * 考勤打卡表 控制器
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:08
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
+@Api(tags = "考勤打卡表 Controller")
 @RestController
-@RequestMapping("/t-bding")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_DING)
+@Validated
 public class TBDingController {
 
-}
+
+    @Resource
+    TBDingService tBDingService;
+
+    @Resource
+    TBTaskService tbTaskService;
+    @Resource
+    AsyncDingCountExportService asyncDingCountExportService;
+
+    @Aac(auth = BOOL.FALSE)
+    @ApiOperation(value = "考勤打卡统计查询接口")
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考勤打卡统计查询结果", response = TBDingCountQueryResult.class)})
+    public Result query(
+            @ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+            @ApiParam(value = "提交状态", required = false) @RequestParam(required = false) String status,
+            @ApiParam(value = "提交人", required = false) @RequestParam(required = false) Long createId,
+            @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+            @ApiParam(value = "供应商", required = false) @RequestParam(required = false) Long supplierId,
+            @ApiParam(value = "客户名称(模糊查询)", required = false) @RequestParam(required = false) String custom,
+            @ApiParam(value = "SOP流水号(模糊查询)", required = false) @RequestParam(required = false) String sopNo,
+            @ApiParam(value = "违规工时", required = false) @RequestParam(required = false) Long days,
+            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<TBDingCountQueryResult> resultIPage = tBDingService.query(new Page<>(pageNumber, pageSize), serviceId, status, createId, userName, supplierId, custom, sopNo, days);
+
+        return ResultUtil.ok(resultIPage);
+    }
+
+
+    @Aac(auth = BOOL.FALSE)
+    @ApiOperation(value = "考勤打卡统计接口")
+    @RequestMapping(value = "/count", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考勤打卡统计结果", response = TBDingCountResult.class)})
+    public Result count(@ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+                        @ApiParam(value = "提交人", required = false) @RequestParam(required = false) Long createId,
+                        @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+                        @ApiParam(value = "供应商", required = false) @RequestParam(required = false) Long supplierId,
+                        @ApiParam(value = "客户名称(模糊查询)", required = false) @RequestParam(required = false) String custom,
+                        @ApiParam(value = "SOP流水号(模糊查询)", required = false) @RequestParam(required = false) String sopNo
+                       ) {
+        TBDingCountResult result = tBDingService.count(serviceId, createId, userName, supplierId, custom, sopNo);
+
+        return ResultUtil.ok(result);
+    }
+
+    @Aac(auth = BOOL.FALSE)
+    @ApiOperation(value = "考勤打卡统计导出")
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result export(@ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+                         @ApiParam(value = "提交状态", required = false) @RequestParam(required = false) String status,
+                         @ApiParam(value = "提交人", required = false) @RequestParam(required = false) Long createId,
+                         @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+                         @ApiParam(value = "供应商", required = false) @RequestParam(required = false) Long supplierId,
+                         @ApiParam(value = "客户名称(模糊查询)", required = false) @RequestParam(required = false) String custom,
+                         @ApiParam(value = "SOP流水号(模糊查询)", required = false) @RequestParam(required = false) String sopNo,
+                         @ApiParam(value = "违规工时", required = false) @RequestParam(required = false) Long days) throws Exception {
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.DING_COUNT_EXPORT);
+        map.putIfAbsent("serviceId", serviceId);
+        map.putIfAbsent("status", status);
+        map.putIfAbsent("createId", createId);
+        map.putIfAbsent("userName", userName);
+        map.putIfAbsent("supplierId", supplierId);
+        map.putIfAbsent("custom", custom);
+        map.putIfAbsent("sopNo", sopNo);
+        map.putIfAbsent("days", days);
+        asyncDingCountExportService.exportTask(map);
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        return ResultUtil.ok(tbTask.getId());
+    }
+
+}

+ 1 - 1
sop-server/src/main/java/com/qmth/sop/server/api/TBServiceController.java

@@ -31,7 +31,7 @@ import javax.validation.constraints.Min;
  */
 @Api(tags = "服务单元管理前端控制器")
 @RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SERVICE_UNIT)
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SERVICE_SERVICE_UNIT)
 public class TBServiceController {
     @Resource
     private TBServiceService tbServiceService;

+ 48 - 4
sop-server/src/main/java/com/qmth/sop/server/api/TBServiceRegionController.java

@@ -1,9 +1,21 @@
 package com.qmth.sop.server.api;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.bean.params.ServiceRegionParam;
+import com.qmth.sop.business.bean.result.ServiceRegionResult;
+import com.qmth.sop.business.service.TBServiceRegionService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 
 /**
  * <p>
@@ -13,8 +25,40 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2023-08-01
  */
+@Api(tags = "服务区域规划前端控制器")
 @RestController
-@RequestMapping("/t-bservice-region")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SERVICE_SERVICE_REGION)
 public class TBServiceRegionController {
+    @Resource
+    private TBServiceRegionService tbServiceRegionService;
 
-}
+    @ApiOperation(value = "服务区域规划-分页查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = ServiceRegionResult.class)})
+    public Result findServiceRegionPage(@ApiParam(value = "服务单元id") @RequestParam(required = false) String serviceUnitId,
+                                        @ApiParam(value = "大区经理") @RequestParam(required = false) String leadId,
+                                        @ApiParam(value = "城市") @RequestParam(required = false) String city,
+                                        @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+
+        return ResultUtil.ok(tbServiceRegionService.findServiceRegionPage(SystemConstant.convertIdToLong(serviceUnitId), SystemConstant.convertIdToLong(leadId), city, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "服务区域规划-编辑")
+    @RequestMapping(value = "/edit", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "操作成功", response = Result.class)})
+    public Result bindCrmWithServiceBatch(@Valid @RequestBody ServiceRegionParam serviceRegionParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(tbServiceRegionService.editServiceRegion(serviceRegionParam));
+    }
+
+    @ApiOperation(value = "服务区域规划-删除")
+    @RequestMapping(value = "/remove", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = ServiceRegionResult.class)})
+    public Result removeServiceRegion(@ApiParam(value = "服务单元id") @RequestParam(required = false) String serviceUnitId) {
+        tbServiceRegionService.removeServiceRegion(SystemConstant.convertIdToLong(serviceUnitId));
+        return ResultUtil.ok();
+    }
+}

+ 73 - 4
sop-server/src/main/java/com/qmth/sop/server/api/TBServiceScopeController.java

@@ -1,9 +1,22 @@
 package com.qmth.sop.server.api;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.bean.params.ServiceScopeParam;
+import com.qmth.sop.business.bean.result.CrmServiceResult;
+import com.qmth.sop.business.service.TBCrmService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.ProductTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 
 /**
  * <p>
@@ -13,8 +26,64 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2023-08-01
  */
+@Api(tags = "服务范围管理前端控制器")
 @RestController
-@RequestMapping("/t-bservice-scope")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SERVICE_SERVICE_SCOPE)
 public class TBServiceScopeController {
+    @Resource
+    private TBCrmService tbCrmService;
 
-}
+    @ApiOperation(value = "服务范围管理-分页查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = CrmServiceResult.class)})
+    public Result findServiceScopePage(@ApiParam(value = "服务单元id") @RequestParam(required = false) String serviceUnitId,
+                                       @ApiParam(value = "城市") @RequestParam(required = false) String city,
+                                       @ApiParam(value = "客户类型") @RequestParam(required = false) ProductTypeEnum productType,
+                                       @ApiParam(value = "客户名称") @RequestParam(required = false) String customName,
+                                       @ApiParam(value = "派单绑定状态") @RequestParam(required = false) Boolean bindStatus,
+                                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+
+        return ResultUtil.ok(tbCrmService.findServiceScopePage(SystemConstant.convertIdToLong(serviceUnitId), city, productType, customName, bindStatus, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "服务范围管理-新增服务范围-未绑定派单分页查询")
+    @RequestMapping(value = "/unbind/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = CrmServiceResult.class)})
+    public Result findUnbindOrderPage(@ApiParam(value = "派单人") @RequestParam(required = false) String crmUserId,
+                                      @ApiParam(value = "客户类型") @RequestParam(required = false) ProductTypeEnum productType,
+                                      @ApiParam(value = "客户名称") @RequestParam(required = false) String customName,
+                                      @ApiParam(value = "项目单号") @RequestParam(required = false) String crmNo,
+                                      @ApiParam(value = "派单时间-起始") @RequestParam(required = false) Long startTime,
+                                      @ApiParam(value = "派单时间-截止") @RequestParam(required = false) Long endTime,
+                                      @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                                      @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(tbCrmService.findUnbindOrderPage(SystemConstant.convertIdToLong(crmUserId), productType, customName, crmNo, startTime, endTime, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "服务范围管理-批量划定派单和服务单元关系")
+    @RequestMapping(value = "/bind_batch", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "操作成功", response = Result.class)})
+    public Result bindCrmWithServiceBatch(@Valid @RequestBody ServiceScopeParam serviceScopeParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        tbCrmService.bindCrmWithServiceBatch(serviceScopeParam);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "服务范围管理-移出")
+    @RequestMapping(value = "/unbind", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "操作成功", response = Result.class)})
+    public Result unbind(@ApiParam(value = "派单id") @RequestParam(required = false) String crmId) {
+        tbCrmService.unbindCrmWithService(SystemConstant.convertIdToLong(crmId));
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "服务范围管理-派单小计")
+    @RequestMapping(value = "/subTotal", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findCrmSubTotalData() {
+        return ResultUtil.ok(tbCrmService.findCrmSubTotalData());
+    }
+}