Эх сурвалжийг харах

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

wangliang 1 жил өмнө
parent
commit
2f10fd057f

+ 216 - 0
sop-api/src/main/java/com/qmth/sop/server/api/ServiceAnalyseController.java

@@ -0,0 +1,216 @@
+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.constant.ApiConstant;
+import com.qmth.sop.business.bean.result.TBCrmResult;
+import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
+import com.qmth.sop.business.entity.TBService;
+import com.qmth.sop.business.service.ServiceAnalyseService;
+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.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.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 服务单元分析 控制器
+ *
+ * @author: shudonghui
+ * @date: 2023-08-14 15:55:18
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
+ */
+@Api(tags = "服务单元分析 Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/service/analyse")
+public class ServiceAnalyseController {
+
+
+    @Resource
+    ServiceAnalyseService serviceAnalyseService;
+
+
+
+    //服务单元列表
+   
+    @ApiOperation(value = "服务单元列表接口")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "服务单元列表", response = TBService.class)})
+    public Result list(@ApiParam(value = "年度", required = true) @RequestParam String year) {
+        List<TBService> list = serviceAnalyseService.list(year);
+        return ResultUtil.ok(list);
+    }
+
+
+    /**
+     * 4.服务单元概览
+     * ①项目执行进度=服务单元下已完成的派单(研究生派单下SOP已完结;教务处派单下已有完成的SOP,无在执行的SOP。可能存在教务处多个SOP之间空窗期导致数据的误差,这个指标允许少量误差存在);
+     * ②设备出库总量:当前服务单元下已出库且尚未入库的设备总量;
+     * ③设备占用率:(设备出库总量÷正常设备总量)×100%;
+     * ④在服务人员总数:在执行的SOP现场服务人员数量,包括助理工程师、实施工程师、区域协调人;
+     * ⑤现场人员占用率:(在服务人员总数÷认证有效的在服务人员总数)×100%;
+     * ⑥以上指标都不需提供【数据下钻】;
+     */
+
+   
+    @ApiOperation(value = "服务单元概览接口")
+    @RequestMapping(value = "/overview", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "服务单元概览", response = Map.class)})
+    public Result overview(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId) {
+        Map<String, Object> map = serviceAnalyseService.overview(serviceUnitId);
+        return ResultUtil.ok(map);
+    }
+
+    /**
+     * 5.人力供应商项目数量分布及占比:
+     * ①当前服务单元已划分了区域协调人的项目总数、供应商分布占比;
+     * ②派单数:可提供【数据下钻】,点击派单数后可显示该服务单元下已调配了区域协调人的派单项目明细;明细表需要增加“服务单元”、“供应商”字段;
+     * ③供应商:点击供应商,显示当前供应商在该服务单元下的派单项目明细;明细表需要增加“服务单元”、“供应商”字段;
+     */
+
+   
+    @ApiOperation(value = "人力供应商项目数量分布及占比")
+    @RequestMapping(value = "/supplier", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "人力供应商项目数量分布及占比", response = Map.class)})
+    public Result supplier(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId) {
+        Map<String, Object> map = serviceAnalyseService.supplier(serviceUnitId);
+        return ResultUtil.ok(map);
+    }
+
+    /**
+     * ②派单数:可提供【数据下钻】,点击派单数后可显示该服务单元下已调配了区域协调人的派单项目明细;明细表需要增加“服务单元”、“供应商”字段;
+     * ③供应商:点击供应商,显示当前供应商在该服务单元下的派单项目明细;明细表需要增加“服务单元”、“供应商”字段;
+     */
+
+   
+    @ApiOperation(value = "派单明细")
+    @RequestMapping(value = "/supplier/detail", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "派单明细", response = TBCrmResult.class)})
+    public Result dispatch(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId,
+                           @ApiParam(value = "供应商") @RequestParam(required = false) Long supplierId,
+                           @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<TBCrmResult> resultIPage = serviceAnalyseService.supplierDetail(new Page<>(pageNumber, pageSize), serviceUnitId, supplierId);
+
+        return ResultUtil.ok(resultIPage);
+    }
+
+    /**
+     * 6.人力供应商项目角色人员分布:
+     * ①默认选中当前服务单元下项目调配人数最多的人力供应商;
+     * ②显示当前供应商提供的项目角色各自的人数占比;
+     * ③覆盖大区:统计当前服务单元下该供应商区域协调人负责的项目覆盖的大区数量及明细;
+     */
+
+   
+    @ApiOperation(value = "人力供应商项目角色人员分布")
+    @RequestMapping(value = "/supplier/role", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "人力供应商项目角色人员分布", response = Map.class)})
+    public Result role(
+            @ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId,
+            @ApiParam(value = "供应商", required = true) @RequestParam Long supplierId) {
+        List<Map<String,Object>> list = serviceAnalyseService.supplierRole(supplierId);
+        return ResultUtil.ok(list);
+    }
+
+    /**
+     * * ③覆盖大区:统计当前服务单元下该供应商区域协调人负责的项目覆盖的大区数量及明细;
+     */
+   
+    @ApiOperation(value = "人力供应商覆盖大区")
+    @RequestMapping(value = "/supplier/region", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "人力供应商覆盖大区", response = Map.class)})
+    public Result region(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId,
+                         @ApiParam(value = "供应商", required = true) @RequestParam Long supplierId) {
+        List<Map<String,Object>> list = serviceAnalyseService.supplierRegion(serviceUnitId, supplierId);
+        return ResultUtil.ok(list);
+    }
+
+    /**
+     * 统计当前服务单元下该供应商区域协调人负责的项目覆盖的大区明细;
+     */
+   
+    @ApiOperation(value = "人力供应商覆盖大区明细")
+    @RequestMapping(value = "/supplier/region/detail", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "人力供应商覆盖大区", response = Map.class)})
+    public Result regionDetail(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId,
+                               @ApiParam(value = "供应商", required = true) @RequestParam Long supplierId,
+                               @ApiParam(value = "大区", required = true) @RequestParam String province) {
+        Map<String,Object> map=new HashMap<>();
+        map.put("projectRoleQuota", serviceAnalyseService.findCrmAllocationSubTotal(serviceUnitId,province,supplierId));
+        List<UserArchivesAllocationResult> crmAllocation = serviceAnalyseService.findCrmAllocation(serviceUnitId, province, supplierId);
+        map.put("projectWait", crmAllocation.stream().filter(e->e.getDistributed()<e.getQuota()).count());
+        map.put("regionCities", crmAllocation.stream().collect(Collectors.groupingBy(UserArchivesAllocationResult::getCity, Collectors.counting())));
+        return ResultUtil.ok(map);
+    }
+
+    /**
+     * 7.项目调配完成进度=(差额为0的派单总数÷派单总数)×100%;不提供【数据下钻】
+     */
+   
+    @ApiOperation(value = "项目调配完成进度")
+    @RequestMapping(value = "/project/allocation", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "项目调配完成进度", response = Long.class) })
+    public Result allocation(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId) {
+        List<UserArchivesAllocationResult> crmAllocation = serviceAnalyseService.findCrmAllocation(serviceUnitId, null, null);
+        return ResultUtil.ok(crmAllocation.stream().filter(e->e.getDistributed()<e.getQuota()).count()*100/crmAllocation.size());
+    }
+
+    /**
+     * 8.人员配额完成进度=(已分配人员数量÷总配额)×100%;不提供【数据下钻】
+     */
+   
+    @ApiOperation(value = "人员配额完成进度")
+    @RequestMapping(value = "/personnel/quota", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "人员配额完成进度", response = Long.class)})
+    public Result quota(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId) {
+        List<UserArchivesAllocationResult> list = serviceAnalyseService.findCrmAllocation(serviceUnitId, null, null);
+        int quota = list.stream().mapToInt(UserArchivesAllocationResult::getQuota).sum();
+        int distributed = list.stream().mapToInt(UserArchivesAllocationResult::getDistributed).sum();
+        return ResultUtil.ok(distributed*100/quota);
+    }
+
+    /**
+     * 9.设备供应商设备使用占比:当前服务单元下各设备供应商提供已出库尚未出库的设备的数量及占比;
+     */
+   
+    @ApiOperation(value = "设备供应商设备使用占比")
+    @RequestMapping(value = "/device/use", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "设备供应商设备使用占比", response = Map.class)})
+    public Result device(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId) {
+        List<Map<String, Object>> list = serviceAnalyseService.device(serviceUnitId);
+        return ResultUtil.ok(list);
+    }
+
+
+
+    /**
+     * 10.大区服务人数分布及对比:
+     *①当前服务单元下各大区在服务人员的数量分布及对比。单个柱形图可按供应商占比分颜色展示占比。
+     */
+   
+    @ApiOperation(value = "大区服务人数分布及对比")
+    @RequestMapping(value = "/region/personnel", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "大区服务人数分布及对比", response = Map.class)})
+    public Result personnel(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId) {
+        List<Map<String, Object>> list= serviceAnalyseService.personnel(serviceUnitId);
+        return ResultUtil.ok(list);
+    }
+
+
+
+}

+ 48 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/ServiceAnalyseMapper.java

@@ -0,0 +1,48 @@
+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.TBCrmResult;
+import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
+import com.qmth.sop.business.entity.TBService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * </p>
+ *
+ * @author dhshu
+ *
+ */
+public interface ServiceAnalyseMapper extends BaseMapper<TBService> {
+
+
+    List<TBService> list(@Param("year") String year);
+
+    Long projectProgress(@Param("serviceUnitId") Long serviceUnitId);
+
+    Integer servicePersonnelTotal(@Param("serviceUnitId") Long serviceUnitId);
+
+    Integer equipmentOutboundTotal(@Param("serviceUnitId") Long serviceUnitId);
+
+    Integer projectCount(@Param("serviceUnitId") Long serviceUnitId);
+
+    List<Map<String,Object>> supplierDistribution(@Param("serviceUnitId") Long serviceUnitId);
+
+    IPage<TBCrmResult> crmDetail(Page<Object> iPage, @Param("serviceUnitId") Long serviceUnitId,@Param("supplierId") Long supplierId);
+
+    List<Map<String,Object>> supplierRole(@Param("supplierId") Long supplierId);
+
+    List<Map<String,Object>> supplierRegion(@Param("serviceUnitId") Long serviceUnitId,@Param("supplierId") Long supplierId);
+
+
+    List<Map<String, Object>> device(@Param("serviceUnitId")Long serviceUnitId);
+
+    List<Map<String, Object>> personnel(@Param("serviceUnitId")Long serviceUnitId);
+
+    List<UserArchivesAllocationResult> findCrmAllocation(@Param("serviceUnitId")Long serviceUnitId,@Param("province") String province,@Param("supplierId") Long supplierId);
+}

+ 2 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/TBUserArchivesSupplierMapper.java

@@ -18,4 +18,6 @@ import java.util.List;
 public interface TBUserArchivesSupplierMapper extends BaseMapper<TBUserArchivesSupplier> {
 public interface TBUserArchivesSupplierMapper extends BaseMapper<TBUserArchivesSupplier> {
 
 
     List<SysUser> findUsersBySupplierId(@Param("supplierId") Long supplierId);
     List<SysUser> findUsersBySupplierId(@Param("supplierId") Long supplierId);
+
+    Integer countAuthentication();
 }
 }

+ 34 - 0
sop-business/src/main/java/com/qmth/sop/business/service/ServiceAnalyseService.java

@@ -0,0 +1,34 @@
+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.TBCrmResult;
+import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
+import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
+import com.qmth.sop.business.entity.TBService;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ServiceAnalyseService extends IService<TBService> {
+    List<TBService> list(String year);
+
+    Map<String, Object> overview(Long serviceUnitId);
+
+    Map<String, Object> supplier(Long serviceUnitId);
+
+    IPage<TBCrmResult> supplierDetail(Page<Object> objectPage, Long serviceUnitId, Long supplierId);
+
+    List<Map<String,Object>> supplierRole(Long supplierId);
+
+    List<Map<String,Object>> supplierRegion(Long serviceUnitId,Long supplierId);
+
+    List<Map<String, Object>> device(Long serviceUnitId);
+
+    List<Map<String, Object>> personnel(Long serviceUnitId);
+
+    UserArchivesAllocationSubTotalResult findCrmAllocationSubTotal(Long serviceUnitId, String province, Long supplierId);
+
+    List<UserArchivesAllocationResult> findCrmAllocation(Long serviceUnitId, String province, Long supplierId);
+}

+ 2 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBUserArchivesSupplierService.java

@@ -17,4 +17,6 @@ import java.util.List;
 public interface TBUserArchivesSupplierService extends IService<TBUserArchivesSupplier> {
 public interface TBUserArchivesSupplierService extends IService<TBUserArchivesSupplier> {
 
 
     List<SysUser> findUsers(Long supplierId);
     List<SysUser> findUsers(Long supplierId);
+
+    Integer countAuthentication();
 }
 }

+ 136 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/ServiceAnalyseServiceImpl.java

@@ -0,0 +1,136 @@
+package com.qmth.sop.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.TBCrmResult;
+import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
+import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
+import com.qmth.sop.business.entity.SysDevice;
+import com.qmth.sop.business.entity.TBService;
+import com.qmth.sop.business.mapper.ServiceAnalyseMapper;
+import com.qmth.sop.business.service.ServiceAnalyseService;
+import com.qmth.sop.business.service.SysDeviceService;
+import com.qmth.sop.business.service.TBUserArchivesSupplierService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.CrmStatusEnum;
+import com.qmth.sop.common.enums.DeviceStatusEnum;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class ServiceAnalyseServiceImpl extends ServiceImpl<ServiceAnalyseMapper, TBService> implements ServiceAnalyseService {
+
+    @Resource
+    SysDeviceService sysDeviceService;
+
+    @Resource
+    TBUserArchivesSupplierService tbUserArchivesSupplierService;
+
+    @Override
+    public List<TBService> list(String year) {
+        return this.baseMapper.list(year);
+    }
+
+    /**
+     * 4.服务单元概览
+     * ①项目执行进度=服务单元下已完成的派单(研究生派单下SOP已完结;教务处派单下已有完成的SOP,无在执行的SOP。可能存在教务处多个SOP之间空窗期导致数据的误差,这个指标允许少量误差存在);
+     * ②设备出库总量:当前服务单元下已出库且尚未入库的设备总量;
+     * ③设备占用率:(设备出库总量÷正常设备总量)×100%;
+     * ④在服务人员总数:在执行的SOP现场服务人员数量,包括助理工程师、实施工程师、区域协调人;
+     * ⑤现场人员占用率:(在服务人员总数÷认证有效的在服务人员总数)×100%;
+     */
+    @Override
+    public Map<String, Object> overview(Long serviceUnitId) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("projectProgress", this.baseMapper.projectProgress(serviceUnitId));
+        map.put("equipmentOutboundTotal", this.baseMapper.equipmentOutboundTotal(serviceUnitId));
+        int totalDevices = sysDeviceService.count(new LambdaQueryWrapper<SysDevice>().eq(SysDevice::getStatus, DeviceStatusEnum.NORMAL));
+        map.put("equipmentOccupancyRate", ((Integer) map.get("equipmentOutboundTotal")) * 100 / totalDevices);
+        map.put("servicePersonnelTotal", this.baseMapper.servicePersonnelTotal(serviceUnitId));
+        //认证有效的人员总数
+        int totalUserArchives = tbUserArchivesSupplierService.countAuthentication();
+        map.put("sitePersonnelOccupancyRate", ((Integer) map.get("servicePersonnelTotal")) * 100 / totalUserArchives);
+        return map;
+    }
+
+    /**
+     * ①当前服务单元已划分了区域协调人的项目总数、供应商分布占比;
+     */
+    @Override
+    public Map<String, Object> supplier(Long serviceUnitId) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("projectCount", this.baseMapper.projectCount(serviceUnitId));
+        List<Map<String, Object>> maps = this.baseMapper.supplierDistribution(serviceUnitId);
+        maps = maps.stream().peek(m -> m.put("percent", ((Long) m.get("count")) * 100 / ((Integer) map.get("projectCount")) + "%")).collect(Collectors.toList());
+        map.put("supplierDistribution", maps);
+        return map;
+    }
+
+    @Override
+    public IPage<TBCrmResult> supplierDetail(Page<Object> iPage, Long serviceUnitId, Long supplierId) {
+        return this.baseMapper.crmDetail(iPage, serviceUnitId,supplierId);
+    }
+
+    @Override
+    public  List<Map<String,Object>> supplierRole(Long supplierId) {
+        return this.baseMapper.supplierRole(supplierId);
+    }
+
+    @Override
+    public  List<Map<String,Object>> supplierRegion(Long serviceUnitId, Long supplierId) {
+        return this.baseMapper.supplierRegion(serviceUnitId, supplierId);
+    }
+
+
+    @Override
+    public List<Map<String, Object>> device(Long serviceUnitId) {
+        return this.baseMapper.device(serviceUnitId);
+    }
+
+    @Override
+    public List<Map<String, Object>> personnel(Long serviceUnitId) {
+        return this.baseMapper.personnel(serviceUnitId);
+    }
+
+
+    @Override
+    public UserArchivesAllocationSubTotalResult findCrmAllocationSubTotal(Long serviceUnitId, String province, Long supplierId) {
+        province = SystemConstant.translateSpecificSign(province);
+
+        List<UserArchivesAllocationResult> list = this.baseMapper.findCrmAllocation(serviceUnitId, province, supplierId);
+        Integer publishedCrmCount = Math.toIntExact(list.stream().filter(e -> CrmStatusEnum.PUBLISH.equals(e.getCrmStatus())).count());
+        Integer totalCrmCount = list.size();
+
+        Integer coordinatorQuota = list.stream().mapToInt(UserArchivesAllocationResult::getCoordinatorQuota).sum();
+        Integer coordinatorDistributed = list.stream().mapToInt(UserArchivesAllocationResult::getCoordinatorDistributed).sum();
+
+        Integer effectQuota = list.stream().mapToInt(UserArchivesAllocationResult::getEffectQuota).sum();
+        Integer effectDistributed = list.stream().mapToInt(UserArchivesAllocationResult::getEffectDistributed).sum();
+
+        Integer assistantQuota = list.stream().mapToInt(UserArchivesAllocationResult::getAssistantQuota).sum();
+        Integer assistantDistributed = list.stream().mapToInt(UserArchivesAllocationResult::getAssistantDistributed).sum();
+
+        UserArchivesAllocationSubTotalResult result = new UserArchivesAllocationSubTotalResult();
+        result.setPublishedCrmCount(publishedCrmCount);
+        result.setTotalCrmCount(totalCrmCount);
+        result.setCoordinatorDistributed(coordinatorDistributed);
+        result.setCoordinatorQuota(coordinatorQuota);
+        result.setEffectDistributed(effectDistributed);
+        result.setEffectQuota(effectQuota);
+        result.setAssistantDistributed(assistantDistributed);
+        result.setAssistantQuota(assistantQuota);
+        return result;
+    }
+
+    @Override
+    public List<UserArchivesAllocationResult> findCrmAllocation(Long serviceUnitId, String province, Long supplierId) {
+        return this.baseMapper.findCrmAllocation(serviceUnitId, province, supplierId);
+    }
+}

