Commit bca0a163 by 王衍超

预警功能完善;

parent 9dc22999
......@@ -6,9 +6,9 @@ package com.xyst.dinas.biz.enumeration;
public enum WarnStateEnum {
/**
* 未结束
* 执行中
*/
NOT_OVER(0),
EXECUTING(0),
/**
* 已结束
......
......@@ -80,7 +80,7 @@ public class SandMiningAreaServiceImpl implements SandMiningAreaService {
warnSetting.setBillType(WarnSettingConstant.SAND_MINING_AREA_BILL_TYPE);
warnSetting.setBillId(kobject.getUuid("id"));
warnSetting.setTarget(WarnSettingConstant.SAND_MINING_AREA_WARN_TARGET);
warnSetting.setTargetType(WarnTargetTypeEnum.NUMBER_TYPE.getCode());
warnSetting.setTargetType(WarnTargetTypeEnum.NUMBER_TYPE.name());
warnSetting.setOpen(false);
warnSetting.setMemo(getAreaWarningInfo(kobject));
warningSettingService.insertWarnSetting(warnSetting);
......
......@@ -3,20 +3,49 @@ package com.xyst.dinas.biz.request;
import java.util.List;
import java.util.UUID;
public class UpdateWarnSetting {
public class WarnSettingReq {
private UUID id;
private UUID version;
private String billType;
private UUID billId;
private String target;
private String targetType;
private String max;
private String min;
private String max;
private String warnCalculator;
private List<UUID> personnel;
private String memo;
private Boolean isOpen;
public String getBillType() {
return billType;
}
public void setBillType(String billType) {
this.billType = billType;
}
public String getTargetType() {
return targetType;
}
public void setTargetType(String targetType) {
this.targetType = targetType;
}
public String getWarnCalculator() {
return warnCalculator;
}
public void setWarnCalculator(String warnCalculator) {
this.warnCalculator = warnCalculator;
}
public Boolean isOpen() {
return isOpen;
}
public void setOpen(Boolean isOpen) {
this.isOpen = isOpen;
}
public UUID getId() {
return id;
}
......
......@@ -29,7 +29,9 @@ import com.xyst.dinas.biz.warn.service.WarningService;
/**
* 业务预警基类
*
*
* 别动我代码!!!
*
* @author Jackpot
* @date 2021年3月26日
*/
......@@ -47,7 +49,7 @@ public class BaseBusinessWarn {
/** 预警设置ID*/
protected UUID warnSettingId;
private IWarningCalculate warningCalculate;
private IWarningCalculator warningCalculate;
private WarningService warningSettingService;
......@@ -90,7 +92,7 @@ public class BaseBusinessWarn {
}
/** 计算是否预警*/
public final void setWarningCalculate(IWarningCalculate warningCalculate) {
public final void setWarningCalculate(IWarningCalculator warningCalculate) {
this.warningCalculate = warningCalculate;
}
......@@ -108,11 +110,12 @@ public class BaseBusinessWarn {
boolean isWarning = false;
WarnSetting warnSetting = getWarnSetting();
if(warnSetting==null ) return false;//|| !warnSetting.isOpen()
if(warningCalculate == null && warnSetting.warnCalculator()!=null) {
warningCalculate = Amino.getApplicationMetadataContext().getBean(warnSetting.warnCalculator(),IWarningCalculator.class);
}
Assert.notNull(warningCalculate, "The warningCalculate must not be null!");
//计算业务实际的值, 与预警设置中的值做比较, 计算是否预警
isWarning = warningCalculate.isWarning(warnSetting);
// if(!isWarning) isNotice= false;
//记录预警日志
UUID warnSettingId = warnSetting.getSettingId();
WarnExeRecord warnExeRecord = warningSettingService.queryWarnExeRecord(warnSettingId);
......@@ -128,16 +131,13 @@ public class BaseBusinessWarn {
Date currentTime = new Date();
warnExeRecord.setRecentlyTime(currentTime);
warnExeRecord.setActualValue(warningCalculate.getActualValue());
if(!isWarning) {//2.1 如果没有触发预警,则结束该预警记录
//如果预警已经结束,则不修改
if((WarnStateEnum.OVER.getValue()+"").equals(warnExeRecord.getWarnState())){
return true;
}
if(!isWarning) { //2.1 如果没有触发预警,则结束该预警记录
warnExeRecord.setEndTime(currentTime);
warnExeRecord.setWarnState(WarnStateEnum.OVER.getValue()+"");
warnExeRecord.setWarnState(WarnStateEnum.OVER.getValue());
}
warningSettingService.updateWarnExe(warnExeRecord);
}
//通知人员
String[] noticePerson = warnSetting.getPersonnel();
String message = warningCalculate.warnMessage();
try {
......@@ -152,7 +152,7 @@ public class BaseBusinessWarn {
private WarnExeRecord createWarnExeRecord(WarnSetting warnSetting) {
WarnExeRecord warnExeRecord = new WarnExeRecord();
Date currentTime = new Date();
warnExeRecord.setWarnState(WarnStateEnum.NOT_OVER.getValue()+"");
warnExeRecord.setWarnState(WarnStateEnum.EXECUTING.getValue());
warnExeRecord.setStartTime(currentTime);
warnExeRecord.setRecentlyTime(currentTime);
warnExeRecord.setTarget(warnSetting.getTarget());
......
package com.xyst.dinas.biz.warn;
/**
* 预警计算器
*
* 预警计算器<br/>
*
* 预警计算器的实现分为两类:<br/>
* 1. 注册为Bean, 并且持久化到预警设置中的预警计算器; 使用场景: 新增/修改预警设置,手动触发预警以及业务数据变化实时触发预警;<br/>
* 2. 轻量级预警计算器; (不需要注册为Bean,不需要持久化) 使用场景:业务数据变化实时触发预警<br/>
*
* 注: 因为轻量级预警计算器不需要再次查询业务实时数据,所以更适合实时触发预警的场景;<br/>
*
* @author Jackpot
* @date 2021年3月30日
*/
public interface IWarningCalculate {
public interface IWarningCalculator {
/**
* 计算是否预警
......@@ -26,7 +32,6 @@ public interface IWarningCalculate {
*/
String getActualValue();
//boolean isRepeat();重复执行
//重复执行
}
......@@ -18,7 +18,7 @@ public class WarnExeRecord {
private Date recentlyTime;
private UUID warnSettingId;
private String warnState;
private Integer warnState;
private UUID billId;
private String target;
......@@ -72,10 +72,10 @@ public class WarnExeRecord {
public void setWarnSettingId(UUID warnSettingId) {
this.warnSettingId = warnSettingId;
}
public String getWarnState() {
public Integer getWarnState() {
return warnState;
}
public void setWarnState(String warnState) {
public void setWarnState(Integer warnState) {
this.warnState = warnState;
}
public UUID getBillId() {
......
package com.xyst.dinas.biz.warn;
import java.util.List;
import java.util.UUID;
/**
......@@ -13,12 +12,6 @@ import java.util.UUID;
*/
public interface WarnSetting {
//触发时机
/** 预警开关:是否预警*/
boolean isOpen();
/** 预警设置ID*/
UUID getSettingId();
......@@ -39,11 +32,15 @@ public interface WarnSetting {
/** 阀值下限*/
String getMin();
/** 人员*/
/** 通知人员*/
String[] getPersonnel();
/** 备注*/
String getMemo();
/** 预警开关:是否预警*/
boolean isOpen();
/** 预警计算器: Bean标识*/
String warnCalculator();
}
......@@ -10,12 +10,26 @@ public class WarnSettingConstant {
/** 实体名:预警执行记录 */
public static final String ENTITY_WARNINGEXE = "com.xyst.dinas.biz.datamodel.WarningExe";
/** 预警结束时间 */
public static final String END_TIME = "endTime";
/** 预警设置ID */
public static final String WARN_SETTING = "warnSetting";
/** 预警开始时间 */
public static final String START_TIME = "startTime";
/** 最近预警时间 */
public static final String RECENTLY_TIME = "recentlyTime";
/** 预警结束时间 */
public static final String END_TIME = "endTime";
/** 预警记录状态 */
public static final String WARN_STATE = "warnState";
/** 实际值 */
public static final String ACTUAL_VALUE = "actualValue";
/** 预警计算器 */
public static final String warnCalculator = "warnCalculator";
/** 预警开关 */
public static final String isOpen = "isOpen";
/** 预警阀值下限 */
public static final String min = "min";
/** 预警阀值上限 */
public static final String max = "max";
/**
......
......@@ -2,23 +2,21 @@ package com.xyst.dinas.biz.warn;
import java.util.UUID;
public class WarnSettingEntity implements WarnSetting{
public class WarnSettingEntity implements WarnSetting {
private UUID settingId;
private String billType;
private UUID billId;
private String target;
private String targetType;
private String max;
private String min;
private String warnCalculator;
private String[] personnel;
private String memo;
private boolean isOpen;
private String memo;
public String getTargetType() {
return targetType;
}
......@@ -83,7 +81,6 @@ public class WarnSettingEntity implements WarnSetting{
this.min = min;
}
public String[] getPersonnel() {
return personnel;
}
......@@ -100,5 +97,14 @@ public class WarnSettingEntity implements WarnSetting{
this.isOpen = isOpen;
}
public void setWarnCalculator(String warnCalculator) {
this.warnCalculator = warnCalculator;
}
@Override
public String warnCalculator() {
return warnCalculator;
}
}
......@@ -11,44 +11,38 @@ public enum WarnTargetTypeEnum {
/**
* 整数
*/
INT_TYPE("INT_TYPE","整数"),
INT_TYPE("整数"),
/**
* 小数
*/
NUMBER_TYPE("NUMBER_TYPE","小数"),
NUMBER_TYPE("小数"),
/**
* 日期
*/
DATE_TYPE("DATE_TYPE","日期"),
DATE_TYPE("日期"),
/**
* 时间
*/
TIME_TYPE("TIME_TYPE","时间"),
TIME_TYPE("时间"),
/**
* 日期时间
*/
DATE_TIME_TYPE("DATE_TIME_TYPE","日期时间"),
DATE_TIME_TYPE("日期时间"),
/**
* 布尔
*/
BOOL_TYPE("BOOL_TYPE","布尔"),
BOOL_TYPE("布尔"),
;
String code;
String name;
WarnTargetTypeEnum(String code,String name) {
this.code = code;
WarnTargetTypeEnum(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
......
......@@ -16,7 +16,7 @@ import com.beecode.bcp.type.KObject;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.inz.common.BaseConstants;
import com.fasterxml.jackson.databind.JsonNode;
import com.xyst.dinas.biz.request.UpdateWarnSetting;
import com.xyst.dinas.biz.request.WarnSettingReq;
import com.xyst.dinas.biz.warn.dao.WarnSettingDao;
import com.xyst.dinas.biz.warn.service.WarningService;
......@@ -27,7 +27,8 @@ public class WarningServiceImpl implements WarningService{
private WarnSettingDao warnSettingDao;
/**
* 新增预警设置
* 新增预警设置<br/>
* 自动触发预警
*/
@Override
public UUID insertWarnSetting(WarnSetting warnSetting) {
......@@ -38,7 +39,42 @@ public class WarningServiceImpl implements WarningService{
object.set(BaseConstants.CREATE_TIME, LocalDateTime.now());
object.set(BaseConstants.DEL,false);
object.set(BaseConstants.DISCARD,false);
return warnSettingDao.create(object);
object.set(WarnSettingConstant.isOpen, warnSetting.isOpen());
object.set(WarnSettingConstant.warnCalculator, warnSetting.warnCalculator());
UUID warSettingId = warnSettingDao.create(object);
//新增后触发预警
BaseBusinessWarn baseBusinessWarn = new BaseBusinessWarn(warSettingId);
baseBusinessWarn.warn();
return warSettingId;
}
/**
* 更新预警设置<br/>
* 自动触发预警
*/
@Override
public void updateWarnSetting(WarnSettingReq warnSetting) {
UUID warSettingId = warnSetting.getId();
Assert.notNull(warSettingId, "The warSettingId must not be null");
KObject warSettingIdObj = warnSettingDao.queryWarnSettingById(warSettingId);
List<UUID> personnel = warnSetting.getPersonnel();
if (personnel!=null) {
String personnelStr = UuidListToString(personnel);
warSettingIdObj.set("personnel", personnelStr);
}
String min = warnSetting.getMin();
if(min != null) warSettingIdObj.set(WarnSettingConstant.min, min);
String max = warnSetting.getMax();
if(max != null) warSettingIdObj.set(WarnSettingConstant.max, max);
Boolean isOpen = warnSetting.isOpen();
if(isOpen != null) warSettingIdObj.set(WarnSettingConstant.isOpen, isOpen);
warnSettingDao.update(warSettingIdObj);
//修改后触发预警
BaseBusinessWarn baseBusinessWarn = new BaseBusinessWarn(warSettingId);
baseBusinessWarn.warn();
}
/**
......@@ -52,14 +88,28 @@ public class WarningServiceImpl implements WarningService{
KClass type = Amino.getApplicationMetadataContext().getBean(WarnSettingConstant.ENTITY_WARNINGEXE, KClass.class);
JsonNode json = JSONObjectUtils.toJson(warnExeRecord);
KObject object = JSONObjectUtils.toObject(json, type);
object.set("startTime", warnExeRecord.getStartTime());
object.set("recentlyTime", warnExeRecord.getRecentlyTime());
object.set(WarnSettingConstant.START_TIME, warnExeRecord.getStartTime());
object.set(WarnSettingConstant.RECENTLY_TIME, warnExeRecord.getRecentlyTime());
UUID warnSettingId = warnExeRecord.getWarnSettingId();
KObject warnSettingObj = warnSettingDao.queryWarnSettingById(warnSettingId);
object.set("warnSetting", warnSettingObj);
object.set(WarnSettingConstant.WARN_SETTING, warnSettingObj);
object.set(WarnSettingConstant.WARN_STATE, warnExeRecord.getWarnState());
object.set(WarnSettingConstant.ACTUAL_VALUE, warnExeRecord.getActualValue());
return warnSettingDao.create(object);
}
@Override
public void updateWarnExe(WarnExeRecord warnExeRecord) {
KClass type = Amino.getApplicationMetadataContext().getBean(WarnSettingConstant.ENTITY_WARNINGEXE, KClass.class);
JsonNode json = JSONObjectUtils.toJson(warnExeRecord);
KObject object = JSONObjectUtils.toObject(json, type);
object.set("recentlyTime", warnExeRecord.getRecentlyTime());
object.set("endTime", warnExeRecord.getEndTime());
object.set("warnState", warnExeRecord.getWarnState());
object.set("actualValue", warnExeRecord.getActualValue());
warnSettingDao.update(object);
}
/**
* 结束一条预警设置的预警执行记录
* @param warnSettingId
......@@ -94,7 +144,7 @@ public class WarningServiceImpl implements WarningService{
@Override
public void ignoreWarnExeRecord(UUID id) {
KObject kObject = warnSettingDao.queryWarningExeById(id);
kObject.set(WarnSettingConstant.WARN_STATE, WarnStateEnum.IGNORE.getValue()+"");
kObject.set(WarnSettingConstant.WARN_STATE, WarnStateEnum.IGNORE.getValue());
warnSettingDao.update(kObject);
}
......@@ -103,19 +153,6 @@ public class WarningServiceImpl implements WarningService{
return warnSettingDao.warnRecodeGroupInfo(regionalCompanyIds,targets);
}
@Override
public void updateWarnExe(WarnExeRecord warnExeRecord) {
KClass type = Amino.getApplicationMetadataContext().getBean(WarnSettingConstant.ENTITY_WARNINGEXE, KClass.class);
JsonNode json = JSONObjectUtils.toJson(warnExeRecord);
KObject object = JSONObjectUtils.toObject(json, type);
object.set("startTime", warnExeRecord.getStartTime());
object.set("endTime", warnExeRecord.getEndTime());
object.set("recentlyTime", warnExeRecord.getRecentlyTime());
UUID warnSettingId = warnExeRecord.getWarnSettingId();
KObject warnSettingObj = warnSettingDao.queryWarnSettingById(warnSettingId);
object.set("warnSetting", warnSettingObj);
warnSettingDao.update(object);
}
@Override
public KObject queryWarnSettingById(UUID id) {
......@@ -123,28 +160,6 @@ public class WarningServiceImpl implements WarningService{
return KObj;
}
@Override
public void updateWarnSetting(UpdateWarnSetting warnSetting) {
UUID warSettingId = warnSetting.getId();
Assert.notNull(warSettingId, "The warSettingId must not be null");
KObject warSettingIdObj = warnSettingDao.queryWarnSettingById(warSettingId);
List<UUID> personnel = warnSetting.getPersonnel();
if (personnel!=null) {
String personnelStr = UuidListToString(personnel);
warSettingIdObj.set("personnel", personnelStr);
}
String min = warnSetting.getMin();
if(min != null) {
warSettingIdObj.set("min", min);
}
String max = warnSetting.getMax();
if(max != null) {
warSettingIdObj.set("max", max);
}
warnSettingDao.update(warSettingIdObj);
}
/**
* 删除预警设置
......
package com.xyst.dinas.biz.warn.dao;
import java.time.LocalDateTime;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.persistence.Tuple;
import com.beecode.amino.core.Amino;
import com.beecode.bcp.type.KClass;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.inz.basis.util.JsonUtil;
import com.xyst.dinas.biz.constant.SandMiningAreaConstant;
import com.xyst.dinas.biz.enumeration.WarnStateEnum;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.*;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.Query;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.orm.hibernate5.HibernateOperations;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;
import com.beecode.amino.core.Amino;
import com.beecode.bcp.type.KClass;
import com.beecode.bcp.type.KObject;
import com.xyst.dinas.biz.enumeration.WarnStateEnum;
import com.xyst.dinas.biz.warn.WarnExeRecord;
import com.xyst.dinas.biz.warn.WarnSetting;
import com.xyst.dinas.biz.warn.WarnSettingConstant;
import com.xyst.dinas.biz.warn.WarnSettingEntity;
import org.springframework.util.CollectionUtils;
@Repository
public class WarnSettingDao {
......@@ -62,7 +69,7 @@ public class WarnSettingDao {
LocalDateTime now = LocalDateTime.now();
warnRecord.set(WarnSettingConstant.END_TIME, now);
warnRecord.set(WarnSettingConstant.RECENTLY_TIME, now);
warnRecord.set(WarnSettingConstant.WARN_STATE, WarnStateEnum.OVER.getValue() + "");
warnRecord.set(WarnSettingConstant.WARN_STATE, WarnStateEnum.OVER.getValue());
update(warnRecord);
}
......@@ -82,7 +89,7 @@ public class WarnSettingDao {
if (billId != null) hql.append(" and billId =:billId");
if (target != null) hql.append(" and target =:target");
Query<KObject> query = session.createQuery(hql.toString(), KObject.class);//KObject
Query<KObject> query = session.createQuery(hql.toString(), KObject.class);
query.setParameter("billType", billType);
if (billId != null) query.setParameter("billId", billId);
if (target != null) query.setParameter("target", target);
......@@ -102,6 +109,7 @@ public class WarnSettingDao {
String personnel = singleResult.getString("personnel");
boolean isOpen = singleResult.getBoolean("isOpen");
String memo = singleResult.getString("memo");
String warnCalculator = singleResult.getString("warnCalculator");
WarnSettingEntity warnSettingEntity = new WarnSettingEntity();
warnSettingEntity.setBillType(billType);
......@@ -112,6 +120,7 @@ public class WarnSettingDao {
warnSettingEntity.setMax(max);
warnSettingEntity.setOpen(isOpen);
warnSettingEntity.setMemo(memo);
warnSettingEntity.setWarnCalculator(warnCalculator);
String[] personnelArray = personnel != null && !personnel.isEmpty() ? personnel.split(",") : null;
warnSettingEntity.setPersonnel(personnelArray);
......@@ -161,6 +170,7 @@ public class WarnSettingDao {
UUID billId = singleResult.getUuid("billId");
UUID id = singleResult.getUuid("id");
Long version = singleResult.getLong("version");
int warnState = singleResult.getInt("warnState");
WarnExeRecord warnExeRecord = new WarnExeRecord();
warnExeRecord.setStartTime(startTime);
......@@ -173,10 +183,9 @@ public class WarnSettingDao {
warnExeRecord.setMemo(memo);
warnExeRecord.setTarget(target);
warnExeRecord.setBillId(billId);
warnExeRecord.setWarnState("warnState");
warnExeRecord.setWarnState(warnState);
warnExeRecord.setId(id);
warnExeRecord.setVersion(version);
return warnExeRecord;
});
}
......
......@@ -8,7 +8,7 @@ import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import com.beecode.bcp.type.KObject;
import com.xyst.dinas.biz.request.UpdateWarnSetting;
import com.xyst.dinas.biz.request.WarnSettingReq;
import com.xyst.dinas.biz.warn.BaseBusinessWarn;
import com.xyst.dinas.biz.warn.WarnExeRecord;
import com.xyst.dinas.biz.warn.WarnSetting;
......@@ -38,7 +38,7 @@ public interface WarningService {
* 更新预警设置
* @param warnSetting
*/
void updateWarnSetting(UpdateWarnSetting warnSetting);
void updateWarnSetting(WarnSettingReq warnSetting);
/**
* 删除预警设置
......
......@@ -7,7 +7,7 @@ import com.beecode.bcp.type.KObject;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.inz.basis.team.pojo.ResponseObj;
import com.xyst.dinas.biz.constant.SandMiningAreaConstant;
import com.xyst.dinas.biz.request.UpdateWarnSetting;
import com.xyst.dinas.biz.request.WarnSettingReq;
import com.xyst.dinas.biz.service.SandMiningAreaService;
import com.xyst.dinas.biz.warn.service.WarningService;
import org.apache.commons.lang3.StringUtils;
......@@ -130,7 +130,7 @@ public class SandMiningAreaController {
//更新预警设置
@PostMapping("/warnSetting/update")//采区预警设置更新
public ResponseObj updateWarnSettingPerson(@RequestBody UpdateWarnSetting updateWarnSetting) {
public ResponseObj updateWarnSettingPerson(@RequestBody WarnSettingReq updateWarnSetting) {
UUID settingId = updateWarnSetting.getId();
warningSettingService.updateWarnSetting(updateWarnSetting);
......
......@@ -8,11 +8,15 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.basis.team.pojo.ResponseObj;
import com.xyst.dinas.biz.request.WarnSettingReq;
import com.xyst.dinas.biz.warn.WarnSettingEntity;
import com.xyst.dinas.biz.warn.service.WarningService;
/**
......@@ -27,13 +31,22 @@ public class WarnSettingController {
@Autowired
private WarningService warningService;
//新增预警设置
@PostMapping("/warnsetting/insert")
public Object insertWarnSetting(@RequestBody WarnSettingEntity warnSettingEntity) {
warningService.insertWarnSetting(warnSettingEntity);
return ResponseObj.success("预警设置新增成功");
}
//更新预警设置
// @PostMapping("/warnsetting/update")
// public String updateWarnSettingPerson(@RequestBody UpdateWarnSetting warnSetting) {
//
// warningSettingService.updateWarnSetting(warnSetting);
// return "success";
// }
@PostMapping("/warnsetting/update")
public Object updateWarnSetting(@RequestBody WarnSettingReq warnSettingReq) {
warningService.updateWarnSetting(warnSettingReq);
return ResponseObj.success("预警设置更新成功");
}
//查询一条预警设置
@GetMapping("/warnsetting/{id}")
......@@ -53,4 +66,6 @@ public class WarnSettingController {
}
......@@ -35,6 +35,9 @@
<attribute id='cbb5b983-299b-4259-97d9-6470651bb18b' name='isOpen' columnName='is_open' title='是否开启' type='boolean' default='' precision='' isArray='false'>
<annotation id='ea154cb8-f939-4e9f-9793-9673d984161f' attributeId='ffc0a199-4038-4ebf-a94f-a0f12bfc76dd' name='length' value='100'></annotation>
</attribute>
<attribute id='cbb5b983-299b-4259-97d9-6470651bb18b' name='warnCalculator' columnName='warn_calculator' title='预警计算器' type='string' default='' precision='' isArray='false'>
<annotation id='ea154cb8-f939-4e9f-9793-9673d984161f' attributeId='ffc0a199-4038-4ebf-a94f-a0f12bfc76dd' name='length' value='100'></annotation>
</attribute>
<attribute id='cbb5b983-299b-4259-97d9-6470651bb18b' name='personnel' columnName='personnel' title='人员' type='string' default='' precision='' isArray='false'>
<annotation id='ea154cb8-f939-4e9f-9793-9673d984161f' attributeId='ffc0a199-4038-4ebf-a94f-a0f12bfc76dd' name='length' value='1000'></annotation>
</attribute>
......
......@@ -27,8 +27,8 @@
<annotation id='00caecc1-35aa-4342-90c8-250f84609fe4' attributeId='55efd3f5-036a-4ac4-83c9-14e22cf5465a' name='length' value='undefined'></annotation>
<annotation id='95a6dd6d-c676-4265-9c8b-d115c13b472f' attributeId='43768653-e259-4b0f-8c9d-8739f030675b' name='mappingType' value='many-to-one'></annotation>
</attribute>
<attribute id='cbb5b983-299b-4259-97d9-6470651bb18b' name='warnState' columnName='warn_state' title='预警状态' type='string' default='' precision='' isArray='false'>
<annotation id='ea154cb8-f939-4e9f-9793-9673d984161f' attributeId='ffc0a199-4038-4ebf-a94f-a0f12bfc76dd' name='length' value='100'></annotation>
<attribute id='cbb5b983-299b-4259-97d9-6470651bb18b' name='warnState' columnName='warn_state' title='预警状态' type='int' default='' precision='' isArray='false'>
<annotation id='ea154cb8-f939-4e9f-9793-9673d984161f' attributeId='ffc0a199-4038-4ebf-a94f-a0f12bfc76dd' name='length' value='6'></annotation>
</attribute>
<attribute id='cbb5b983-299b-4259-97d9-6470651bb18b' name='message' columnName='message' title='预警消息' type='string' default='' precision='' isArray='false'>
<annotation id='ea154cb8-f939-4e9f-9793-9673d984161f' attributeId='ffc0a199-4038-4ebf-a94f-a0f12bfc76dd' name='length' value='100'></annotation>
......
......@@ -173,6 +173,29 @@
<m:attribute>
<m:annotations>
<m:annotation>
<m:type>bcp.type.constraint.StringLength</m:type>
<m:value>100</m:value>
</m:annotation>
<m:annotation>
<m:type>javax.persistence.Column</m:type>
<m:properties>
<m:property>
<m:key>name</m:key>
<m:value>warn_calculator</m:value>
</m:property>
</m:properties>
</m:annotation>
</m:annotations>
<m:id>cbb5b983-299b-4259-97d9-6470651bb18b</m:id>
<m:name>warnCalculator</m:name>
<m:title>预警计算器</m:title>
<m:type>string</m:type>
<m:description></m:description>
<m:default></m:default>
</m:attribute>
<m:attribute>
<m:annotations>
<m:annotation>
<m:type>javax.persistence.Column</m:type>
<m:properties>
<m:property>
......
......@@ -123,10 +123,6 @@
<m:attribute>
<m:annotations>
<m:annotation>
<m:type>bcp.type.constraint.StringLength</m:type>
<m:value>100</m:value>
</m:annotation>
<m:annotation>
<m:type>javax.persistence.Column</m:type>
<m:properties>
<m:property>
......@@ -136,13 +132,13 @@
</m:properties>
</m:annotation>
</m:annotations>
<m:id>cbb5b983-299b-4259-97d9-6470651bb18b</m:id>
<m:id>0933ceb1-f327-4372-a316-cffa1c80991a</m:id>
<m:name>warnState</m:name>
<m:title>预警状态</m:title>
<m:type>string</m:type>
<m:type>int</m:type>
<m:description></m:description>
<m:default></m:default>
</m:attribute>
</m:attribute>
<m:attribute>
<m:annotations>
<m:annotation>
......
......@@ -64,6 +64,9 @@
<property name="isOpen" type="boolean" not-null="false">
<column name="is_open" length="1"></column>
</property>
<property name="warnCalculator" type="nstring" not-null="false">
<column name="warn_calculator" length="100"></column>
</property>
<property name="personnel" type="nstring" not-null="false">
<column name="personnel" length="1000"></column>
......
......@@ -25,8 +25,8 @@
<many-to-one name="warnSetting" entity-name="com.xyst.dinas.biz.datamodel.WarnSetting" fetch="select">
<column name="warn_setting_id" not-null="false"/>
</many-to-one>
<property name="warnState" type="nstring" not-null="false">
<column name="warn_state" length="50"></column>
<property name="warnState" type="int" not-null="false">
<column name="warn_state" length="6"></column>
</property>
<property name="message" type="nstring" not-null="false">
<column name="message" length="100"></column>
......
......@@ -23,6 +23,9 @@ import com.xyst.dinas.contract.service.ContractService;
import com.xyst.dinas.contract.service.ContractWarnService;
import com.xyst.dinas.contract.task.ContractExpireCheckTask;
import com.xyst.dinas.contract.task.ContractExpireCheckTaskRegister;
import com.xyst.dinas.contract.warn.AdvanceBalanceWarningCalculator;
import com.xyst.dinas.contract.warn.ContractExpireWarningCalculator;
import com.xyst.dinas.contract.warn.DinasCountWarningCalculator;
import com.xyst.dinas.contract.web.ContractController;
import com.xyst.dinas.contract.web.ContractWarnController;
/**
......@@ -134,4 +137,20 @@ public class ContractConfiguration {
public ContractExpireCheckTask contractExpireCheckTask() {
return new ContractExpireCheckTask();
}
@Bean("com.xyst.dinas.contract.warn.DinasCountWarningCalculator")
public DinasCountWarningCalculator dinasCountWarningCalculator() {
return new DinasCountWarningCalculator();
}
@Bean("com.xyst.dinas.contract.warn.AdvanceBalanceWarningCalculator")
public AdvanceBalanceWarningCalculator advanceBalanceWarningCalculator() {
return new AdvanceBalanceWarningCalculator();
}
@Bean("com.xyst.dinas.contract.warn.ContractExpireWarningCalculator")
public ContractExpireWarningCalculator contractExpireWarningCalculator() {
return new ContractExpireWarningCalculator();
}
}
......@@ -8,6 +8,9 @@ public class ContractConstant {
/** 实体名:合同表 */
public static final String ENTITY_CONTRACT = "com.xyst.dinas.contract.datamodel.Contract";
/** 实体名:合同子表 */
public static final String CONTRACT_DETAILS = "contractDetails";
/** 项目 */
public static final String PROJECT = "project";
/** 项目编号 */
......@@ -42,6 +45,9 @@ public class ContractConstant {
public static final String CHANGE_REASON = "changeReason";
/** 砂石种类 */
public static final String dinasType = "dinasType";
/*********************** 工作流 *************************************/
......
......@@ -31,6 +31,7 @@ import com.xyst.dinas.contract.enumeration.ContractStateEnum;
import com.xyst.dinas.contract.internal.dao.ContractDao;
import com.xyst.dinas.contract.internal.dao.ContractInfoDao;
import com.xyst.dinas.contract.service.ContractService;
import com.xyst.dinas.contract.warn.ContractWarnConst;
import com.xyst.dinas.project.dao.ProjectFiledDao;
import com.xyst.dinas.project.dao.PurchaseSandCompanyDao;
......@@ -207,40 +208,40 @@ public class ContractServiceImpl implements ContractService {
//1.合同审批通过后,自动新增砂石余量预警设置
UUID contractId = contract.getUuid("id");
String billType = "合同";
String billType = ContractWarnConst.billType;
String contractBaseInfo = getContractBaseInfo(contract);
List<KObject> detials = contract.get("contractDetails").toList();
//
for (KObject detail : detials) {
String dinasTypeName = detail.get("dinasType").getString("dinasTypeName");
WarnSettingEntity warnSetting = new WarnSettingEntity();
warnSetting.setBillType(billType);
warnSetting.setBillId(contractId);
warnSetting.setTarget(dinasTypeName);
warnSetting.setTargetType(WarnTargetTypeEnum.NUMBER_TYPE.getCode());
warnSetting.setTargetType(WarnTargetTypeEnum.NUMBER_TYPE.name());
warnSetting.setOpen(true);
warnSetting.setMemo(contractBaseInfo);
warnSetting.setWarnCalculator(ContractWarnConst.dinasCountWarningCalculator);
warningSettingService.insertWarnSetting(warnSetting);
}
//2.自动新增一条合同到期预警设置
String target2 = "到期提醒(天)";
WarnSettingEntity expireWarnSetting = new WarnSettingEntity();
expireWarnSetting.setBillType(billType);
expireWarnSetting.setBillId(contractId);
expireWarnSetting.setTarget(target2);
expireWarnSetting.setTargetType(WarnTargetTypeEnum.INT_TYPE.getCode());
expireWarnSetting.setTarget(ContractWarnConst.warningTarget2);
expireWarnSetting.setTargetType(WarnTargetTypeEnum.INT_TYPE.name());
expireWarnSetting.setOpen(true);
expireWarnSetting.setMemo(contractBaseInfo);
expireWarnSetting.setWarnCalculator(ContractWarnConst.contractExpireWarningCalculator);
warningSettingService.insertWarnSetting(expireWarnSetting);
//3.自动新增一条合同预付款余额预警设置
String target3 = "预付款余额";
WarnSettingEntity paymentWarnSetting = new WarnSettingEntity();
paymentWarnSetting.setBillType(billType);
paymentWarnSetting.setBillId(contractId);
paymentWarnSetting.setTarget(target3);
paymentWarnSetting.setTargetType(WarnTargetTypeEnum.NUMBER_TYPE.getCode());
paymentWarnSetting.setTarget(ContractWarnConst.warningTarget3);
paymentWarnSetting.setTargetType(WarnTargetTypeEnum.NUMBER_TYPE.name());
paymentWarnSetting.setOpen(true);
paymentWarnSetting.setMemo(contractBaseInfo);
paymentWarnSetting.setWarnCalculator(ContractWarnConst.advanceBalanceWarningCalculator);
warningSettingService.insertWarnSetting(paymentWarnSetting);
}
......
package com.xyst.dinas.contract.internal.service;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.bcp.type.KObject;
import com.xyst.dinas.biz.warn.WarnSettingEntity;
import com.xyst.dinas.biz.warn.service.WarningService;
import com.xyst.dinas.contract.constant.ContractConstant;
import com.xyst.dinas.contract.enumeration.ContractStateEnum;
import com.xyst.dinas.contract.internal.dao.ContractInfoDao;
import com.xyst.dinas.contract.service.ContractWarnService;
public class ContractWarnServiceImpl implements ContractWarnService{
@Autowired
private WarningService warningSettingService;
@Autowired
private ContractInfoDao contractInfoDao;
/*
* @Autowired private WarningService warningSettingService;
*
* @Autowired private ContractInfoDao contractInfoDao;
*/
// @Override
public void afterApproved(KObject contract) {
contract.set(ContractConstant.CONTRACT_STATE,ContractStateEnum.EXECUTING.name());
contractInfoDao.update(contract);
//合同审批通过后,自动新增砂石余量预警设置
UUID contractId = contract.getUuid("id");
List<KObject> detials = contract.get("contractDetail").toList();
//
for (KObject detail : detials) {
String dinasTypeName = detail.get("dinasType").getString("dinasTypeName");
String billType = "合同";
WarnSettingEntity warnSetting = new WarnSettingEntity();
warnSetting.setBillType(billType);
warnSetting.setBillId(contractId);
warnSetting.setTarget(dinasTypeName);
warnSetting.setOpen(true);
warningSettingService.insertWarnSetting(warnSetting);
}
}
}
package com.xyst.dinas.contract.warn;
import org.springframework.beans.factory.annotation.Autowired;
import com.xyst.dinas.biz.warn.IWarningCalculator;
import com.xyst.dinas.biz.warn.WarnSetting;
import com.xyst.dinas.contract.service.ContractService;
/**
* 预付款余额 预警计算器
*
* @author Jackpot
* @date 2021年4月22日
*/
public class AdvanceBalanceWarningCalculator implements IWarningCalculator{
private double advanceBalance;
private String warnMessage;
@Autowired
private ContractService contractService;
@Override
public boolean isWarning(WarnSetting warnSetting) {
//TODO
return false;
}
@Override
public String warnMessage() {
return warnMessage;
}
@Override
public String getActualValue() {
return advanceBalance+"";
}
}
package com.xyst.dinas.contract.warn;
import org.springframework.beans.factory.annotation.Autowired;
import com.xyst.dinas.biz.warn.IWarningCalculator;
import com.xyst.dinas.biz.warn.WarnSetting;
import com.xyst.dinas.contract.service.ContractService;
/**
* 合同过期提醒 预警计算器
*
* @author Jackpot
* @date 2021年4月22日
*/
public class ContractExpireWarningCalculator implements IWarningCalculator{
private double advanceBalance;
private String warnMessage;
@Autowired
private ContractService contractService;
@Override
public boolean isWarning(WarnSetting warnSetting) {
//TODO
return false;
}
@Override
public String warnMessage() {
return warnMessage;
}
@Override
public String getActualValue() {
return advanceBalance+"";
}
}
package com.xyst.dinas.contract.warn;
/**
* 合同砂石余量预警常量
*
* @author Jackpot
* @date 2021年4月22日
*/
public class ContractWarnConst {
public static final String billType = "合同";
public static final String dinasCountWarningCalculator = "com.xyst.dinas.contract.warn.DinasCountWarningCalculator";
/** 预付款余额 预警计算器*/
public static final String advanceBalanceWarningCalculator = "com.xyst.dinas.contract.warn.AdvanceBalanceWarningCalculator";
/** 合同过期提醒 预警计算器*/
public static final String contractExpireWarningCalculator = "com.xyst.dinas.contract.warn.ContractExpireWarningCalculator";
/** 预警指标*/
public static final String warningTarget2 = "到期提醒(天)";
/** 预警指标*/
public static final String warningTarget3 = "预付款余额";
}
package com.xyst.dinas.contract.warn;
import com.xyst.dinas.biz.warn.IWarningCalculate;
import com.xyst.dinas.biz.warn.IWarningCalculator;
import com.xyst.dinas.biz.warn.WarnSetting;
/**
......@@ -9,7 +9,7 @@ import com.xyst.dinas.biz.warn.WarnSetting;
* @author Jackpot
* @date 2021年4月1日
*/
public class DinasCountWarningCalculate implements IWarningCalculate{
public class DinasCountWarningCalculate implements IWarningCalculator{
//砂石余量
private double dinsaCount;
......
package com.xyst.dinas.contract.warn;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.bcp.type.KObject;
import com.xyst.dinas.biz.constant.DinasTypeConstant;
import com.xyst.dinas.biz.warn.IWarningCalculator;
import com.xyst.dinas.biz.warn.WarnSetting;
import com.xyst.dinas.contract.constant.ContractConstant;
import com.xyst.dinas.contract.service.ContractService;
/**
* 砂石余量预警计算器(新增/修改预警设置时使用)
*
* 需要注册为Bean, 把Bean的标识保存到预警设置中
* @author Jackpot
* @date 2021年4月22日
*/
public class DinasCountWarningCalculator implements IWarningCalculator{
//砂石余量
private double dinasAmount;
private String warnMessage;
@Autowired
private ContractService contractService;
@Override
public boolean isWarning(WarnSetting warnSetting) {
String min = warnSetting.getMin();
String target = warnSetting.getTarget();
if(min==null || min.trim().length()==0) return false;
KObject contract = contractService.queryContract(warnSetting.getBillId());
List<KObject> details = contract.get(ContractConstant.CONTRACT_DETAILS).toList();
for (KObject detail : details) {
String dinasTypeName = detail.get(ContractConstant.dinasType).getString(DinasTypeConstant.DINASTYPE_NAME);
if (dinasTypeName.equalsIgnoreCase(target)) {
//业务数据与设置的阀值做比较,计算是否预警
dinasAmount = detail.getDouble(ContractConstant.DINAS_AMOUNT);
if (dinasAmount <= Double.valueOf(min)) {
warnMessage = "["+target+"]"+"的当前余量为"+dinasAmount+",已不足"+min+"吨!";
return true;
}
}
}
return false;
}
@Override
public String warnMessage() {
return warnMessage;
}
@Override
public String getActualValue() {
return dinasAmount+"";
}
}
......@@ -5,18 +5,10 @@ import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.beecode.inz.basis.team.pojo.ResponseObj;
import com.beecode.xlib.runtime.Assert;
import com.xyst.dinas.biz.request.UpdateWarnSetting;
import com.xyst.dinas.biz.warn.BaseBusinessWarn;
import com.xyst.dinas.biz.warn.WarnSetting;
import com.xyst.dinas.biz.warn.service.WarningService;
import com.xyst.dinas.contract.service.ContractService;
import com.xyst.dinas.contract.warn.DinasCountWarningCalculate;
@RestController
public class ContractWarnController {
......@@ -26,53 +18,16 @@ public class ContractWarnController {
@Autowired
private ContractService contractService;
@Autowired
private WarningService warningService;
// @Autowired
// private WarningService warningService;
@PostMapping("/contract/warn/fire")
public void warnFire() {
// 合同审批通过后,自动新增砂石余量预警设置
String billType = "合同";
UUID contractId = UUID.fromString("b399f4a5-e446-439c-9601-177aad94b675");
String target = "细砂2";
int count = 100;// 某种砂石余量
BaseBusinessWarn contractBusinessWarn = warningService.createWarn(billType, contractId, target);
contractBusinessWarn.setWarningCalculate(new DinasCountWarningCalculate(count));
contractBusinessWarn.warn();
}
//查询一条预警设置
@GetMapping("/contract/warnsetting/{id}")
public Object queryWarnSetting(@PathVariable UUID id) {
Assert.notNull(id,"The id must not be null");
return contractService.queryWarnSettingById(id);
}
//更新预警设置
@PostMapping("/warnsetting/update")// /contract
public Object updateWarnSettingPerson(@RequestBody UpdateWarnSetting updateWarnSetting) {
UUID settingId = updateWarnSetting.getId();
BaseBusinessWarn contractBusinessWarn = warningService.createWarn(settingId);
WarnSetting warnSetting = contractBusinessWarn.getWarnSetting();
String minOld = warnSetting.getMin()!=null?warnSetting.getMin():"";
String min = updateWarnSetting.getMin()!=null?updateWarnSetting.getMin():"";
warningService.updateWarnSetting(updateWarnSetting);
if (minOld.equals(min)) {
return ResponseObj.success("预警设置更新成功");
}
int count = 100; //查询合同中该砂石的余量
DinasCountWarningCalculate dinasCountWarningCalculate = new DinasCountWarningCalculate(count);
contractBusinessWarn.setWarningCalculate(dinasCountWarningCalculate);
contractBusinessWarn.warn();
return ResponseObj.success("预警设置更新成功");
}
/**
* @Description: 根据合同查询预警设置中所有人员
* @param id
......
package com.xyst.dinas.production.processor;
import com.xyst.dinas.biz.warn.IWarningCalculate;
import com.xyst.dinas.biz.warn.IWarningCalculator;
import com.xyst.dinas.biz.warn.WarnSetting;
/**
......@@ -9,7 +9,7 @@ import com.xyst.dinas.biz.warn.WarnSetting;
* @author
* @date 2021年4月1日
*/
public class SandAreaDinasCountWarningCalculate implements IWarningCalculate{
public class SandAreaDinasCountWarningCalculate implements IWarningCalculator{
/**上岸量
*
......
......@@ -12,6 +12,7 @@ import com.xyst.dinas.sales.internal.service.NeedPlanServiceImpl;
import com.xyst.dinas.sales.internal.service.SalesPlanServiceImpl;
import com.xyst.dinas.sales.processor.SalesPlanProcessor;
import com.xyst.dinas.sales.processor.SalesPlanTempProcessor;
import com.xyst.dinas.sales.processor.StockAmountWarnCalculator;
import com.xyst.dinas.sales.service.InventoryService;
import com.xyst.dinas.sales.service.NeedPlanService;
import com.xyst.dinas.sales.service.SalesPlanService;
......@@ -66,6 +67,11 @@ public class SalesConfiguration {
return new SalesPlanProcessor();
}
@Bean("com.xyst.dinas.sales.processor.StockAmountWarnCalculator")
public StockAmountWarnCalculator stockAmountWarnCalculator() {
return new StockAmountWarnCalculator();
}
/***********需用计划******************/
......
package com.xyst.dinas.sales.processor;
import com.xyst.dinas.biz.warn.IWarningCalculator;
import com.xyst.dinas.biz.warn.WarnSetting;
/**
* 库存砂石余量 预警计算器
*
* @author Jackpot
* @date 2021年4月22日
*/
public class StockAmountWarnCalculator implements IWarningCalculator{
//砂石余量
private double stockAmount;
private String warnMessage;
@Override
public boolean isWarning(WarnSetting warnSetting) {
//TODO
return false;
}
@Override
public String warnMessage() {
return warnMessage;
}
@Override
public String getActualValue() {
return stockAmount+"";
}
}
......@@ -130,9 +130,6 @@ public class SalesPlanController {
// return ResponseObj.success("success", salesPlanService.querySalesPlanDetailsByMasterIdWarehouse(UUID.fromString(saleaPlanId), UUID.fromString(stationId)));
// }
public static void main(String[] args) {
System.out.println(UUID.randomUUID().toString());
}
@PostMapping("/salesplan/modify")
......
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