jiaosong
2023-08-18 b42aecb23d3b2baa52fd7474282dfc1018fd066e
Merge remote-tracking branch 'origin/master'
已添加6个文件
已修改5个文件
335 ■■■■■ 文件已修改
server/src/main/java/doumeemes/api/ext/StatisticsController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/dto/statistics/StatisticsPlanDataModel.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/dto/statistics/Unqualified7DayModel.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/dto/statistics/UserProduceTopModel.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/WorkPlansExtMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/WorkorderRecordExtMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/QueryWorkPlansDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/StatisticsService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/StatisticsServiceImpl.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/WorkPlansExtMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/WorkorderRecordExtMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/ext/StatisticsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package doumeemes.api.ext;
import doumeemes.api.BaseController;
import doumeemes.core.model.ApiResponse;
import doumeemes.dao.business.dto.statistics.StatisticsPlanDataModel;
import doumeemes.dao.business.dto.statistics.Unqualified7DayModel;
import doumeemes.dao.business.dto.statistics.UserProduceTopModel;
import doumeemes.service.ext.StatisticsService;
import doumeemes.service.ext.WorkorderExtService;
import doumeemes.service.ext.WorkorderRecordExtService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * å¤§å±ç»Ÿè®¡æ•°æ®æŽ¥å£
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@RestController
@RequestMapping("/ext/statistic")
@Api(tags = "大屏数据看板-统计数据接口")
public class StatisticsController extends BaseController {
    @Autowired
    private StatisticsService statisticsService;
    @ApiOperation("数据统计,执行中、延期计划数、今日生产人数、今日生产设备数、今日不良品")
    @GetMapping("/getPlanData/{companyId}/{departId}")
    public ApiResponse<StatisticsPlanDataModel> getPlansData(@PathVariable Integer companyId, @PathVariable Integer departId) {
        return ApiResponse.success(statisticsService.getPlansData(companyId,departId));
    }
    @ApiOperation("员工产品统计TOP10")
    @GetMapping("/userProduceTop/{companyId}/{departId}")
    public ApiResponse<List<UserProduceTopModel>> getUserProducceTop(@PathVariable Integer companyId, @PathVariable Integer departId) {
        return ApiResponse.success(statisticsService.getUserProduceTopData(companyId,departId));
    }
    @ApiOperation("近7天不良品分布-不良品数量统计")
    @GetMapping("/getUnqualified7DayData/{companyId}/{departId}")
    public ApiResponse<List<Unqualified7DayModel>> getUnqualified7DayData(@PathVariable Integer companyId, @PathVariable Integer departId) {
        return ApiResponse.success(statisticsService.getUnqualified7DayData(companyId,departId));
    }
}
server/src/main/java/doumeemes/dao/business/dto/statistics/StatisticsPlanDataModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package doumeemes.dao.business.dto.statistics;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel("大屏数据看板-产品计划统计返回数据")
/**
 * æ‰§è¡Œä¸­è®¡åˆ’数:统计范围为:成品计划;状态为【执行中】;
 * å»¶æœŸè®¡åˆ’数:统计范围为:成品计划;状态为【执行中】且当前时间大于计划结束时间;
 * ä»Šæ—¥ç”Ÿäº§äººæ•°ï¼šæ ¹æ®ä»Šæ—¥æŠ•æ–™/产出记录表数据,统计今日的生产人数(去重);统计范围为工单状态为【已创建、已备料、生产中、已检验、已完工检、已报工】;
 * ä»Šæ—¥ç”Ÿäº§è®¾å¤‡ï¼šæ ¹æ®ä»Šæ—¥æŠ•æ–™/产出记录表关联的工单数据,统计今日的生产设备数(去重);统计范围为工单状态为【已创建、已备料、生产中、已检验、已完工检、已报工】;
 * ä»Šæ—¥ä¸è‰¯å“çŽ‡ï¼šæ ¹æ®ä»Šæ—¥äº§å‡ºè®°å½•è¡¨æ•°æ®ï¼Œç»Ÿè®¡ä»Šæ—¥äº§å‡ºä¸è‰¯æ•°/今日产出总数量*100%;统计范围为工单状态为【已报工】;
 */
public class StatisticsPlanDataModel {
    @ApiModelProperty(value = "执行中计划数", example = "1")
    private Integer ingNum;
    @ApiModelProperty(value = "延期计划数", example = "1")
    private Integer delayNum;
    @ApiModelProperty(value = "今日生产人数", example = "1")
    private Integer prouserNum;
    @ApiModelProperty(value = "今日生产设备数", example = "1")
    private Integer deviceNum;
    @ApiModelProperty(value = "今日不良品率", example = "1")
    private BigDecimal unqualifiedRate;
    @ApiModelProperty(value = "今日不良品数", example = "1",hidden = true)
    private BigDecimal unqualifiedNum;
    @ApiModelProperty(value = "今日报工数", example = "1",hidden = true)
    private BigDecimal doneNUm;
}
server/src/main/java/doumeemes/dao/business/dto/statistics/Unqualified7DayModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package doumeemes.dao.business.dto.statistics;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel("大屏数据看板-员工产品统计TOP10")
/**
 *  ç»Ÿè®¡èŒƒå›´ä¸ºå½“日;工单状态为【已报工】;
 * æ ¹æ®å‘˜å·¥æŠ¥å·¥è‰¯å“æ•°ç»Ÿè®¡æŽ’序;
 */
public class Unqualified7DayModel {
    @ApiModelProperty(value = "不良品数", example = "1")
    private BigDecimal unqualifiedNum;
    @ApiModelProperty(value = "日期")
    private Date createTime;
}
server/src/main/java/doumeemes/dao/business/dto/statistics/UserProduceTopModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package doumeemes.dao.business.dto.statistics;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel("大屏数据看板-员工产品统计TOP10")
/**
 *  ç»Ÿè®¡èŒƒå›´ä¸ºå½“日;工单状态为【已报工】;
 * æ ¹æ®å‘˜å·¥æŠ¥å·¥è‰¯å“æ•°ç»Ÿè®¡æŽ’序;
 */
public class UserProduceTopModel {
    @ApiModelProperty(value = "员工编码", example = "1")
    private Integer userId;
    @ApiModelProperty(value = "报工数", example = "1")
    private BigDecimal doneNum;
    @ApiModelProperty(value = "员工姓名", example = "1")
    private String userName;
    @ApiModelProperty(value = "员工电话", example = "1")
    private String phone;
}
server/src/main/java/doumeemes/dao/ext/WorkPlansExtMapper.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import doumeemes.dao.business.dto.statistics.StatisticsPlanDataModel;
import doumeemes.dao.business.model.WorkPlans;
import doumeemes.dao.business.vo.WorkPlansVO;
import doumeemes.dao.ext.dto.QueryWorkPlansDTO;
@@ -29,6 +30,8 @@
    WorkPlansVO getWorkPlansVODetail(QueryWorkPlansDTO dto);
    StatisticsPlanDataModel getPlansStaticticsData(QueryWorkPlansDTO workPlans);
//    @Select(" SELECT" +
//            " `a`.*, mmodel.CODE as materialCode, mmodel.NAME as materialName , fmodel.NAME as factoryName,usermodel.REALNAME as userName , usermodel.mobile as userMobile " +
//            " FROM `work_plans` `a`" +
server/src/main/java/doumeemes/dao/ext/WorkorderRecordExtMapper.java
@@ -1,5 +1,7 @@
package doumeemes.dao.ext;
import doumeemes.dao.business.dto.statistics.Unqualified7DayModel;
import doumeemes.dao.business.dto.statistics.UserProduceTopModel;
import doumeemes.dao.business.model.WorkorderRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import doumeemes.dao.ext.dto.QuerySalaryStatisticDTO;
@@ -37,4 +39,7 @@
    List<UserSalaryListVO> userSalaryPage(QueryUserSalaryListDTO model);
    List<UserProduceTopModel> getUserProduceTopData(QueryWorkorderRecordExtDTO param);
    List<Unqualified7DayModel> getUnqualified7DayData(QueryWorkorderRecordExtDTO param);
}
server/src/main/java/doumeemes/dao/ext/dto/QueryWorkPlansDTO.java
@@ -29,7 +29,7 @@
    @ApiModelProperty(value = "计划日期 ç»“束", example = "1")
    private String planDateEnd;
    @ApiModelProperty(value = "计划状态 0已生成、1已发布、2已撤回、3已取消、4已分配、5已暂停、6已完工、7已入库、8已关闭", example = "1")
    @ApiModelProperty(value = "计划状态 0已生成、1已发布(执行中)、2已撤回、3已取消、4已分配、5已暂停、6已完工、7已入库、8已关闭", example = "1")
    private Integer planStatus;
    @ApiModelProperty(value = "工厂主键", example = "1")
server/src/main/java/doumeemes/service/ext/StatisticsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package doumeemes.service.ext;
import doumeemes.core.model.ApiResponse;
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.business.dto.statistics.StatisticsPlanDataModel;
import doumeemes.dao.business.dto.statistics.Unqualified7DayModel;
import doumeemes.dao.business.dto.statistics.UserProduceTopModel;
import doumeemes.dao.business.model.Workorder;
import doumeemes.dao.ext.bean.FinishedInBean;
import doumeemes.dao.ext.bean.FinishedInNewBean;
import doumeemes.dao.ext.dto.QueryWorkorderExtDTO;
import doumeemes.dao.ext.vo.PlansExtListH5VO;
import doumeemes.dao.ext.vo.WorkorderExtListCountVO;
import doumeemes.dao.ext.vo.WorkorderExtListVO;
import doumeemes.dao.ext.vo.WorkorderListModelVO;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * å¤§å±ç»Ÿè®¡ä¿¡æ¯Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Service
public interface StatisticsService {
    StatisticsPlanDataModel getPlansData(Integer companyId, Integer departId);
    List<UserProduceTopModel> getUserProduceTopData(Integer companyId, Integer departId);
    List<Unqualified7DayModel> getUnqualified7DayData(Integer companyId, Integer departId);
}
server/src/main/java/doumeemes/service/ext/impl/StatisticsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
package doumeemes.service.ext.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import doumeemes.core.constants.ResponseStatus;
import doumeemes.core.exception.BusinessException;
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.core.utils.Constants;
import doumeemes.core.utils.DateUtil;
import doumeemes.core.utils.redis.RedisUtil;
import doumeemes.dao.business.WOutboundMapper;
import doumeemes.dao.business.WTransferMapper;
import doumeemes.dao.business.WorkorderMapper;
import doumeemes.dao.business.dto.statistics.StatisticsPlanDataModel;
import doumeemes.dao.business.dto.statistics.Unqualified7DayModel;
import doumeemes.dao.business.dto.statistics.UserProduceTopModel;
import doumeemes.dao.business.model.*;
import doumeemes.dao.ext.*;
import doumeemes.dao.ext.dto.QueryBarcodeParamExtDTO;
import doumeemes.dao.ext.dto.QueryCompanyExtDTO;
import doumeemes.dao.ext.dto.QueryWorkPlansDTO;
import doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO;
import doumeemes.dao.ext.vo.BarcodeParamContent;
import doumeemes.dao.ext.vo.BarcodeParamExtListVO;
import doumeemes.dao.ext.vo.CompanyExtListVO;
import doumeemes.dao.ext.vo.DepartmentExtListVO;
import doumeemes.service.ext.BarcodeParamExtService;
import doumeemes.service.ext.DepartmentExtService;
import doumeemes.service.ext.StatisticsService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * äºŒç»´ç è®¾ç½®Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 11:01
 */
@Service
public class StatisticsServiceImpl implements StatisticsService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private WorkPlansExtMapper workPlansExtMapper;
    @Autowired
    private WorkorderRecordExtMapper workorderRecordExtMapper;
    @Autowired
    private DepartmentExtService departmentExtService;
    @Override
    public StatisticsPlanDataModel getPlansData(Integer companyId, Integer departId) {
        DepartmentExtListVO department =   departmentExtService.getModelById(companyId,departId);
        if(department == null || Constants.equalsInteger(department.getDeleted(), Constants.ONE)){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,企业或者部门信息不合法,如有疑问,请联系系统管理员");
        }
        QueryWorkPlansDTO workPlans = new QueryWorkPlansDTO();
        workPlans.setRootDepartId(department.getRootId());
        workPlans.setDepartId(departId);
        //查询统计结果
        StatisticsPlanDataModel model = workPlansExtMapper.getPlansStaticticsData(workPlans);
        model.setUnqualifiedNum(new BigDecimal(0));
        if(model.getDoneNUm() !=null && model.getDoneNUm().compareTo(new BigDecimal(0)) != 0){
            //不良品率
            model.setUnqualifiedRate(model.getUnqualifiedNum().divide(model.getDoneNUm(),4).multiply(new BigDecimal(100)));
        }
        return  model;
    }
    @Override
    public List<UserProduceTopModel> getUserProduceTopData(Integer companyId, Integer departId) {
        DepartmentExtListVO department =   departmentExtService.getModelById(companyId,departId);
        if(department == null || Constants.equalsInteger(department.getDeleted(), Constants.ONE)){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,企业或者部门信息不合法,如有疑问,请联系系统管理员");
        }
        QueryWorkorderRecordExtDTO param = new QueryWorkorderRecordExtDTO();
        param.setRootDepartId(department.getRootId());
        param.setDepartId(departId);
        //查询统计结果
        List<UserProduceTopModel> model = workorderRecordExtMapper.getUserProduceTopData(param);
        return  model;
    }
    @Override
    public List<Unqualified7DayModel> getUnqualified7DayData(Integer companyId, Integer departId) {
        DepartmentExtListVO department =   departmentExtService.getModelById(companyId,departId);
        if(department == null || Constants.equalsInteger(department.getDeleted(), Constants.ONE)){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,企业或者部门信息不合法,如有疑问,请联系系统管理员");
        }
        QueryWorkorderRecordExtDTO param = new QueryWorkorderRecordExtDTO();
        param.setRootDepartId(department.getRootId());
        param.setDepartId(departId);
        //查询统计结果
        List<Unqualified7DayModel> model = workorderRecordExtMapper.getUnqualified7DayData(param);
        List<Unqualified7DayModel> result = new ArrayList<>();
        Date date = DateUtil.getCurrentDate();
        for (int i = 0; i < 7; i++) {
            Date td = DateUtil.addDaysToDate(date, 7-i);
            Unqualified7DayModel m = getReusltModelByDate(td,model);
            if(m == null){
                m = new Unqualified7DayModel();
                m.setCreateTime(td);
                m.setUnqualifiedNum(new BigDecimal(0));
            }
            result.add(m);
        }
        return  model;
    }
    private Unqualified7DayModel getReusltModelByDate(Date td, List<Unqualified7DayModel> model ) {
        if(model !=null){
            for(Unqualified7DayModel m : model){
                if(StringUtils.equals(DateUtil.getShortTime(td),DateUtil.getShortTime(m.getCreateTime()))){
                    return m;
                }
            }
        }
        return null;
    }
}
server/src/main/resources/mappers/WorkPlansExtMapper.xml
@@ -170,6 +170,17 @@
    </where>
        order by a.START_DATE desc, a.CREATE_TIME  desc
  </select>
  <select id="getPlansStaticticsData" parameterType="doumeemes.dao.ext.dto.QueryWorkPlansDTO" resultType="doumeemes.dao.business.dto.statistics.StatisticsPlanDataModel">
    SELECT count(a.id) as ingNum,
    (select count(b.id)  FROM `work_plans` b where b.DELETED = 0 AND b.ROOT_DEPART_ID = #{rootDepartId} AND b.DEPART_ID = #{departId}  AND  (b.`STATUS` = 1 and  now() > b.plan_Date  )) as delayNum,
    (select count(distinct(b.CREATE_USER))  FROM `workorder_record` b left join workorder c on b.workorder_id =c.id where b.DELETED = 0 AND b.ROOT_DEPART_ID = #{rootDepartId} AND b.DEPART_ID = #{departId}  AND c.status in (0,1,2,3,4,7)) as prouserNum,
    (select count(distinct(b.PRO_DEVICE_ID))  FROM `workorder_record` b left join workorder c on b.workorder_id =c.id where b.DELETED = 0 AND b.ROOT_DEPART_ID = #{rootDepartId} AND b.DEPART_ID = #{departId}  AND c.status in (0,1,2,3,4,7)) as deviceNum,
    (select sum(ifnull(b.UNQUALIFIED_NUM,0))  FROM `workorder_record` b left join workorder c on b.workorder_id =c.id where b.DELETED = 0 AND b.ROOT_DEPART_ID = #{rootDepartId} AND b.DEPART_ID = #{departId}  AND c.status=4) as unqualifiedRate,
    (select sum(ifnull(b.NUM,0))  FROM `workorder_record` b left join workorder c on b.workorder_id =c.id where b.DELETED = 0 AND b.ROOT_DEPART_ID = #{rootDepartId} AND b.DEPART_ID = #{departId}  AND c.status=4) as doneNum
     FROM `work_plans` `a`
    where
        a.DELETED = 0 AND a.ROOT_DEPART_ID = #{rootDepartId} AND a.DEPART_ID = #{departId}  AND a.`STATUS` = 1
  </select>
  <select id="getWorkPlansVODetail" parameterType="doumeemes.dao.ext.dto.QueryWorkPlansDTO" resultMap="WorkPlansVO">
server/src/main/resources/mappers/WorkorderRecordExtMapper.xml
@@ -488,6 +488,27 @@
    group by  `CREATE_USER`
   <!-- order by `CREATE_TIME` desc-->
  </select>
  <select id="getUserProduceTopData" parameterType="doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO"
          resultType="doumeemes.dao.business.dto.statistics.UserProduceTopModel">
    SELECT sum(a.num) as doneNum,b.user_id as userId,b.`NAME` as userName,b.PHONE
    from workorder_record a
    left join company_user b on b.DELETED=0 and b.user_id=a.CREATE_USER
    left join workorder c on a.WORKORDER_ID=c.id
    where a.deleted=0 and a.ROOT_DEPART_ID=#{rootDepartId} and a.DEPART_ID=#{departId} and s.status=4
    GROUP BY a.CREATE_USER
    ORDER By doneNum desc
    limit 10
  </select>
  <select id="getUnqualified7DayData" parameterType="doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO"
          resultType="doumeemes.dao.business.dto.statistics.Unqualified7DayModel">
    SELECT sum(a.UNQUALIFIED_NUM) as unqualifiedNum,a.CREATE_TIME
    from workorder_record a
    left join workorder c on a.WORKORDER_ID=c.id
    where  a.ROOT_DEPART_ID=#{rootDepartId} and a.DEPART_ID=#{departId}  and c.`STATUS`=4
    and 7 > (TO_DAYS(now()) - TO_DAYS(a.CREATE_TIME) )
    GROUP BY TO_DAYS(a.CREATE_TIME )
  </select>
  <select id="selectListNew" parameterType="doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO" resultMap="WorkorderRecordExtListVO">
    SELECT
      `a`.`ID`,