+ 5 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBUserArchivesSupplierServiceImpl.java

@@ -24,4 +24,9 @@ public class TBUserArchivesSupplierServiceImpl extends ServiceImpl<TBUserArchive
     public List<SysUser> findUsers(Long supplierId) {
     public List<SysUser> findUsers(Long supplierId) {
         return this.baseMapper.findUsersBySupplierId(supplierId) ;
         return this.baseMapper.findUsersBySupplierId(supplierId) ;
     }
     }
+
+    @Override
+    public Integer countAuthentication() {
+        return this.baseMapper.countAuthentication() ;
+    }
 }
 }

+ 299 - 0
sop-business/src/main/resources/mapper/ServiceAnalyseMapper.xml

@@ -0,0 +1,299 @@
+<?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.ServiceAnalyseMapper">
+    <select id="list" resultType="com.qmth.sop.business.entity.TBService">
+        select * from t_b_service s
+        <where>
+            and s.status in ('PUBLISH','FINISH')
+
+            <if test="year != null and year != ''">
+                and YEAR ( FROM_UNIXTIME( s.start_time / 1000 ))= #{year}
+            </if>
+
+        </where>
+        order by s.start_time desc
+    </select>
+    <select id="equipmentOutboundTotal" resultType="java.lang.Integer">
+        SELECT
+        sum(case when d.bound='OUT' then 1 else 0 end ) OUTS
+        FROM
+        t_b_service s
+        LEFT JOIN t_b_crm c ON c.service_id = s.id
+        left join t_b_device_in_out io on io.service_id=s.id
+        left join sys_device d on d.device_code=io.device_no
+        <where>
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and s.id = #{serviceUnitId}
+            </if>
+        </where>
+    </select>
+    <select id="projectProgress" resultType="java.lang.Long">
+        SELECT
+        sum(case when c.`status`='FINISH' then 1 else 0 end)*100/count(c.id)
+        FROM
+        t_b_service s
+        LEFT JOIN t_b_crm c ON c.service_id = s.id
+        <where>
+
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and s.id = #{serviceUnitId}
+            </if>
+
+        </where>
+    </select>
+    <select id="servicePersonnelTotal" resultType="java.lang.Integer">
+        SELECT
+        count( sd.region_user_id )+
+        count( sd.engineer_user_id )+
+        SUM( length( sd.assistant_engineer_user_ids )- length( REPLACE ( sd.assistant_engineer_user_ids, ',', '' ))+ 1 )
+        FROM
+        t_b_service s
+        LEFT JOIN t_b_sop_info sop ON sop.service_id = s.id
+        LEFT JOIN t_b_sop_info_detail sd ON sd.sop_info_id = sop.id
+        <where>
+
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and s.id = #{serviceUnitId}
+            </if>
+
+        </where>
+    </select>
+    <select id="projectCount" resultType="java.lang.Integer">
+        SELECT
+        count( c.id )
+        FROM
+        t_b_service s
+        LEFT JOIN t_b_crm c ON c.service_id = s.id
+        <where>
+            and c.region_coordinator_id is not null
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and s.id = #{serviceUnitId}
+            </if>
+
+        </where>
+    </select>
+    <select id="supplierDistribution" resultType="java.util.Map">
+        SELECT
+        su.id,
+        su.`name`,
+        count(DISTINCT c.id ) count
+        FROM
+        t_b_user_archives_allocation aa
+        LEFT JOIN t_b_crm c ON c.service_id = aa.service_id
+        LEFT JOIN t_b_user_archives_supplier uas ON uas.user_archives_id = aa.archives_id
+        LEFT JOIN sys_supplier su ON su.id = uas.supplier_id
+                <where>
+
+                    <if test="serviceUnitId != null and serviceUnitId != ''">
+                        and aa.service_id = #{serviceUnitId}
+                    </if>
+                </where>
+        GROUP BY
+        su.id,
+        su.`name`
+    </select>
+    <select id="crmDetail" resultType="com.qmth.sop.business.bean.result.TBCrmResult">
+        SELECT
+        a.*,
+        tbs.name service,
+        cru.real_name crm_user_name,
+        sc.NAME custom,
+        sc.type custom_type,
+        p.name product,
+        lu.real_name leadName,
+        cu.real_name createName,
+        tbs.status serviceUnitStatus,
+        u.real_name regionCoordinator,
+        su.name supplier
+        FROM
+        t_b_crm a
+        LEFT JOIN sys_user cru ON cru.id = a.crm_user_id
+        LEFT JOIN sys_user lu ON lu.id = a.lead_id
+        LEFT JOIN sys_user cu ON cu.id = a.create_id
+        LEFT JOIN t_b_product p ON p.id = a.product_id
+        LEFT JOIN t_b_service tbs ON a.service_id = tbs.id
+        left join t_b_service_region r on r.service_id=tbs.id
+        LEFT JOIN sys_custom sc ON sc.id = a.custom_id
+
+        LEFT JOIN sys_user u ON u.id = a.region_coordinator_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 sys_supplier su ON su.id = us.supplier_id
+        <where>
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and a.service_id = #{serviceUnitId}
+            </if>
+
+            <if test="supplierId != null and supplierId != ''">
+                and su.id = #{supplierId}
+            </if>
+        </where>
+
+        ORDER BY
+        a.create_time DESC
+    </select>
+    <select id="supplierRole" resultType="java.util.Map">
+        SELECT
+        r.NAME,
+        count( DISTINCT ua.archives_id ) count
+        FROM
+        t_b_user_archives_allocation ua
+        LEFT JOIN sys_role r ON r.id = ua.role_id
+        LEFT JOIN t_b_user_archives_supplier us ON us.user_archives_id = ua.archives_id
+        <where>
+            and us.authentication_valid_time > UNIX_TIMESTAMP()* 1000
+            <if test="supplierId != null and supplierId != ''">
+                and us.supplier_id = #{supplierId}
+            </if>
+        </where>
+        GROUP BY
+        r.NAME
+    </select>
+    <select id="supplierRegion" resultType="java.util.Map">
+        SELECT DISTINCT
+        rd.province
+        FROM
+        t_b_crm c
+        LEFT JOIN t_b_service_region sr ON c.service_id = sr.service_id
+        LEFT JOIN t_b_service_region_detail rd ON rd.service_region_id = sr.id
+        LEFT JOIN t_b_user_archives_allocation ua ON ua.user_id = c.region_coordinator_id
+        LEFT JOIN t_b_user_archives_supplier us ON us.user_archives_id = ua.archives_id
+        <where>
+            and rd.id IS NOT NULL
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and c.service_id = #{serviceUnitId}
+            </if>
+            <if test="supplierId != null and supplierId != ''">
+                and us.supplier_id = #{supplierId}
+            </if>
+        </where>
+    </select>
+    <select id="findCrmAllocation"
+            resultType="com.qmth.sop.business.bean.result.UserArchivesAllocationResult">
+        SELECT
+        *,
+        (result.effectQuota + result.assistantQuota + result.coordinatorQuota) AS quota,
+        (result.coordinatorUnDistributed + result.effectUnDistributed + result.assistantUnDistributed) AS unDistributed
+        FROM
+        (SELECT
+        tbs.id AS serviceUnitId,
+        tbs.name AS serviceUnitName,
+        tbc.id AS crmId,
+        tbc.crm_no AS crmNo,
+        su.id AS customId,
+        su.name AS customName,
+        su.type AS customType,
+        su.province AS province,
+        su.city AS city,
+        su.area AS area,
+        sl.id AS levelId,
+        sl.level AS level,
+        1 AS coordinatorQuota,
+        IFNULL(effectQ.quota, 0) AS effectQuota,
+        IFNULL(assistantQ.quota, 0) AS assistantQuota,
+        IF(tbc.region_coordinator_id IS NULL, 0, 1) AS coordinatorDistributed,
+        IFNULL(effectR.reality, 0) AS effectDistributed,
+        IFNULL(assistantR.reality, 0) AS assistantDistributed,
+        IF(tbc.region_coordinator_id IS NULL, 0, 1) + IFNULL(effectR.reality, 0) + IFNULL(assistantR.reality, 0) AS distributed,
+        IF(tbc.region_coordinator_id IS NULL, 1, 0) AS coordinatorUnDistributed,
+        IF(IFNULL(effectQ.quota, 0) - IFNULL(effectR.reality, 0) &lt; 0, 0, IFNULL(effectQ.quota, 0) - IFNULL(effectR.reality, 0)) AS effectUnDistributed,
+        IF(IFNULL(assistantQ.quota, 0) - IFNULL(assistantR.reality, 0) &lt; 0, 0, IFNULL(assistantQ.quota, 0) - IFNULL(assistantR.reality, 0)) AS assistantUnDistributed,
+        tbc.status AS crmStatus,
+        tbs.service_lead_id AS serviceUnitLeaderId,
+        tbc.lead_id AS regionManagerId,
+        rm.real_name AS regionManagerName,
+        pu.real_name AS publishUserName,
+        tbc.publish_time AS publishTime,
+        us.supplier_id
+        FROM
+        t_b_crm tbc
+        LEFT JOIN t_b_user_archives_allocation ua ON ua.user_id = tbc.region_coordinator_id
+        LEFT JOIN t_b_user_archives_supplier us ON us.user_archives_id = ua.archives_id
+        LEFT JOIN t_b_service tbs ON tbc.service_id = tbs.id
+        LEFT JOIN sys_custom su ON tbc.custom_id = su.id
+        LEFT JOIN sys_level sl ON su.level_id = sl.id
+        LEFT JOIN sys_user pu ON tbc.publish_user_id = pu.id
+        LEFT JOIN sys_user rm ON tbc.lead_id = rm.id
+        LEFT JOIN (SELECT
+        slr.quota, slr.level_id
+        FROM
+        sys_level_role slr
+        LEFT JOIN sys_role sr ON sr.id = slr.role_id
+        WHERE
+        sr.type = 'EFFECT_ENGINEER') effectQ ON effectQ.level_id = sl.id
+        LEFT JOIN (SELECT
+        slr.quota, slr.level_id
+        FROM
+        sys_level_role slr
+        LEFT JOIN sys_role sr ON sr.id = slr.role_id
+        WHERE
+        sr.type = 'ASSISTANT_ENGINEER') assistantQ ON assistantQ.level_id = sl.id
+        LEFT JOIN (SELECT
+        tbuaa.crm_no, COUNT(*) AS reality
+        FROM
+        t_b_user_archives_allocation tbuaa
+        LEFT JOIN sys_role sr ON sr.id = tbuaa.role_id
+        WHERE
+        sr.type = 'EFFECT_ENGINEER'
+        GROUP BY tbuaa.crm_no) effectR ON effectR.crm_no = tbc.crm_no
+        LEFT JOIN (SELECT
+        tbuaa.crm_no, COUNT(*) AS reality
+        FROM
+        t_b_user_archives_allocation tbuaa
+        LEFT JOIN sys_role sr ON sr.id = tbuaa.role_id
+        WHERE
+        sr.type = 'ASSISTANT_ENGINEER'
+        GROUP BY tbuaa.crm_no) assistantR ON assistantR.crm_no = tbc.crm_no ) result
+        <where>
+            <if test="serviceUnitId != null">
+                AND result.serviceUnitId = #{serviceUnitId}
+            </if>
+            <if test="province != null and province != ''">
+                AND result.province LIKE CONCAT('%',#{province},'%')
+            </if>
+            <if test="supplierId != null and supplierId != ''">
+                AND result.supplier_id = #{supplierId}
+            </if>
+        </where>
+        ORDER BY result.serviceUnitId DESC, result.crmId DESC
+    </select>
+    <select id="device" resultType="java.util.Map">
+        SELECT
+        su.`name` NAME,
+        sum( CASE WHEN d.bound = 'OUT' THEN 1 ELSE 0 END )/ sum( CASE WHEN d.`status` = 'NORMAL' THEN 1 ELSE 0 END ) percent
+        FROM
+        t_b_service s
+        LEFT JOIN t_b_device_in_out io ON io.service_id = s.id
+        LEFT JOIN sys_device d ON d.device_code = io.device_no
+        LEFT JOIN sys_supplier su ON su.id = d.supplier_id
+        <where>
+            and io.id IS NOT NULL
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and s.id = #{serviceUnitId}
+            </if>
+        </where>
+        GROUP BY
+        su.`name`
+    </select>
+    <select id="personnel" resultType="java.util.Map">
+        SELECT
+        su.`name`,
+        sc.province,
+        count( DISTINCT aa.id ) count
+        FROM
+        t_b_user_archives_allocation aa
+        LEFT JOIN t_b_crm c ON c.service_id = aa.service_id
+        LEFT JOIN sys_custom sc ON c.custom_id = sc.id
+        LEFT JOIN t_b_user_archives_supplier uas ON uas.user_archives_id = aa.archives_id
+        LEFT JOIN sys_supplier su ON su.id = uas.supplier_id
+        <where>
+            <if test="serviceUnitId != null and serviceUnitId != ''">
+                and aa.service_id = #{serviceUnitId}
+            </if>
+        </where>
+        GROUP BY
+        su.`name`,
+        sc.province
+
+    </select>
+</mapper>

+ 9 - 0
sop-business/src/main/resources/mapper/TBUserArchivesSupplierMapper.xml

@@ -13,4 +13,13 @@
         left join sys_user u on u.mobile_number=ua.mobile_number
         left join sys_user u on u.mobile_number=ua.mobile_number
         where us.supplier_id=#{supplierId}
         where us.supplier_id=#{supplierId}
     </select>
     </select>
+    <select id="countAuthentication" resultType="java.lang.Integer">
+        SELECT
+        count( DISTINCT us.user_archives_id )
+        FROM
+        t_b_user_archives_supplier us
+        WHERE
+        us.authentication_valid_time > UNIX_TIMESTAMP()*1000
+    </select>
+
 </mapper>
 </mapper>