Commit 5a473f67 authored by Lambertliu's avatar Lambertliu

Merge branch 'develop_tzs_register' of…

Merge branch 'develop_tzs_register' of http://36.40.66.175:5000/moa/amos-boot-biz into develop_tzs_register
parents 584e1f56 1807b075
package com.yeejoin.amos.boot.module.cylinder.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
* 气瓶充装统计表-企业-以天为维度
*
* @author system_generator
* @date 2024-06-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="CylinderFillingRecordStatisticsUnitDayModel", description="气瓶充装统计表-企业-以天为维度")
public class CylinderFillingRecordStatisticsUnitDayDto extends BaseModel {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "充装次数")
private Integer totalSum;
@ApiModelProperty(value = "充装前检查数量")
private Integer fillingBeforeSum;
@ApiModelProperty(value = "充装后检查数量")
private Integer fillingAfterSum;
@ApiModelProperty(value = "企业编码")
private String appId;
@ApiModelProperty(value = "区域编码")
private String regionCode;
@ApiModelProperty(value = "充装日期")
private Date fillingDate;
@ApiModelProperty(value = "充装检查不合格数")
private int fillingNotPassedCount;
@ApiModelProperty(value = "累计充装量")
private BigDecimal fillingQuantity;
}
package com.yeejoin.amos.boot.module.cylinder.api.dto;
import lombok.Data;
/**
* @author Administrator
*/
@Data
public class KeyValueDto {
private String strKey;
private Integer iValue;
private String strValue;
}
package com.yeejoin.amos.boot.module.cylinder.api.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
/**
* 气瓶充装统计表-企业-以天为维度
*
* @author system_generator
* @date 2024-06-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("tz_cylinder_filling_record_statistics_unit_day")
public class CylinderFillingRecordStatisticsUnitDay extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 充装次数
*/
@TableField("total_sum")
private Integer totalSum;
/**
* 充装前检查数量
*/
@TableField("filling_before_sum")
private Integer fillingBeforeSum;
/**
* 充装后检查数量
*/
@TableField("filling_after_sum")
private Integer fillingAfterSum;
/**
* 企业编码
*/
@TableField("app_id")
private String appId;
/**
* 区域编码
*/
@TableField("region_code")
private String regionCode;
/**
* 充装日期
*/
@TableField("filling_date")
private Date fillingDate;
/**
* 充装检查不合格数
*/
@TableField("filling_not_passed_count")
private int fillingNotPassedCount;
/**
* 累计充装量
*/
@TableField("filling_quantity")
private BigDecimal fillingQuantity;
}
package com.yeejoin.amos.boot.module.cylinder.api.mapper;
import com.yeejoin.amos.boot.module.cylinder.api.entity.CylinderFillingRecordStatisticsUnitDay;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 气瓶充装统计表-企业-以天为维度 Mapper 接口
*
* @author system_generator
* @date 2024-06-05
*/
public interface CylinderFillingRecordStatisticsUnitDayMapper extends BaseMapper<CylinderFillingRecordStatisticsUnitDay> {
}
package com.yeejoin.amos.boot.module.cylinder.api.service;
/**
* 气瓶充装统计表-企业-以天为维度接口类
*
* @author system_generator
* @date 2024-06-05
*/
public interface ICylinderFillingRecordStatisticsUnitDayService {}
...@@ -21,9 +21,12 @@ public class CylinderTagsDataUnitDto extends BaseDto { ...@@ -21,9 +21,12 @@ public class CylinderTagsDataUnitDto extends BaseDto {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "气瓶标签比") @ApiModelProperty(value = "气瓶标签比(气瓶数量/标签数量)")
private String tagPercent; private String tagPercent;
@ApiModelProperty(value = "标签气瓶比(标签数量/气瓶数量,当一个气瓶含有电子标签,二维码标签等多个标签时,标签/气瓶最大比为100%)")
private String cylinderPercent;
@ApiModelProperty(value = "气瓶数量") @ApiModelProperty(value = "气瓶数量")
private Long cylinderSum; private Long cylinderSum;
......
...@@ -23,12 +23,18 @@ public class CylinderTagsDataUnit extends BaseEntity { ...@@ -23,12 +23,18 @@ public class CylinderTagsDataUnit extends BaseEntity {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 气瓶标签比 * 气瓶标签比(气瓶数量/标签数量)
*/ */
@TableField("tag_percent") @TableField("tag_percent")
private String tagPercent; private String tagPercent;
/** /**
* 标签气瓶比(标签数量/气瓶数量,当一个气瓶含有电子标签,二维码标签等多个标签时,标签/气瓶最大比为100%)
*/
@TableField("cylinder_percent")
private String cylinderPercent;
/**
* 气瓶数量 * 气瓶数量
*/ */
@TableField("cylinder_sum") @TableField("cylinder_sum")
......
package com.yeejoin.amos.boot.module.cylinder.flc.api.mapper; package com.yeejoin.amos.boot.module.cylinder.flc.api.mapper;
import com.yeejoin.amos.boot.module.cylinder.flc.api.entity.CylinderAreaData;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.boot.module.cylinder.api.dto.KeyValueDto;
import com.yeejoin.amos.boot.module.cylinder.flc.api.entity.CylinderAreaData;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -14,9 +16,26 @@ import java.util.Map; ...@@ -14,9 +16,26 @@ import java.util.Map;
*/ */
public interface CylinderAreaDataMapper extends BaseMapper<CylinderAreaData> { public interface CylinderAreaDataMapper extends BaseMapper<CylinderAreaData> {
Map<String, Object> getLicenseEfficiency(@Param(value = "regionCode")String regionCode, @Param(value = "appId")String appId);
Map<String, Object> getInspectionExpiredRate(@Param(value = "regionCode")String regionCode, @Param(value = "appId")String appId); Map<String, Object> getInspectionExpiredRate(@Param(value = "regionCode") String regionCode, @Param(value = "appId") String appId);
Map<String, Object> getInspectionResultRate(@Param(value = "regionCode") String regionCode, @Param(value = "appId") String appId);
/**
* 查询单个单位的有效期信息
*
* @param appId 公司唯一标识
* @return KeyValueDto
*/
KeyValueDto queryLicenseEfficiencyOneCompany(@Param(value = "appId") String appId);
/**
* 单位按照资质状态分组下的统计数量
*
* @param regionCode 区域
* @return List<KeyValueDto>
*/
List<KeyValueDto> queryLicenseEfficiencyOfRegion(@Param(value = "regionCode") String regionCode);
Map<String, Object> getInspectionResultRate(@Param(value = "regionCode")String regionCode, @Param(value = "appId")String appId);
} }
...@@ -19,6 +19,8 @@ public interface CylinderFillingCheckMapper extends BaseMapper<CylinderFillingCh ...@@ -19,6 +19,8 @@ public interface CylinderFillingCheckMapper extends BaseMapper<CylinderFillingCh
Integer getFillingCountByMonth(@Param("appId") String appId, @Param("time") Date time); Integer getFillingCountByMonth(@Param("appId") String appId, @Param("time") Date time);
Integer getFillingCountByDay(@Param("appId") String appId, @Param("time") Date time);
Integer getFillingPassedCountByMonth(@Param("appId") String appId, @Param("time") Date time); Integer getFillingPassedCountByMonth(@Param("appId") String appId, @Param("time") Date time);
void saveOrUpdateByCondition(List<CylinderFillingCheck> fillingChecks); void saveOrUpdateByCondition(List<CylinderFillingCheck> fillingChecks);
......
...@@ -18,5 +18,7 @@ public interface CylinderFillingMapper extends BaseMapper<CylinderFilling> { ...@@ -18,5 +18,7 @@ public interface CylinderFillingMapper extends BaseMapper<CylinderFilling> {
Integer getFillingCountByMonth(@Param("appId") String appId, @Param("time") Date time); Integer getFillingCountByMonth(@Param("appId") String appId, @Param("time") Date time);
Integer getFillingCountByDay(@Param("appId") String appId, @Param("time") Date time);
Integer getFillingPassedCountByMonth(@Param("appId") String appId, @Param("time") Date time); Integer getFillingPassedCountByMonth(@Param("appId") String appId, @Param("time") Date time);
} }
...@@ -53,6 +53,10 @@ public interface CylinderFillingRecordMapper extends BaseMapper<CylinderFillingR ...@@ -53,6 +53,10 @@ public interface CylinderFillingRecordMapper extends BaseMapper<CylinderFillingR
Integer getFillingCountByMonth(@Param("appId") String appId, @Param("time") Date time); Integer getFillingCountByMonth(@Param("appId") String appId, @Param("time") Date time);
Integer getFillingCountByDay(@Param("appId") String appId, @Param("time") Date time);
Integer getFillingUnqualifiedCountByDay(@Param("appId") String appId, @Param("time") Date time);
Double getFillingSumByDate(@Param("appId") String appId, @Param("time") Date time); Double getFillingSumByDate(@Param("appId") String appId, @Param("time") Date time);
List<ESCylinderFillingRecordDto> getCylinderFillingRecordInfo(@Param("appIds") List<String> appIds,@Param("sequenceCodeS") List<String> sequenceCodeS); List<ESCylinderFillingRecordDto> getCylinderFillingRecordInfo(@Param("appIds") List<String> appIds,@Param("sequenceCodeS") List<String> sequenceCodeS);
......
...@@ -112,9 +112,6 @@ public interface CylinderInfoMapper extends BaseMapper<CylinderInfo> { ...@@ -112,9 +112,6 @@ public interface CylinderInfoMapper extends BaseMapper<CylinderInfo> {
int countNumber(@Param("status") String status, @Param("companyId") String companyId, @Param("regionCode") String regionCode); int countNumber(@Param("status") String status, @Param("companyId") String companyId, @Param("regionCode") String regionCode);
Map<String, Object> countFillingTimesAndQuantityByCompany(@Param("companyId") String companyId, @Param("startTime") String startTime, @Param("endTime") String endTime);
List<CylinderInfoDto> queryCylinderOfInspectionOverdue(@Param("questionType") String questionType); List<CylinderInfoDto> queryCylinderOfInspectionOverdue(@Param("questionType") String questionType);
List<CylinderInfoDto> queryCylinderOfUnqualifiedQuestion(@Param("questionType") String questionType); List<CylinderInfoDto> queryCylinderOfUnqualifiedQuestion(@Param("questionType") String questionType);
......
...@@ -44,8 +44,10 @@ public interface ICylinderInfoService { ...@@ -44,8 +44,10 @@ public interface ICylinderInfoService {
void synUnitFillingCheckDataJob(); void synUnitFillingCheckDataJob();
void fillingCheckDataSynHandler(); void fillingCheckDataSynHandler();
void synFillingUnloadUnitData(); void fillingRecordDataSynHandler();
void synFillingUnloadUnitData();
Page<CylinderInfoDto> getCyinderInfoList(Page<CylinderInfoDto> page); Page<CylinderInfoDto> getCyinderInfoList(Page<CylinderInfoDto> page);
......
...@@ -2,35 +2,53 @@ ...@@ -2,35 +2,53 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.boot.module.cylinder.flc.api.mapper.CylinderAreaDataMapper"> <mapper namespace="com.yeejoin.amos.boot.module.cylinder.flc.api.mapper.CylinderAreaDataMapper">
<select id="getLicenseEfficiency" resultType="java.util.Map"> <select id="queryLicenseEfficiencyOneCompany" resultType="com.yeejoin.amos.boot.module.cylinder.api.dto.KeyValueDto">
SELECT SELECT
CASE WHEN COUNT ( CASE WHEN ul.expiry_date >= now( ) THEN 1 END ) = 1 THEN '正常' ELSE '已超期' END AS licenseOk, cu.sequence_nbr as strKey,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND( ( COUNT ( CASE WHEN ul.expiry_date >= now( ) THEN 1 END ) * 100.0 / COUNT ( * ) ), 2 ) END AS licenseRate (select
case
when min(ul.expiry_date) >= now()
THEN '正常'
when min(ul.expiry_date) is null then '--'
ELSE '已超期'
END AS licenseOk from tz_base_unit_licence ul where cu.credit_code = ul.unit_code) as strValue
FROM FROM
tz_cylinder_unit cu tz_cylinder_unit cu
LEFT JOIN tz_base_unit_licence ul ON cu.credit_code = ul.unit_code where
<where> cu.unit_status = '1210'
<if test="regionCode != null and regionCode != ''"> and cu.app_id = #{appId}
cu.region_code like concat('%', #{regionCode}, '%') </select>
</if> <select id="queryLicenseEfficiencyOfRegion" resultType="com.yeejoin.amos.boot.module.cylinder.api.dto.KeyValueDto">
<if test="appId != null and appId != ''"> SELECT
cu.app_id = #{appId} count(1) as iValue,
</if> (select
</where> case
when min(ul.expiry_date) >= now()
THEN '正常'
when min(ul.expiry_date) is null then '未提供'
ELSE '已超期'
END AS licenseOk from tz_base_unit_licence ul where cu.credit_code = ul.unit_code) as strKey
FROM
tz_cylinder_unit cu
where
cu.unit_status = '1210'
and cu.region_code like concat('%', #{regionCode}, '%')
GROUP BY strKey
</select> </select>
<select id="getInspectionExpiredRate" resultType="java.util.Map"> <select id="getInspectionExpiredRate" resultType="java.util.Map">
SELECT SELECT
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((COUNT(CASE WHEN ci.next_inspection_date <![CDATA[<]]> now() THEN 1 END) * 100.0 / COUNT(*)), 2) END AS expiredRate CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((COUNT(CASE WHEN ci.next_inspection_date <![CDATA[<=]]> now() THEN 1 END) * 100.0 / COUNT(*)), 2) END AS expiredRate
FROM FROM
"tz_cylinder_inspection" ci "tz_cylinder_inspection" ci
LEFT JOIN tz_cylinder_unit cu on ci.app_id = cu.app_id LEFT JOIN tz_cylinder_unit cu on ci.app_id = cu.app_id
<where> <where>
cu.unit_status = '1210'
<if test="regionCode != null and regionCode != ''"> <if test="regionCode != null and regionCode != ''">
cu.region_code like concat('%', #{regionCode}, '%') and cu.region_code like concat('%', #{regionCode}, '%')
</if> </if>
<if test="appId != null and appId != ''"> <if test="appId != null and appId != ''">
cu.app_id = #{appId} and cu.app_id = #{appId}
</if> </if>
</where> </where>
</select> </select>
...@@ -42,11 +60,12 @@ ...@@ -42,11 +60,12 @@
"tz_cylinder_inspection" ci "tz_cylinder_inspection" ci
LEFT JOIN tz_cylinder_unit cu on ci.app_id = cu.app_id LEFT JOIN tz_cylinder_unit cu on ci.app_id = cu.app_id
<where> <where>
cu.unit_status = '1210'
<if test="regionCode != null and regionCode != ''"> <if test="regionCode != null and regionCode != ''">
cu.region_code like concat('%', #{regionCode}, '%') and cu.region_code like concat('%', #{regionCode}, '%')
</if> </if>
<if test="appId != null and appId != ''"> <if test="appId != null and appId != ''">
cu.app_id = #{appId} and cu.app_id = #{appId}
</if> </if>
</where> </where>
</select> </select>
......
...@@ -76,6 +76,10 @@ ...@@ -76,6 +76,10 @@
select count(1) from tz_cylinder_filling_check r where date_format(r.inspection_date,'%Y-%m') = date_format(#{time},'%Y-%m') and app_id = #{appId} select count(1) from tz_cylinder_filling_check r where date_format(r.inspection_date,'%Y-%m') = date_format(#{time},'%Y-%m') and app_id = #{appId}
</select> </select>
<select id="getFillingCountByDay" resultType="java.lang.Integer">
select count(1) from tz_cylinder_filling_check r where date_format(r.inspection_date,'%Y-%m-%d') = date_format(#{time},'%Y-%m-%d') and app_id = #{appId}
</select>
<select id="getFillingPassedCountByMonth" resultType="java.lang.Integer"> <select id="getFillingPassedCountByMonth" resultType="java.lang.Integer">
select select
IFNULL( IFNULL(
......
...@@ -10,6 +10,11 @@ ...@@ -10,6 +10,11 @@
<select id="getFillingCountByMonth" resultType="java.lang.Integer"> <select id="getFillingCountByMonth" resultType="java.lang.Integer">
select count(1) from tz_cylinder_filling r where date_format(r.inspection_date,'%Y-%m') = date_format(#{time},'%Y-%m') and app_id = #{appId} select count(1) from tz_cylinder_filling r where date_format(r.inspection_date,'%Y-%m') = date_format(#{time},'%Y-%m') and app_id = #{appId}
</select> </select>
<select id="getFillingCountByDay" resultType="java.lang.Integer">
select count(1) from tz_cylinder_filling r where date_format(r.inspection_date,'%Y-%m-%d') = date_format(#{time},'%Y-%m-%d') and app_id = #{appId}
</select>
<select id="getFillingPassedCountByMonth" resultType="java.lang.Integer"> <select id="getFillingPassedCountByMonth" resultType="java.lang.Integer">
select select
IFNULL( IFNULL(
......
...@@ -146,6 +146,20 @@ ...@@ -146,6 +146,20 @@
select count(1) from tz_cylinder_filling_record r where date_format(r.filling_endTime,'%Y-%m') = date_format(#{time},'%Y-%m') and app_id = #{appId} select count(1) from tz_cylinder_filling_record r where date_format(r.filling_endTime,'%Y-%m') = date_format(#{time},'%Y-%m') and app_id = #{appId}
</select> </select>
<select id="getFillingCountByDay" resultType="java.lang.Integer">
select count(1) from tz_cylinder_filling_record r where date_format(r.filling_endTime,'%Y-%m-%d') = date_format(#{time},'%Y-%m-%d') and app_id = #{appId}
</select>
<select id="getFillingUnqualifiedCountByDay" resultType="java.lang.Integer">
SELECT COUNT(1) AS unqualified_count
FROM tz_cylinder_filling_record AS record
LEFT JOIN tz_cylinder_filling AS before ON record.filling_before_id = before.filling_before_id
LEFT JOIN tz_cylinder_filling_check AS after ON record.filling_check_id = after.filling_check_id
WHERE DATE_FORMAT(record.filling_endTime, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d')
AND record.app_id = #{appId}
AND (before.check_results = '不合格' OR after.check_results = '不合格')
</select>
<select id="getCylinderFillingRecord" resultType="com.yeejoin.amos.boot.module.cylinder.api.entity.ESCylinderFillingRecordDto"> <select id="getCylinderFillingRecord" resultType="com.yeejoin.amos.boot.module.cylinder.api.entity.ESCylinderFillingRecordDto">
SELECT DISTINCT(r.filling_record_id), SELECT DISTINCT(r.filling_record_id),
r.sequence_nbr AS sequenceNbr, r.sequence_nbr AS sequenceNbr,
......
<?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.yeejoin.amos.boot.module.cylinder.api.mapper.CylinderFillingRecordStatisticsUnitDayMapper">
</mapper>
...@@ -392,22 +392,6 @@ ...@@ -392,22 +392,6 @@
</where> </where>
</select> </select>
<select id="countFillingTimesAndQuantityByCompany" resultType="java.util.Map">
SELECT COUNT(1) AS fillingTimes, ifnull(SUM(filling_quantity),0) AS fillingQuantity
FROM tz_cylinder_filling_record AS tcfr
<where>
tcfr."filling_endtime" <![CDATA[>=]]> (CURRENT_DATE - INTERVAL '31 days')
<if test="companyId != null and companyId != ''">
AND tcfr."app_id" = #{companyId}
</if>
<if test="startTime != null">
AND DATE_FORMAT(tcfr."filling_starttime",'%Y-%m-%d') <![CDATA[>=]]> #{startTime}
</if>
<if test="endTime != null">
AND DATE_FORMAT(tcfr."filling_endtime",'%Y-%m-%d') <![CDATA[<=]]> #{endTime}
</if>
</where>
</select>
<select id="countFillingTimesAndQuantityByCity" resultType="java.util.Map"> <select id="countFillingTimesAndQuantityByCity" resultType="java.util.Map">
SELECT regionCode AS regionCode, SELECT regionCode AS regionCode,
......
package com.yeejoin.amos.boot.module.cylinder.biz.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RestController;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import java.util.List;
import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.CylinderFillingRecordStatisticsUnitDayServiceImpl;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderFillingRecordStatisticsUnitDayDto;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
/**
*
* @author system_generator
* @date 2024-06-05
*/
@RestController
@Api(tags = "Api")
@RequestMapping(value = "/cylinder-filling-record-statistics-unit-day")
public class CylinderFillingRecordStatisticsUnitDayController extends BaseController {
@Autowired
CylinderFillingRecordStatisticsUnitDayServiceImpl cylinderFillingRecordStatisticsUnitDayServiceImpl;
/**
* 新增
*
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/save")
@ApiOperation(httpMethod = "POST", value = "新增", notes = "新增")
public ResponseModel<CylinderFillingRecordStatisticsUnitDayDto> save(@RequestBody CylinderFillingRecordStatisticsUnitDayDto model) {
model = cylinderFillingRecordStatisticsUnitDayServiceImpl.createWithModel(model);
return ResponseHelper.buildResponse(model);
}
/**
* 根据sequenceNbr更新
*
* @param sequenceNbr 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PutMapping(value = "/{sequenceNbr}")
@ApiOperation(httpMethod = "PUT", value = "根据sequenceNbr更新", notes = "根据sequenceNbr更新")
public ResponseModel<CylinderFillingRecordStatisticsUnitDayDto> updateBySequenceNbrCylinderFillingRecordStatisticsUnitDay(@RequestBody CylinderFillingRecordStatisticsUnitDayDto model, @PathVariable(value = "sequenceNbr") Long sequenceNbr) {
model.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(cylinderFillingRecordStatisticsUnitDayServiceImpl.updateWithModel(model));
}
/**
* 根据sequenceNbr删除
*
* @param sequenceNbr 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@DeleteMapping(value = "/{sequenceNbr}")
@ApiOperation(httpMethod = "DELETE", value = "根据sequenceNbr删除", notes = "根据sequenceNbr删除")
public ResponseModel<Boolean> deleteBySequenceNbr(HttpServletRequest request, @PathVariable(value = "sequenceNbr") Long sequenceNbr){
return ResponseHelper.buildResponse(cylinderFillingRecordStatisticsUnitDayServiceImpl.removeById(sequenceNbr));
}
/**
* 根据sequenceNbr查询
*
* @param sequenceNbr 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/{sequenceNbr}")
@ApiOperation(httpMethod = "GET",value = "根据sequenceNbr查询单个", notes = "根据sequenceNbr查询单个")
public ResponseModel<CylinderFillingRecordStatisticsUnitDayDto> selectOne(@PathVariable Long sequenceNbr) {
return ResponseHelper.buildResponse(cylinderFillingRecordStatisticsUnitDayServiceImpl.queryBySeq(sequenceNbr));
}
/**
* 列表分页查询
*
* @param current 当前页
* @param current 每页大小
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/page")
@ApiOperation(httpMethod = "GET",value = "分页查询", notes = "分页查询")
public ResponseModel<Page<CylinderFillingRecordStatisticsUnitDayDto>> queryForPage(@RequestParam(value = "current") int current, @RequestParam
(value = "size") int size) {
Page<CylinderFillingRecordStatisticsUnitDayDto> page = new Page<CylinderFillingRecordStatisticsUnitDayDto>();
page.setCurrent(current);
page.setSize(size);
return ResponseHelper.buildResponse(cylinderFillingRecordStatisticsUnitDayServiceImpl.queryForCylinderFillingRecordStatisticsUnitDayPage(page));
}
/**
* 列表全部数据查询
*
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "GET",value = "列表全部数据查询", notes = "列表全部数据查询")
@GetMapping(value = "/list")
public ResponseModel<List<CylinderFillingRecordStatisticsUnitDayDto>> selectForList() {
return ResponseHelper.buildResponse(cylinderFillingRecordStatisticsUnitDayServiceImpl.queryForCylinderFillingRecordStatisticsUnitDayList());
}
}
...@@ -108,11 +108,9 @@ public class CylinderQuestionInfoController extends BaseController { ...@@ -108,11 +108,9 @@ public class CylinderQuestionInfoController extends BaseController {
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@PutMapping(value = "/init") @PutMapping(value = "/init")
@ApiOperation(httpMethod = "问题数据初始化", value = "问题数据初始化", notes = "问题数据初始化,运维专用") @ApiOperation(httpMethod = "PUT", value = "问题数据初始化", notes = "问题数据初始化,运维专用")
public ResponseModel<String> initData() { public ResponseModel<String> initData() {
cylinderQuestionInfoServiceImpl.initData(); cylinderQuestionInfoServiceImpl.initData();
return ResponseHelper.buildResponse("succese"); return ResponseHelper.buildResponse("success");
} }
} }
package com.yeejoin.amos.boot.module.cylinder.biz.event;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderFillingRecordStatisticsUnitDayDto;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
/**
* @author Administrator
*/
@Getter
public class CylinderStatisticsUnitDayInsertOrUpdateEvent extends ApplicationEvent {
private CylinderFillingRecordStatisticsUnitDayDto cylinderFillingRecordStatisticsUnitDayDto;
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public CylinderStatisticsUnitDayInsertOrUpdateEvent(Object source, CylinderFillingRecordStatisticsUnitDayDto cylinderFillingRecordStatisticsUnitDayDto) {
super(source);
this.cylinderFillingRecordStatisticsUnitDayDto = cylinderFillingRecordStatisticsUnitDayDto;
}
}
...@@ -86,7 +86,7 @@ public class CylinderQuestionCreateEventListener implements ApplicationListener< ...@@ -86,7 +86,7 @@ public class CylinderQuestionCreateEventListener implements ApplicationListener<
waitSaveData.add(questionInfoDto); waitSaveData.add(questionInfoDto);
try { try {
reentrantLock.lock(); reentrantLock.lock();
if (queue.size() > batchSize) { if (queue.size() >= batchSize) {
queue.drainTo(waitSaveData, batchSize); queue.drainTo(waitSaveData, batchSize);
} }
} finally { } finally {
......
package com.yeejoin.amos.boot.module.cylinder.biz.event.listener;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderFillingRecordStatisticsUnitDayDto;
import com.yeejoin.amos.boot.module.cylinder.api.entity.CylinderFillingRecordStatisticsUnitDay;
import com.yeejoin.amos.boot.module.cylinder.biz.event.CylinderStatisticsUnitDayInsertOrUpdateEvent;
import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.CylinderFillingRecordStatisticsUnitDayServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author Administrator
*/
@Component
@Slf4j
public class CylinderStatisticsUnitDayInsertOrUpdateEventListener implements ApplicationListener<CylinderStatisticsUnitDayInsertOrUpdateEvent> {
@Value("${cylinder.day.statistics.insertOrUpdate.thread.number:3}")
private int threadNumber;
/**
* 批量入库大小
*/
private int batchSize = 10;
private List<BlockingQueue<CylinderFillingRecordStatisticsUnitDayDto>> hashCodeBlockingQueues = new ArrayList<>();
private ReentrantLock reentrantLock = new ReentrantLock();
private Sequence sequence;
private CylinderFillingRecordStatisticsUnitDayServiceImpl statisticsUnitDayService;
public CylinderStatisticsUnitDayInsertOrUpdateEventListener(CylinderFillingRecordStatisticsUnitDayServiceImpl statisticsUnitDayService,
Sequence sequence) {
this.statisticsUnitDayService = statisticsUnitDayService;
this.sequence = sequence;
}
@Override
public void onApplicationEvent(CylinderStatisticsUnitDayInsertOrUpdateEvent event) {
CylinderFillingRecordStatisticsUnitDayDto fillingRecordStatisticsUnitDayDto = event.getCylinderFillingRecordStatisticsUnitDayDto();
log.info("2.收到气瓶单位日统计事件消息:{}", JSON.toJSONString(fillingRecordStatisticsUnitDayDto));
// 按照一定的规则将统计维度不同的数据放到不同的队列里,保证多线程不会同时操作相同行数据,减少了线程的冲突,提高执行效率
int queueIndex = Math.abs(fillingRecordStatisticsUnitDayDto.getAppId().hashCode()) % threadNumber;
hashCodeBlockingQueues.get(queueIndex).add(fillingRecordStatisticsUnitDayDto);
}
@PostConstruct
public void init() {
// 初始化队列,按照线程数动态创建队列
initQueue();
// 初始化多线程消费线程
ExecutorService executorService = Executors.newFixedThreadPool(threadNumber);
for (int i = 0; i < threadNumber; i++) {
BlockingQueue<CylinderFillingRecordStatisticsUnitDayDto> queue = hashCodeBlockingQueues.get(i);
executorService.execute(() -> {
while (true) {
try {
CylinderFillingRecordStatisticsUnitDayDto fillingRecordStatisticsUnitDayDto = queue.take();
List<CylinderFillingRecordStatisticsUnitDayDto> unitDayDtos = new ArrayList<>();
unitDayDtos.add(fillingRecordStatisticsUnitDayDto);
try {
reentrantLock.lock();
if (queue.size() >= batchSize) {
queue.drainTo(unitDayDtos, batchSize);
}
} finally {
reentrantLock.unlock();
}
this.buildAndSaveData(unitDayDtos);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
});
}
}
private void buildAndSaveData(List<CylinderFillingRecordStatisticsUnitDayDto> unitDayDtos) {
List<CylinderFillingRecordStatisticsUnitDay> existStatisticsData = queryStatisticsDayOfToday(unitDayDtos);
List<CylinderFillingRecordStatisticsUnitDayDto> insertStatisticsData = this.buildStatisticsDataOfInsert(unitDayDtos, existStatisticsData);
List<CylinderFillingRecordStatisticsUnitDayDto> updateStatisticsData = this.buildStatisticsDataOfUpdate(unitDayDtos, existStatisticsData);
this.sumUpdateStatisticsData(existStatisticsData, updateStatisticsData);
this.saveOrUpdateBatch(insertStatisticsData, updateStatisticsData);
}
private void saveOrUpdateBatch(List<CylinderFillingRecordStatisticsUnitDayDto> insertStatisticsData, List<CylinderFillingRecordStatisticsUnitDayDto> updateStatisticsData) {
// appId + 日期 存在则累计更新(update),不存在则插入(insert)
List<CylinderFillingRecordStatisticsUnitDay> entitys = this.mergeDataAnCastDto2Entity(insertStatisticsData, updateStatisticsData);
statisticsUnitDayService.saveOrUpdateBatch(entitys);
log.info("3.气瓶日统计表入库成功");
}
private List<CylinderFillingRecordStatisticsUnitDay> mergeDataAnCastDto2Entity(List<CylinderFillingRecordStatisticsUnitDayDto> insertStatisticsData, List<CylinderFillingRecordStatisticsUnitDayDto> updateStatisticsData) {
insertStatisticsData.addAll(updateStatisticsData);
return BeanUtil.copyToList(insertStatisticsData, CylinderFillingRecordStatisticsUnitDay.class);
}
private void sumUpdateStatisticsData(List<CylinderFillingRecordStatisticsUnitDay> existStatisticsData, List<CylinderFillingRecordStatisticsUnitDayDto> updateStatisticsData) {
Map<String, CylinderFillingRecordStatisticsUnitDay> existStatisticsDataMap = existStatisticsData.stream().collect(Collectors.toMap(CylinderFillingRecordStatisticsUnitDay::getAppId, Function.identity()));
updateStatisticsData.forEach(up -> {
up.setFillingNotPassedCount(existStatisticsDataMap.get(up.getAppId()).getFillingNotPassedCount() + up.getFillingNotPassedCount());
up.setFillingQuantity(this.sumFillingQuantity(existStatisticsDataMap.get(up.getAppId()).getFillingQuantity(), up.getFillingQuantity()));
up.setFillingBeforeSum(existStatisticsDataMap.get(up.getAppId()).getFillingBeforeSum() + up.getFillingBeforeSum());
up.setFillingAfterSum(existStatisticsDataMap.get(up.getAppId()).getFillingAfterSum() + up.getFillingAfterSum());
up.setTotalSum(existStatisticsDataMap.get(up.getAppId()).getTotalSum() + 1);
up.setSequenceNbr(existStatisticsDataMap.get(up.getAppId()).getSequenceNbr());
up.setFillingDate(new Date());
});
}
/**
* 累计充装量计算
*
* @param fillingQuantity 数据库已有充装量
* @param newFillingQuantity 新增加充装量
* @return 求和
*/
private BigDecimal sumFillingQuantity(BigDecimal fillingQuantity, BigDecimal newFillingQuantity) {
return fillingQuantity.add(newFillingQuantity).setScale(2, RoundingMode.HALF_UP);
}
private List<CylinderFillingRecordStatisticsUnitDayDto> buildStatisticsDataOfInsert(List<CylinderFillingRecordStatisticsUnitDayDto> unitDayDtos, List<CylinderFillingRecordStatisticsUnitDay> existStatisticsData) {
return unitDayDtos.stream().filter(s -> existStatisticsData.stream().noneMatch(e -> e.getAppId().equals(s.getAppId()))).peek(u -> u.setSequenceNbr(sequence.nextId())).collect(Collectors.toList());
}
private List<CylinderFillingRecordStatisticsUnitDayDto> buildStatisticsDataOfUpdate(List<CylinderFillingRecordStatisticsUnitDayDto> unitDayDtos, List<CylinderFillingRecordStatisticsUnitDay> existStatisticsData) {
return unitDayDtos.stream().filter(s -> existStatisticsData.stream().anyMatch(e -> e.getAppId().equals(s.getAppId()))).collect(Collectors.toList());
}
private List<CylinderFillingRecordStatisticsUnitDay> queryStatisticsDayOfToday(List<CylinderFillingRecordStatisticsUnitDayDto> unitDayDtos) {
Set<String> appIds = unitDayDtos.stream().map(CylinderFillingRecordStatisticsUnitDayDto::getAppId).collect(Collectors.toSet());
return statisticsUnitDayService.list(new LambdaQueryWrapper<CylinderFillingRecordStatisticsUnitDay>().in(CylinderFillingRecordStatisticsUnitDay::getAppId, appIds).eq(CylinderFillingRecordStatisticsUnitDay::getFillingDate, DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN)));
}
private void initQueue() {
for (int i = 0; i < threadNumber; i++) {
hashCodeBlockingQueues.add(new LinkedBlockingQueue<>());
}
}
}
package com.yeejoin.amos.boot.module.cylinder.biz.listener; package com.yeejoin.amos.boot.module.cylinder.biz.listener;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderQuestionInfoDto;
import com.yeejoin.amos.boot.module.cylinder.api.enums.QuestionTypeEnum;
import com.yeejoin.amos.boot.module.cylinder.biz.event.CylinderQuestionCreateEvent;
import com.yeejoin.amos.boot.module.cylinder.biz.event.publisher.EventPublisher;
import com.yeejoin.amos.boot.module.cylinder.flc.api.dto.CylinderFillingRecordDto; import com.yeejoin.amos.boot.module.cylinder.flc.api.dto.CylinderFillingRecordDto;
import com.yeejoin.amos.boot.module.cylinder.flc.api.enums.CyclinderStatus;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -32,22 +27,22 @@ public class CylinderFillingInsertEventListener extends EmqxListener { ...@@ -32,22 +27,22 @@ public class CylinderFillingInsertEventListener extends EmqxListener {
@Value("${cylinder.filling.insert.msg.custom.thread.number:3}") @Value("${cylinder.filling.insert.msg.custom.thread.number:3}")
private int threadNumber; private int threadNumber;
@Value("${cylinder.filling.insert.topic:cylinder/filling/insert/topic}") @Value("${cylinder.filling.insert.topic:cylinder/filling/insert/topic2}")
private String insertTopic; private String insertTopic;
@Value("${spring.application.name:TZS-CYLINDER}") @Value("${spring.application.name:TZS-CYLINDER}")
private String applicationName; private String applicationName;
private EventPublisher eventPublisher;
private EmqKeeper emqKeeper; private EmqKeeper emqKeeper;
private List<ICylinderFillingInsertListener> cylinderFillingInsertListeners;
private BlockingQueue<CylinderFillingRecordDto> blockingQueue = new LinkedBlockingQueue<>(); private BlockingQueue<CylinderFillingRecordDto> blockingQueue = new LinkedBlockingQueue<>();
public CylinderFillingInsertEventListener(EventPublisher eventPublisher, public CylinderFillingInsertEventListener(EmqKeeper emqKeeper,
EmqKeeper emqKeeper) { List<ICylinderFillingInsertListener> cylinderFillingInsertListeners) {
this.eventPublisher = eventPublisher;
this.emqKeeper = emqKeeper; this.emqKeeper = emqKeeper;
this.cylinderFillingInsertListeners = cylinderFillingInsertListeners;
} }
...@@ -79,19 +74,9 @@ public class CylinderFillingInsertEventListener extends EmqxListener { ...@@ -79,19 +74,9 @@ public class CylinderFillingInsertEventListener extends EmqxListener {
} }
private void createCylinderFillingQuestion(CylinderFillingRecordDto cylinderFillingRecordDto) { private void createCylinderFillingQuestion(CylinderFillingRecordDto cylinderFillingRecordDto) {
if (CyclinderStatus.HEGE.getName().equals(cylinderFillingRecordDto.getFillingResult()) && CyclinderStatus.HEGE.getName().equals(cylinderFillingRecordDto.getCheckResult())) { cylinderFillingInsertListeners.forEach(listener -> {
log.info("气瓶充装信息前后全部合格,不创建问题!"); listener.handle(cylinderFillingRecordDto);
} else { });
CylinderQuestionInfoDto questionInfo = new CylinderQuestionInfoDto();
questionInfo.setQuestionType(QuestionTypeEnum.CZJCBHG.getCode());
questionInfo.setQuestionTypeName(QuestionTypeEnum.CZJCBHG.getName());
questionInfo.setQuestionAttributionId(cylinderFillingRecordDto.getAppId());
questionInfo.setQuestionAttributionName(cylinderFillingRecordDto.getFillingUnitName());
questionInfo.setRegionCode(cylinderFillingRecordDto.getRegionCode());
questionInfo.setQuestionObjectId(cylinderFillingRecordDto.getSequenceCode());
questionInfo.setHappenDate(cylinderFillingRecordDto.getSyncDate());
eventPublisher.publish(new CylinderQuestionCreateEvent(this, questionInfo));
}
} }
@Override @Override
......
package com.yeejoin.amos.boot.module.cylinder.biz.listener;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderQuestionInfoDto;
import com.yeejoin.amos.boot.module.cylinder.api.enums.QuestionTypeEnum;
import com.yeejoin.amos.boot.module.cylinder.biz.event.CylinderQuestionCreateEvent;
import com.yeejoin.amos.boot.module.cylinder.biz.event.publisher.EventPublisher;
import com.yeejoin.amos.boot.module.cylinder.flc.api.dto.CylinderFillingRecordDto;
import com.yeejoin.amos.boot.module.cylinder.flc.api.enums.CyclinderStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author Administrator
*/
@Component
@Slf4j
public class CylinderFillingInsertListenerForQuestion implements ICylinderFillingInsertListener {
private EventPublisher eventPublisher;
public CylinderFillingInsertListenerForQuestion(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
@Override
public void handle(CylinderFillingRecordDto cylinderFillingRecordDto) {
if (CyclinderStatus.HEGE.getName().equals(cylinderFillingRecordDto.getFillingResult()) && CyclinderStatus.HEGE.getName().equals(cylinderFillingRecordDto.getCheckResult())) {
log.info("气瓶充装信息前后全部合格,不创建问题!");
} else {
CylinderQuestionInfoDto questionInfo = new CylinderQuestionInfoDto();
questionInfo.setQuestionType(QuestionTypeEnum.CZJCBHG.getCode());
questionInfo.setQuestionTypeName(QuestionTypeEnum.CZJCBHG.getName());
questionInfo.setQuestionAttributionId(cylinderFillingRecordDto.getAppId());
questionInfo.setQuestionAttributionName(cylinderFillingRecordDto.getFillingUnitName());
questionInfo.setRegionCode(cylinderFillingRecordDto.getRegionCode());
questionInfo.setQuestionObjectId(cylinderFillingRecordDto.getSequenceCode());
questionInfo.setHappenDate(cylinderFillingRecordDto.getSyncDate());
eventPublisher.publish(new CylinderQuestionCreateEvent(this, questionInfo));
}
}
}
package com.yeejoin.amos.boot.module.cylinder.biz.listener;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderFillingRecordStatisticsUnitDayDto;
import com.yeejoin.amos.boot.module.cylinder.biz.event.CylinderStatisticsUnitDayInsertOrUpdateEvent;
import com.yeejoin.amos.boot.module.cylinder.biz.event.publisher.EventPublisher;
import com.yeejoin.amos.boot.module.cylinder.flc.api.dto.CylinderFillingRecordDto;
import com.yeejoin.amos.boot.module.cylinder.flc.api.enums.CyclinderStatus;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author Administrator
*/
@Component
public class CylinderFillingInsertListenerForStatistics implements ICylinderFillingInsertListener {
private EventPublisher eventPublisher;
public CylinderFillingInsertListenerForStatistics(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
@Override
public void handle(CylinderFillingRecordDto cylinderFillingRecordDto) {
CylinderFillingRecordStatisticsUnitDayDto statisticsUnitDay = new CylinderFillingRecordStatisticsUnitDayDto();
statisticsUnitDay.setAppId(cylinderFillingRecordDto.getAppId());
statisticsUnitDay.setRegionCode(cylinderFillingRecordDto.getRegionCode());
statisticsUnitDay.setFillingDate(cylinderFillingRecordDto.getSyncDate());
statisticsUnitDay.setFillingAfterSum(StringUtils.isEmpty(cylinderFillingRecordDto.getFillingEndtime()) ? 0 : 1);
statisticsUnitDay.setFillingBeforeSum(StringUtils.isEmpty(cylinderFillingRecordDto.getFillingStarttime()) ? 0 : 1);
statisticsUnitDay.setFillingQuantity(new BigDecimal(cylinderFillingRecordDto.getFillingQuantity()));
statisticsUnitDay.setFillingNotPassedCount(this.justIsOk(cylinderFillingRecordDto));
statisticsUnitDay.setFillingDate(new Date());
statisticsUnitDay.setRecDate(new Date());
statisticsUnitDay.setTotalSum(1);
eventPublisher.publish(new CylinderStatisticsUnitDayInsertOrUpdateEvent(this, statisticsUnitDay));
}
private int justIsOk(CylinderFillingRecordDto cylinderFillingRecordDto) {
if (CyclinderStatus.HEGE.getName().equals(cylinderFillingRecordDto.getFillingResult()) && CyclinderStatus.HEGE.getName().equals(cylinderFillingRecordDto.getCheckResult())) {
return 0;
} else {
return 1;
}
}
}
package com.yeejoin.amos.boot.module.cylinder.biz.listener;
import com.yeejoin.amos.boot.module.cylinder.flc.api.dto.CylinderFillingRecordDto;
/**
* @author Administrator
*/
public interface ICylinderFillingInsertListener {
/**
* 事件处理
* @param cylinderFillingRecordDto 充装对象
*/
void handle(CylinderFillingRecordDto cylinderFillingRecordDto);
}
package com.yeejoin.amos.boot.module.cylinder.biz.service.impl;
import com.yeejoin.amos.boot.module.cylinder.api.entity.CylinderFillingRecordStatisticsUnitDay;
import com.yeejoin.amos.boot.module.cylinder.api.mapper.CylinderFillingRecordStatisticsUnitDayMapper;
import com.yeejoin.amos.boot.module.cylinder.api.service.ICylinderFillingRecordStatisticsUnitDayService;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderFillingRecordStatisticsUnitDayDto;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
/**
* 气瓶充装统计表-企业-以天为维度服务实现类
*
* @author system_generator
* @date 2024-06-05
*/
@Service
public class CylinderFillingRecordStatisticsUnitDayServiceImpl extends BaseService<CylinderFillingRecordStatisticsUnitDayDto,CylinderFillingRecordStatisticsUnitDay,CylinderFillingRecordStatisticsUnitDayMapper> implements ICylinderFillingRecordStatisticsUnitDayService {
/**
* 分页查询
*/
public Page<CylinderFillingRecordStatisticsUnitDayDto> queryForCylinderFillingRecordStatisticsUnitDayPage(Page<CylinderFillingRecordStatisticsUnitDayDto> page) {
return this.queryForPage(page, null, false);
}
/**
* 列表查询 示例
*/
public List<CylinderFillingRecordStatisticsUnitDayDto> queryForCylinderFillingRecordStatisticsUnitDayList() {
return this.queryForList("" , false);
}
}
\ No newline at end of file
...@@ -1336,6 +1336,14 @@ public class CylinderInfoController extends BaseController { ...@@ -1336,6 +1336,14 @@ public class CylinderInfoController extends BaseController {
return ResponseHelper.buildResponse(map); return ResponseHelper.buildResponse(map);
} }
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(httpMethod = "GET", value = "主动向以天为维度的企业气瓶统计表中刷入当前时间前30天的数据")
@GetMapping(value = "/thirtyDayEnterpriseCylinderDataRefreshTask")
public ResponseModel<Object> thirtyDayEnterpriseCylinderDataRefreshTask() {
cylinderInfoServiceImpl.fillingRecordDataSynHandler();
return ResponseHelper.buildResponse("ok");
}
/** /**
* 地市气瓶,气站信息统计 * 地市气瓶,气站信息统计
* *
...@@ -1350,16 +1358,6 @@ public class CylinderInfoController extends BaseController { ...@@ -1350,16 +1358,6 @@ public class CylinderInfoController extends BaseController {
return ResponseHelper.buildResponse(result); return ResponseHelper.buildResponse(result);
} }
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(httpMethod = "GET", value = "某个企业充装次数及累计充装量统计")
@GetMapping(value = "/countFillingTimesAndQuantityByCompany")
public ResponseModel<JSONObject> countFillingTimesAndQuantityByCompany(@RequestParam(value = "companyId") String companyId,
@RequestParam(value = "startTime", required = false) String startTime,
@RequestParam(value = "endTime", required = false) String endTime) {
return ResponseHelper.buildResponse(cylinderInfoServiceImpl.countFillingTimesAndQuantityByCompany(companyId, startTime, endTime));
}
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "GET", value = "市级为维度,各市的充装次数和累计充装量,当前日期向前推31天的数据总和") @ApiOperation(httpMethod = "GET", value = "市级为维度,各市的充装次数和累计充装量,当前日期向前推31天的数据总和")
@GetMapping(value = "/countFillingTimesAndQuantityByCity") @GetMapping(value = "/countFillingTimesAndQuantityByCity")
......
...@@ -41,6 +41,10 @@ public class CylinderFillingCheckServiceImpl extends BaseService<CylinderFilling ...@@ -41,6 +41,10 @@ public class CylinderFillingCheckServiceImpl extends BaseService<CylinderFilling
return this.baseMapper.getFillingCountByMonth(appId,time); return this.baseMapper.getFillingCountByMonth(appId,time);
} }
public Integer getFillingCountByDay(String appId, Date time) {
return this.baseMapper.getFillingCountByDay(appId,time);
}
public Integer getFillingPassedCountByMonth(String appId, Date time) { public Integer getFillingPassedCountByMonth(String appId, Date time) {
return this.baseMapper.getFillingPassedCountByMonth(appId,time); return this.baseMapper.getFillingPassedCountByMonth(appId,time);
} }
......
...@@ -112,6 +112,13 @@ public class CylinderFillingRecordServiceImpl extends BaseService<CylinderFillin ...@@ -112,6 +112,13 @@ public class CylinderFillingRecordServiceImpl extends BaseService<CylinderFillin
public Integer getFillingCountByMonth(String appId, Date time) { public Integer getFillingCountByMonth(String appId, Date time) {
return baseMapper.getFillingCountByMonth(appId, time); return baseMapper.getFillingCountByMonth(appId, time);
} }
public Integer getFillingCountByDay(String appId, Date time) {
return baseMapper.getFillingCountByDay(appId, time);
}
public Integer getFillingUnqualifiedCountByDay(String appId, Date time) {
return baseMapper.getFillingUnqualifiedCountByDay(appId, time);
}
public Double getFillingSumByDate(String appId, Date time) { public Double getFillingSumByDate(String appId, Date time) {
return baseMapper.getFillingSumByDate(appId, time); return baseMapper.getFillingSumByDate(appId, time);
......
...@@ -41,6 +41,10 @@ public class CylinderFillingServiceImpl extends BaseService<CylinderFillingDto, ...@@ -41,6 +41,10 @@ public class CylinderFillingServiceImpl extends BaseService<CylinderFillingDto,
return this.baseMapper.getFillingCountByMonth(appId,time); return this.baseMapper.getFillingCountByMonth(appId,time);
} }
public Integer getFillingCountByDay(String appId, Date time) {
return this.baseMapper.getFillingCountByDay(appId,time);
}
public Integer getFillingPassedCountByMonth(String appId, Date time) { public Integer getFillingPassedCountByMonth(String appId, Date time) {
return this.baseMapper.getFillingPassedCountByMonth(appId,time); return this.baseMapper.getFillingPassedCountByMonth(appId,time);
} }
......
...@@ -8,12 +8,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -8,12 +8,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils; import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.module.cylinder.api.dto.CylinderFillingRecordStatisticsUnitDayDto;
import com.yeejoin.amos.boot.module.cylinder.api.dto.WarningMsgDto; import com.yeejoin.amos.boot.module.cylinder.api.dto.WarningMsgDto;
import com.yeejoin.amos.boot.module.cylinder.api.entity.ESCylinderInfoDto; import com.yeejoin.amos.boot.module.cylinder.api.entity.ESCylinderInfoDto;
import com.yeejoin.amos.boot.module.cylinder.api.entity.MsgLog; import com.yeejoin.amos.boot.module.cylinder.api.entity.MsgLog;
import com.yeejoin.amos.boot.module.cylinder.api.enums.EarlyWarningLevelEnum; import com.yeejoin.amos.boot.module.cylinder.api.enums.EarlyWarningLevelEnum;
import com.yeejoin.amos.boot.module.cylinder.api.mapper.ScheduleMapper; import com.yeejoin.amos.boot.module.cylinder.api.mapper.ScheduleMapper;
import com.yeejoin.amos.boot.module.cylinder.biz.dao.ESCylinderInfoRepository; import com.yeejoin.amos.boot.module.cylinder.biz.dao.ESCylinderInfoRepository;
import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.CylinderFillingRecordStatisticsUnitDayServiceImpl;
import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.MsgLogServiceImpl; import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.MsgLogServiceImpl;
import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.StartPlatformTokenService; import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.StartPlatformTokenService;
import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.TzsAuthServiceImpl; import com.yeejoin.amos.boot.module.cylinder.biz.service.impl.TzsAuthServiceImpl;
...@@ -36,6 +38,7 @@ import org.elasticsearch.client.RequestOptions; ...@@ -36,6 +38,7 @@ import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations; import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.metrics.ParsedCardinality; import org.elasticsearch.search.aggregations.metrics.ParsedCardinality;
...@@ -134,6 +137,9 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind ...@@ -134,6 +137,9 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind
CylinderFillingUnloadDataUnitServiceImpl cylinderFillingUnloadDataUnitServiceImpl; CylinderFillingUnloadDataUnitServiceImpl cylinderFillingUnloadDataUnitServiceImpl;
@Autowired @Autowired
CylinderFillingRecordStatisticsUnitDayServiceImpl cylinderFillingRecordStatisticsUnitDayServiceImpl;
@Autowired
MsgLogServiceImpl msgLogService; MsgLogServiceImpl msgLogService;
@Autowired @Autowired
TzsAuthServiceImpl tzsAuthService; TzsAuthServiceImpl tzsAuthService;
...@@ -603,19 +609,27 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind ...@@ -603,19 +609,27 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind
.count(new LambdaQueryWrapper<CylinderInfo>().eq(CylinderInfo::getAppId, cylinderUnit.getAppId())); .count(new LambdaQueryWrapper<CylinderInfo>().eq(CylinderInfo::getAppId, cylinderUnit.getAppId()));
int tags = cylinderTagsServiceImpl int tags = cylinderTagsServiceImpl
.count(new LambdaQueryWrapper<CylinderTags>().eq(CylinderTags::getAppId, cylinderUnit.getAppId())); .count(new LambdaQueryWrapper<CylinderTags>().eq(CylinderTags::getAppId, cylinderUnit.getAppId()));
String percent = ""; String tagPercent = "";
String cylinderPercent = "";
if (tags != 0) { if (tags != 0) {
double zz = (double) cylinder / (double) tags; double tagPercentDouble = (double) cylinder / (double) tags;
DecimalFormat df = new DecimalFormat("##.00%"); DecimalFormat df = new DecimalFormat("##.00%");
if (Math.abs(zz) < 0.0000000000001) { if (Math.abs(tagPercentDouble) < 0.0000000000001) {
percent = "0.00%"; tagPercent = "0.00%";
} else { } else {
percent = df.format(zz); tagPercent = df.format(tagPercentDouble);
}
double cylinderPercentDouble = (double) tags / (double) cylinder;
if (Math.abs(cylinderPercentDouble) < 0.0000000000001) {
cylinderPercent = "0.00%";
} else {
cylinderPercent =Math.abs(cylinderPercentDouble) > 1 ? "100%" : df.format(cylinderPercentDouble);
} }
} }
temp.setCylinderSum((long) cylinder); temp.setCylinderSum((long) cylinder);
temp.setTagsSum((long) tags); temp.setTagsSum((long) tags);
temp.setTagPercent(percent); temp.setTagPercent(tagPercent);
temp.setCylinderPercent(cylinderPercent);
cylinderTagsDataUnitServiceImpl.createWithModel(temp); cylinderTagsDataUnitServiceImpl.createWithModel(temp);
}); });
} }
...@@ -792,6 +806,63 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind ...@@ -792,6 +806,63 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind
cylinderFillingCheckDataUnitDto.setAppId(cylinderUnit.getAppId()); cylinderFillingCheckDataUnitDto.setAppId(cylinderUnit.getAppId());
} }
@Override
public void fillingRecordDataSynHandler() {
// 清空数据
cylinderFillingRecordStatisticsUnitDayServiceImpl.remove(new LambdaQueryWrapper<>());
countByUnit(cylinderUnit -> {
// 当前企业前31天数据填充
Calendar calendar = Calendar.getInstance();
for (int i = 0; i <= 30; i++) {
CylinderFillingRecordStatisticsUnitDayDto unitDay = new CylinderFillingRecordStatisticsUnitDayDto();
calendar.add(Calendar.DAY_OF_MONTH, -1);
calcCylinderFillingCheckDataUnitDataWithDay(cylinderUnit,calendar,unitDay);
cylinderFillingRecordStatisticsUnitDayServiceImpl.createWithModel(unitDay);
}
});
}
/**
* 计算当前单位的充装检查数据统计-以日为单位
*
* @param cylinderUnit
* @param calender
* @param unitDay
*/
public void calcCylinderFillingCheckDataUnitDataWithDay(CylinderUnit cylinderUnit, Calendar calender, CylinderFillingRecordStatisticsUnitDayDto unitDay) {
unitDay.setFillingDate(calender.getTime());
unitDay.setAppId(cylinderUnit.getAppId());
unitDay.setRegionCode(cylinderUnit.getRegionCode());
// 当天充装次数
Integer countThisDay = cylinderFillingRecordServiceImpl
.getFillingCountByDay(cylinderUnit.getAppId(), calender.getTime());
unitDay.setTotalSum(countThisDay);
// 当前充装前检查数
Integer fillingBeforeCount = cylinderFillingServiceImpl.getFillingCountByDay(cylinderUnit.getAppId(),
calender.getTime());
unitDay.setFillingBeforeSum(fillingBeforeCount);
// 当天充装后检查数
Integer fillingAfterCount = cylinderFillingCheckServiceImpl
.getFillingCountByDay(cylinderUnit.getAppId(), calender.getTime());
unitDay.setFillingAfterSum(fillingAfterCount);
// 当天充装量
Double fillingSumByDate= cylinderFillingRecordServiceImpl
.getFillingSumByDate(cylinderUnit.getAppId(), calender.getTime());
unitDay.setFillingQuantity(BigDecimal.valueOf(fillingSumByDate));
// 充装检查不合格数
Integer uniqueFillingBeforeSum = cylinderFillingRecordServiceImpl
.getFillingUnqualifiedCountByDay(cylinderUnit.getAppId(), calender.getTime());
unitDay.setFillingNotPassedCount(uniqueFillingBeforeSum);
}
/** /**
* 充装量、卸液量按单位统计 * 充装量、卸液量按单位统计
*/ */
...@@ -1091,7 +1162,7 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind ...@@ -1091,7 +1162,7 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind
long totle = 0; long totle = 0;
try { try {
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
for (org.elasticsearch.search.SearchHit hit : response.getHits()) { for (SearchHit hit : response.getHits()) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(hit); JSONObject jsonObject = (JSONObject) JSONObject.toJSON(hit);
ESCylinderInfoDto esCylinderInfoDto = JSONObject.toJavaObject(jsonObject.getJSONObject("sourceAsMap"), ESCylinderInfoDto.class); ESCylinderInfoDto esCylinderInfoDto = JSONObject.toJavaObject(jsonObject.getJSONObject("sourceAsMap"), ESCylinderInfoDto.class);
list.add(esCylinderInfoDto); list.add(esCylinderInfoDto);
...@@ -1283,35 +1354,6 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind ...@@ -1283,35 +1354,6 @@ public class CylinderInfoServiceImpl extends BaseService<CylinderInfoDto, Cylind
return cylinderInfoMapper.cyinderOutInfoList(page, cylinderInfoDto, sort, appids); return cylinderInfoMapper.cyinderOutInfoList(page, cylinderInfoDto, sort, appids);
} }
public JSONObject countFillingTimesAndQuantityByCompany(String companyId, String startTime, String endTime) {
Map<String, Object> stringObjectMap = cylinderInfoMapper.countFillingTimesAndQuantityByCompany(companyId, startTime, endTime);
// 组装成柱状图能渲染的格式
//{
// "seriesData": [
// {
// "data": [
// 3
// ],
// "name": "充装次数(次)"
// },
// {
// "data": [
// 1
// ],
// "name": "累计充装量(kg)"
// }
// ],
// "axisData": [
// "总数"
// ]
// }
String template = "{\"seriesData\": [{\"data\": [%s],\"name\": \"充装次数(次)\"},{\"data\": [%s],\"name\": \"累计充装量(kg)\"}],\"axisData\": [\"总数\"]}";
String format = String.format(template,
ObjectUtils.isEmpty(stringObjectMap.get("fillingTimes")) ? 0 : stringObjectMap.get("fillingTimes"),
ObjectUtils.isEmpty(stringObjectMap.get(FILLING_QUANTITY)) ? 0 : stringObjectMap.get(FILLING_QUANTITY));
return JSON.parseObject(format);
}
public Map<String, Object> countFillingTimesAndQuantityByCity() { public Map<String, Object> countFillingTimesAndQuantityByCity() {
// 查询所有的市级城市 // 查询所有的市级城市
List<RegionModel> regionModelList = Systemctl.regionClient.queryByLevel("2").getResult(); List<RegionModel> regionModelList = Systemctl.regionClient.queryByLevel("2").getResult();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment