Commit 4b26d05a by huangtao

销毁审批

parent 8ee8787e
package com.jmai.api.consts;
import java.util.regex.Pattern;
public interface Decodes {
/**************************************************************************
* 解码
**************************************************************************/
int LENGTH_EAN13 = 13;
int LENGTH_EAN14 = 14;
int LENGTH_EAN7 = 7;
Pattern REGEX_EAN13 = Pattern.compile("^[0-9]{13}$");
Pattern REGEX_EAN14 = Pattern.compile("^[0-8][0-9]{13}$");
Pattern REGEX_GS1 = Pattern.compile("^[0-9A-Za-z\\(\\)!@#\\$%\\^&*\\-+]{2,}$");
Pattern REGEX_MA = Pattern.compile("^ΜΑ\\.\\w{3}\\.MX\\.\\w{6}\\.[0-9]\\w{6}C\\..*\\.C\\w{1}$");
String REGEX_DATE = "(\\d{2}(?:0\\d|1[0-2])(?:[0-2]\\d|3[01]))";
}
package com.jmai.api.consts;
// 移到ConfigFetcher中去
@Deprecated
public interface VerifyConfigs {
/**
* 解码设置
*/
String SYS_DECODE_SETTING = "sys.decode.setting";
interface SysDecodeSetting {
/**************************
* 解码相关配置
**************************/
String DECODE_SETTING = "decodeSetting";
}
}
package com.jmai.api.consts;
import com.google.common.collect.ImmutableList;
import java.util.List;
public interface VerifyKeys {
String INFYOS_SPI_PREFIX = "infyos.spi.";
/*******************************************************************
* 数据存储器
******************************************************************/
String FETCHER_PREFIX = INFYOS_SPI_PREFIX + "data.fetcher.";
String CONFIG_FETCHER = "configFetcher";
String DECODE_RULE_FETCHER = "decodeRuleFetcher";
String PRODUCT_FETCHER = "productFetcher";
String PRODUCT_SERIAL_FETCHER = "productSerialFetcher";
String VERIFY_ORDER_FETCHER = "verifyOrderFetcher";
String BIZ_ORDER_FETCHER = "bizOrderFetcher";
/*******************************************************************
* 数据存储器
******************************************************************/
String STORER_PREFIX = INFYOS_SPI_PREFIX + "data.storer.";
String VERIFY_ORDER_STORER = "verifyOrderStorer";
String VERIFY_RESULT_STORER = "verifyResultStorer";
/*******************************************************************
* 数据加载器
******************************************************************/
String LOADER_PREFIX = INFYOS_SPI_PREFIX + "verify.loader.";
String VERIFY_ENGINE_CONTEXT_LOADER = "verifyEngineContextLoader";
String CERT_DECODE_VERIFY_CONTEXT_LOADER = "certDecodeVerifyContextLoader";
String CERT_PRODUCTION_VERIFY_CONTEXT_LOADER = "certProductionVerifyContextLoader";
String CERT_PRODUCT_VERIFY_CONTEXT_LOADER = "certProductVerifyContextLoader";
String CERT_LASER_VERIFY_CONTEXT_LOADER = "certLaserVerifyContextLoader";
String CERT_VERIFY_ORDER_VERIFY_CONTEXT_LOADER = "certVerifyOrderVerifyContextLoader";
/*******************************************************************
* 匹配器
******************************************************************/
String MATCHER_PREFIX = INFYOS_SPI_PREFIX + "verify.matcher.";
String LASER_MATCHER = "laserMatcher";
/*******************************************************************
* 核验器
******************************************************************/
String CERT_DECODE_VERIFIER = "certDecodeVerifier";
String CERT_PRODUCTION_VERIFIER = "certProductionVerifier";
String CERT_PRODUCT_VERIFIER = "certProductVerifier";
String CERT_LASER_VERIFIER = "certLaserVerifier";
String CERT_VERIFY_ORDER_VERIFIER = "certVerifyOrderVerifier";
/*******************************************************************
* 选择器
******************************************************************/
String SELECTOR_PREFIX = INFYOS_SPI_PREFIX + "verify.selector.";
/*******************************************************************
* 其他
******************************************************************/
String DECODE_ONLY = "_DECODE_ONLY_";
/*******************************************************************
* 根据场景选择开启核验器
******************************************************************/
List<String> ALL_VERIFIERS = ImmutableList.of(
CERT_DECODE_VERIFIER,
CERT_PRODUCTION_VERIFIER,
CERT_PRODUCT_VERIFIER,
CERT_LASER_VERIFIER,
CERT_VERIFY_ORDER_VERIFIER
);
/**
* 解码开启核验器
*/
List<String> DECODE_VERIFIERS = ImmutableList.of(
CERT_DECODE_VERIFIER,
CERT_PRODUCTION_VERIFIER,
CERT_PRODUCT_VERIFIER
// 无需物证匹配
// 无需核验单据信息
);
/**
* 镭射码/合格证匹配开启核验器
*/
List<String> MATCH_VERIFIERS = ImmutableList.of(
CERT_DECODE_VERIFIER,
CERT_PRODUCTION_VERIFIER,
CERT_PRODUCT_VERIFIER,
CERT_LASER_VERIFIER,
CERT_VERIFY_ORDER_VERIFIER
);
/**
* 仅匹配不核验
*/
List<String> MATCH_ONLY_VERIFIERS = ImmutableList.of(CERT_LASER_VERIFIER);
/**
* 无需解码
*/
List<String> VERIFY_WITHOUT_DECODING_VERIFIERS = ImmutableList.of(
// 无需解码,
CERT_PRODUCTION_VERIFIER,
CERT_PRODUCT_VERIFIER,
CERT_LASER_VERIFIER,
CERT_VERIFY_ORDER_VERIFIER
);
/**
* 匹配核验开启核验器
*/
List<String> VERIFY_VERIFIERS = ALL_VERIFIERS;
}
...@@ -31,7 +31,7 @@ public enum StatusEnum { ...@@ -31,7 +31,7 @@ public enum StatusEnum {
.findAny(); .findAny();
} }
public static com.jmai.api.consts.enums.StatusEnum getOrThrow(Integer code) { public static StatusEnum getOrThrow(Integer code) {
return valueOf(code) return valueOf(code)
.orElseThrow(() -> new ServiceException("枚举类型不正确,StatusEnum:code=" + code)); .orElseThrow(() -> new ServiceException("枚举类型不正确,StatusEnum:code=" + code));
} }
...@@ -43,17 +43,17 @@ public enum StatusEnum { ...@@ -43,17 +43,17 @@ public enum StatusEnum {
public static String getNameOf(Integer code) { public static String getNameOf(Integer code) {
return valueOf(code) return valueOf(code)
.map(com.jmai.api.consts.enums.StatusEnum::getName) .map(StatusEnum::getName)
.orElse(""); .orElse("");
} }
public static boolean isInactive(Integer code) { public static boolean isInactive(Integer code) {
com.jmai.api.consts.enums.StatusEnum status = getOrThrow(code); StatusEnum status = getOrThrow(code);
return status == INACTIVE; return status == INACTIVE;
} }
public static boolean isActive(Integer code) { public static boolean isActive(Integer code) {
com.jmai.api.consts.enums.StatusEnum status = getOrThrow(code); StatusEnum status = getOrThrow(code);
return status == ACTIVE; return status == ACTIVE;
} }
} }
...@@ -16,6 +16,7 @@ import com.jmai.sys.aop.Auth; ...@@ -16,6 +16,7 @@ import com.jmai.sys.aop.Auth;
import com.jmai.sys.ctx.SpringContextUtils; import com.jmai.sys.ctx.SpringContextUtils;
import com.jmai.sys.dto.ResponseData; import com.jmai.sys.dto.ResponseData;
import com.jmai.sys.entity.SysUser; import com.jmai.sys.entity.SysUser;
import com.jmai.sys.manager.SysManager;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
...@@ -40,6 +41,8 @@ public class PhysicDestroyCheckController { ...@@ -40,6 +41,8 @@ public class PhysicDestroyCheckController {
@Resource @Resource
private PhysicDestroyCheckService physicDestroyCheckService; private PhysicDestroyCheckService physicDestroyCheckService;
@PostMapping("/create") @PostMapping("/create")
@ApiOperation(value = "创建") @ApiOperation(value = "创建")
public ResponseData create(@RequestBody @Valid PhysicDestroyCheckCreateReq req) { public ResponseData create(@RequestBody @Valid PhysicDestroyCheckCreateReq req) {
......
...@@ -13,6 +13,6 @@ public class PhysicDestroyCheckCreateReq { ...@@ -13,6 +13,6 @@ public class PhysicDestroyCheckCreateReq {
private String applyDeptId; private String applyDeptId;
private String applyTitle; private String applyTitle;
private String applyReason; private String applyReason;
private String images; private List<Long> images;
private List<PhysicDestroyCheckDetail> checkDetailList; private List<PhysicDestroyCheckDetail> checkDetailList;
} }
...@@ -11,13 +11,14 @@ import lombok.Data; ...@@ -11,13 +11,14 @@ import lombok.Data;
@ApiModel(description = "药品销毁审核表") @ApiModel(description = "药品销毁审核表")
@TableName("physic_destroy_check") @TableName("physic_destroy_check")
public class PhysicDestroyCheck extends BaseVersionEntity { public class PhysicDestroyCheck extends BaseVersionEntity {
private String orderNo;
private String applyName; private String applyName;
private Long applyDeptId; private Long applyDeptId;
private String applyTitle; private String applyTitle;
private String applyReason; private String applyReason;
private String images;
private Integer destroyNum; private Integer destroyNum;
@ApiModelProperty(value = "状态 0-审批中 1-已销毁 ") @ApiModelProperty(value = "状态 0-5审批中 6-已销毁 ")
private Integer status; private Integer status;
private String xhUser; private String xhUser;
private String jdUser; private String jdUser;
......
package com.jmai.physic.service.impl; package com.jmai.physic.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -15,11 +16,15 @@ import com.jmai.physic.service.PhysicDestroyCheckDetailService; ...@@ -15,11 +16,15 @@ import com.jmai.physic.service.PhysicDestroyCheckDetailService;
import com.jmai.physic.service.PhysicDestroyCheckService; import com.jmai.physic.service.PhysicDestroyCheckService;
import com.jmai.physic.vo.PhysicDestroyCheckVO; import com.jmai.physic.vo.PhysicDestroyCheckVO;
import com.jmai.physic.vo.PhysicDestroyNumVO; import com.jmai.physic.vo.PhysicDestroyNumVO;
import com.jmai.sys.consts.BizFileTypes;
import com.jmai.sys.consts.enums.RoleTypeEum; import com.jmai.sys.consts.enums.RoleTypeEum;
import com.jmai.sys.ctx.SpringContextUtils; import com.jmai.sys.ctx.SpringContextUtils;
import com.jmai.sys.entity.SysUser; import com.jmai.sys.entity.SysUser;
import com.jmai.sys.manager.SysManager;
import com.jmai.sys.mapper.SysUserMapper; import com.jmai.sys.mapper.SysUserMapper;
import com.jmai.sys.service.BizFileService;
import com.jmai.sys.service.impl.BaseServiceImpl; import com.jmai.sys.service.impl.BaseServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -52,17 +57,29 @@ public class PhysicDestroyCheckServiceImpl extends BaseServiceImpl<PhysicDestroy ...@@ -52,17 +57,29 @@ public class PhysicDestroyCheckServiceImpl extends BaseServiceImpl<PhysicDestroy
@Resource @Resource
private PhysicStorageAmpouleMapper physicStorageAmpouleMapper; private PhysicStorageAmpouleMapper physicStorageAmpouleMapper;
@Resource
private BizFileService bizFileService;
@Resource
private SysManager sysManager;
@Transactional @Transactional
@Override @Override
public void create(PhysicDestroyCheckCreateReq req) { public void create(PhysicDestroyCheckCreateReq req) {
PhysicDestroyCheck check = new PhysicDestroyCheck(); PhysicDestroyCheck check = new PhysicDestroyCheck();
BeanUtil.copyProperties(req,check); BeanUtil.copyProperties(req,check);
check.setOrderNo(sysManager.newCheck("123"));
this.save(check); this.save(check);
for (PhysicDestroyCheckDetail physicDestroyCheckDetail : req.getCheckDetailList()) { for (PhysicDestroyCheckDetail physicDestroyCheckDetail : req.getCheckDetailList()) {
physicDestroyCheckDetail.setCheckId(check.getId()); physicDestroyCheckDetail.setCheckId(check.getId());
} }
physicDestroyCheckDetailService.saveBatch(req.getCheckDetailList()); physicDestroyCheckDetailService.saveBatch(req.getCheckDetailList());
if(ObjectUtil.isNotEmpty(req.getImages())){
if (CollectionUtils.isNotEmpty(req.getImages())) {
bizFileService.addBizFilesIfAbsent(BizFileTypes.PHYSIC_RECORD_IMAGE,check.getId().toString(), req.getImages());
}
}
} }
@Override @Override
...@@ -144,11 +161,12 @@ public class PhysicDestroyCheckServiceImpl extends BaseServiceImpl<PhysicDestroy ...@@ -144,11 +161,12 @@ public class PhysicDestroyCheckServiceImpl extends BaseServiceImpl<PhysicDestroy
ampoule.setPhysicName(physicDestroyCheckDetail.getPhysicName()); ampoule.setPhysicName(physicDestroyCheckDetail.getPhysicName());
ampoule.setBatchNo(ampoule.getBatchNo()); ampoule.setBatchNo(ampoule.getBatchNo());
ampoule.setAcceptDeptId(sysUser.getDeptId()); ampoule.setAcceptDeptId(sysUser.getDeptId());
ampoule.setPhysicNum(physicDestroyCheckDetail.getPhysicNum()); ampoule.setPhysicNum(0);
ampoule.setPhysicSpec(physicDestroyCheckDetail.getPhysicSpec()); ampoule.setPhysicSpec(physicDestroyCheckDetail.getPhysicSpec());
ampoule.setExpendNum(physicDestroyCheckDetail.getPhysicNum()); ampoule.setExpendNum(physicDestroyCheckDetail.getPhysicNum());
ampoule.setType(2); ampoule.setType(2);
ampoule.setDestroyStatus(1); ampoule.setDestroyStatus(1);
ampoule.setOrderNo(physicDestroyCheck.getOrderNo());
Integer batchNoSum = physicStorageAmpouleMapper.selectCurrentSumByBatchNo(physicDestroyCheckDetail.getPhysicName(), physicDestroyCheckDetail.getPhysicSpec(), physicDestroyCheckDetail.getFactoryName(), physicDestroyCheckDetail.getBatchNo(), sysUser.getDeptId()); Integer batchNoSum = physicStorageAmpouleMapper.selectCurrentSumByBatchNo(physicDestroyCheckDetail.getPhysicName(), physicDestroyCheckDetail.getPhysicSpec(), physicDestroyCheckDetail.getFactoryName(), physicDestroyCheckDetail.getBatchNo(), sysUser.getDeptId());
Integer physicSum = physicStorageAmpouleMapper.selectCurrentSumByName(physicDestroyCheckDetail.getPhysicName(), physicDestroyCheckDetail.getPhysicSpec(), physicDestroyCheckDetail.getFactoryName(), sysUser.getDeptId()); Integer physicSum = physicStorageAmpouleMapper.selectCurrentSumByName(physicDestroyCheckDetail.getPhysicName(), physicDestroyCheckDetail.getPhysicSpec(), physicDestroyCheckDetail.getFactoryName(), sysUser.getDeptId());
ampoule.setBatchBalance(batchNoSum - physicDestroyCheckDetail.getPhysicNum()); ampoule.setBatchBalance(batchNoSum - physicDestroyCheckDetail.getPhysicNum());
......
...@@ -74,11 +74,10 @@ public class PhysicStorageAmpouleServiceImpl extends AbstractService implements ...@@ -74,11 +74,10 @@ public class PhysicStorageAmpouleServiceImpl extends AbstractService implements
ampoule.setPhysicNum(physic.getPhysicNum()); ampoule.setPhysicNum(physic.getPhysicNum());
ampoule.setPhysicSpec(physic.getPhysicSpec()); ampoule.setPhysicSpec(physic.getPhysicSpec());
ampoule.setPhysicType(physic.getPhysicType()); ampoule.setPhysicType(physic.getPhysicType());
ampoule.setAcquireNum(physic.getPhysicNum());
Integer batchNoSum = physicStorageAmpouleMapper.selectCurrentSumByBatchNo(physic.getPhysicName(), physic.getPhysicSpec(), physic.getFactoryName(), physic.getBatchNo(), sysUser.getDeptId()); Integer batchNoSum = physicStorageAmpouleMapper.selectCurrentSumByBatchNo(physic.getPhysicName(), physic.getPhysicSpec(), physic.getFactoryName(), physic.getBatchNo(), sysUser.getDeptId());
Integer physicSum = physicStorageAmpouleMapper.selectCurrentSumByName(physic.getPhysicName(), physic.getPhysicSpec(), physic.getFactoryName(), sysUser.getDeptId()); Integer physicSum = physicStorageAmpouleMapper.selectCurrentSumByName(physic.getPhysicName(), physic.getPhysicSpec(), physic.getFactoryName(), sysUser.getDeptId());
ampoule.setBatchBalance(batchNoSum-physic.getPhysicNum()); ampoule.setBatchBalance(batchNoSum);
ampoule.setPhysicNum(physicSum-physic.getPhysicNum()); ampoule.setPhysicNum(physicSum);
physicStorageAmpouleMapper.insert(ampoule); physicStorageAmpouleMapper.insert(ampoule);
} }
} }
...@@ -90,6 +89,12 @@ public class PhysicStorageAmpouleServiceImpl extends AbstractService implements ...@@ -90,6 +89,12 @@ public class PhysicStorageAmpouleServiceImpl extends AbstractService implements
Page<PhysicStorageAmpouleVO> page = buildEmptyPage(req); Page<PhysicStorageAmpouleVO> page = buildEmptyPage(req);
Page<PhysicStorageAmpouleVO> ampoulePage= physicStorageAmpouleMapper.selectAmpoulePage(page, req); Page<PhysicStorageAmpouleVO> ampoulePage= physicStorageAmpouleMapper.selectAmpoulePage(page, req);
for (PhysicStorageAmpouleVO record : ampoulePage.getRecords()) {
//如果为移至销毁类型,销毁数量physicNum=expendNum发出数量
if(record.getType().equals(2) && record.getDestroyStatus().equals(1)){
record.setPhysicNum(record.getExpendNum());
}
}
return ampoulePage; return ampoulePage;
} }
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
<select id="selectDestroy" resultType="com.jmai.physic.vo.PhysicDestroyNumVO"> <select id="selectDestroy" resultType="com.jmai.physic.vo.PhysicDestroyNumVO">
select physic_name,physic_spec,batch_no,factory_name,unit,(IFNULL(sum(acquire_num),0) - IFNULL(sum(expend_num),0))as destroyNum from physic_storage_ampoule select physic_name,physic_spec,batch_no,factory_name,unit,(IFNULL(sum(physic_num),0) - IFNULL(sum(expend_num),0))as destroyNum from physic_storage_ampoule
where ((type =2 and destroy_status =0 and accept_dept_id =#{deptId}) or (type =2 and destroy_status =1 and accept_dept_id =#{deptId})) where ((type =2 and destroy_status =0 and accept_dept_id =#{deptId}) or (type =2 and destroy_status =1 and accept_dept_id =#{deptId}))
group by physic_name,physic_spec,batch_no,factory_name,accept_dept_id group by physic_name,physic_spec,batch_no,factory_name,accept_dept_id
</select> </select>
......
...@@ -14,5 +14,8 @@ public interface BizFileTypes { ...@@ -14,5 +14,8 @@ public interface BizFileTypes {
@ApiModelProperty("药品专用登记图片") @ApiModelProperty("药品专用登记图片")
String PHYSIC_RECORD_IMAGE = "physic.record.image"; String PHYSIC_RECORD_IMAGE = "physic.record.image";
@ApiModelProperty("空安瓿销毁审批图片")
String AMPOULE_DESTROY_IMAGE = "physic.destroy.image";
} }
package com.jmai.sys.consts; package com.jmai.sys.consts;
import com.jmai.api.consts.VerifyConfigs;
/** /**
* 配置类型及业务主键 * 配置类型及业务主键
* *
* - 类型命名规则(三层级):大模块.小模块.配置类型 * - 类型命名规则(三层级):大模块.小模块.配置类型
*/ */
public interface ConfigTypes { public interface ConfigTypes extends VerifyConfigs {
String KEY_BIZ_TYPE = "bizType"; String KEY_BIZ_TYPE = "bizType";
String KEY_BIZ_KEY = "bizKey"; String KEY_BIZ_KEY = "bizKey";
String KEY_ORDER_TYPE = "orderType"; String KEY_ORDER_TYPE = "orderType";
...@@ -24,6 +26,16 @@ public interface ConfigTypes { ...@@ -24,6 +26,16 @@ public interface ConfigTypes {
// 用户权限 // 用户权限
String USER_PERMS = "userPerms"; String USER_PERMS = "userPerms";
} }
/**
* 解码相关设置
*/
String SYS_DECODE_SETTING = "sys.decode.setting";
interface SysDecodeSetting {
// 解码规则校验
String DECODE_RULE_CHECK = "decodeRuleCheck";
}
/** /**
* 任务相关设置 * 任务相关设置
*/ */
...@@ -52,6 +64,112 @@ public interface ConfigTypes { ...@@ -52,6 +64,112 @@ public interface ConfigTypes {
*/ */
String SYS_EXPORT_TEMPLATE = "sys.export.template"; String SYS_EXPORT_TEMPLATE = "sys.export.template";
/*******************************************************************
* IVS
******************************************************************/
String IVS_COMMON_CONFIG = "ivs.common";
interface IvsCommonConfig {
// 业务配置
String BIZ_SETTING = "bizSetting";
}
/**
* 单据配置
*/
String IVS_ORDER_CONFIG = "ivs.order.config";
interface IvsOrderConfig {
// 通用配置
String ORDER_SETTING = "orderSetting";
// 核验单(初核)配置
String VERIFY_CONFIG = "verifyConfig";
// 复核单(复核)配置
String RECHECK_CONFIG = "recheckConfig";
String VERIFY_ONLY="_VERIFY_ONLY_";
}
/**
* 单据类型定义
*/
String IVS_ORDER_DEFINE = "ivs.order.define";
interface IvsOrderDefine {
// 订单类型
String ORDER_TYPE = "orderType";
}
/**
* 编码生成器
*/
String IVS_CODE_GENERATOR = "ivs.code.generator";
interface IvsCodeGenerator {
// 钉盒模板编号号
String NAILBOX_TEMPLATE_NO = "nailboxTemplateNo";
// 业务单号
String ORDER_NO = "orderNo";
// 核验单号
String VERIFY_ORDER_NO = "verifyOrderNo";
// 复核单号
String RECHECK_ORDER_NO = "recheckOrderNo";
// 核验任务编号
String VERIFY_TASK_NO = "verifyTaskNo";
// 序列号
String SERIAL_NO = "serialNo";
// 计费码
String ITEM_CODE = "itemCode";
// RFID码
String RFID_CODE = "rfidCode";
String CHECK_CODE ="checkCode";
}
/**
* 物料设置
*/
String IVS_ITEM_SETTING = "ivs.item.setting";
interface IvsCodeSetting {
// 物料设置
String ITEM_SETTING = "itemSetting";
}
/**
* 核验单识别配置
*/
@Deprecated
String IVS_OCR_LASER = "ivs.ocr.laser";
interface IvsOcrConfig {
//MOCK服务识别地址
String INFYOCR_MOCK_CONFIG = "infyocrMockConfig";
//本地识别地址
String INFYOCR_LOCAL_CONFIG = "infyocrLocalConfig";
//云服务识别地址
String INFYOCR_CLOUD_CONFIG = "infyocrCloudConfig";
//启用OCR渠道
String CHANNEL_TYPE = "channelType";
}
String OCR_LOCAL_CHANNEL = "local";
String OCR_CLOUD_CHANNEL = "cloud";
String OCR_MOCK_CHANNEL = "mock";
String IVS_OCR_RECOGNIZER = "ivs.ocr.recognizer";
interface OcrCertReader {
// 镭射码识别器
String LASER_CODE_RECOGNIZER = "laserCodeRecognizer";
// 合格证内容识别器
String CERT_TEXT_RECOGNIZER = "certTextRecognizer";
// 合格证UDI识别器
String CERT_UDI_RECOGNIZER = "certUdiRecognizer";
// 备份识别器
String BACKUP_RECOGNIZER = ".bak";
// 已开启识别器
String KEY_ENABLED_RECOGNIZER = "enabledRecognizer";
// 识别器配置(JSON)
String KEY_RECOGNIZER_CONFIG = "recognizerConfig";
}
/** /**
* 快照设置 * 快照设置
......
package com.jmai.sys.manager; package com.jmai.sys.manager;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.jmai.api.exception.ServiceException; import com.jmai.api.exception.ServiceException;
import com.jmai.sys.AbstractService; import com.jmai.sys.AbstractService;
import com.jmai.sys.consts.enums.SysFileTypeEnum; import com.jmai.sys.consts.enums.SysFileTypeEnum;
import com.jmai.sys.dto.PrintReqVo; import com.jmai.sys.dto.*;
import com.jmai.sys.dto.UploadResultVo;
import com.jmai.sys.exception.ErrorCode; import com.jmai.sys.exception.ErrorCode;
import com.jmai.sys.service.ConfigService; import com.jmai.sys.service.ConfigService;
import com.jmai.sys.service.SerialNumberService; import com.jmai.sys.service.SerialNumberService;
...@@ -23,9 +23,17 @@ import javax.annotation.Resource; ...@@ -23,9 +23,17 @@ import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static cn.hutool.core.date.DatePattern.NORM_DATE_PATTERN; import static cn.hutool.core.date.DatePattern.NORM_DATE_PATTERN;
import static com.jmai.sys.consts.ConfigTypes.IVS_CODE_GENERATOR;
import static com.jmai.sys.consts.ConfigTypes.IvsCodeGenerator.*;
@Slf4j @Slf4j
@Component @Component
...@@ -41,11 +49,171 @@ public class SysManager extends AbstractService { ...@@ -41,11 +49,171 @@ public class SysManager extends AbstractService {
* 编码生成 * 编码生成
* TODO:分布式部署如何保证编码唯一性? * TODO:分布式部署如何保证编码唯一性?
******************************************************************/ ******************************************************************/
public String newNailboxTemplateNo(String uno) {
return generate(NAILBOX_TEMPLATE_NO, uno);
}
public String newOrderNo(String uno) {
return generate(ORDER_NO, uno);
}
public String newVerifyOrderNo(String uno) {
return generate(VERIFY_ORDER_NO, uno);
}
public String newRecheckOrderNo(String uno) {
return generate(RECHECK_ORDER_NO, uno);
}
public String newCheck(String uno) {
return generate(CHECK_CODE, uno);
}
public String newVerifyTaskNo(String uno) {
return generate(VERIFY_TASK_NO, uno);
}
public String newSerialNo(String uno) {
return generate(SERIAL_NO, uno);
}
public List<String> newSerialNoBatch(String uno, int count) {
return generateBatch(SERIAL_NO, uno, count);
}
/**
* 基于target生成计费码和RFID码(物料信息——产品信息+生产信息)
*/
public String newItemCode(String uno) {
return generate(ITEM_CODE, uno);
}
public String newRfidCode(String uno) {
return generate(RFID_CODE, uno);
}
public String newItemCode(String uno, Object target) {
return generate(ITEM_CODE, uno, target);
}
public String newRfidCode(String uno, Object target) {
return generate(RFID_CODE, uno, target);
}
private String generate(String generatorType, String uno) {
return generate(generatorType, uno, null);
}
private String generate(String generatorType, String uno, Object target) {
assert ObjectUtil.isNotEmpty(uno) : "uno 不能为空";
Map<String, ConfigDto> configMap = configService.getActiveConfigMapByType(IVS_CODE_GENERATOR);
if (!configMap.containsKey(generatorType)) {
throw new ServiceException("未配置编号生成器:类型=" + IVS_CODE_GENERATOR + ",编码生成器=" + generatorType);
}
CodeGeneratorConfig config = configMap.get(generatorType)
.getValueAsObject(CodeGeneratorConfig.class);
// 表达式
String expression = config.getExpression();
if (ObjectUtil.isEmpty(expression)) {
return "";
}
// 参数(内置变量命名同常量命名方式——大写驼峰)
Map<String, Object> ctx = ObjectUtil.isNotEmpty(target) ? BeanUtil.beanToMap(target) : new HashMap<>();
if (ObjectUtil.isNotEmpty(config.getParams())) {
ctx.putAll(config.getParams());
}
if (ObjectUtil.isNotEmpty(uno)) {
ctx.put("UNO", uno);
}
ctx.put("SEQUENCE", nextId());
ctx.put("SHORT_SEQUENCE", nextShotId());
ctx.put("CURRENT_DATE", DateUtil.format(LocalDateTime.now(), config.getDateFormat()));
if (expression.contains(config.getSerialNumberKey())) {
// 生成流水号
Long serialNumber = generateSerialNumber(config.getBizType(), config.getBizKey(), config.getMinSerialNumber(), config.getCreatingModel());
ctx.put(config.getSerialNumberKey(), serialNumber);
}
// 计算
return calculateSpel(ctx, expression).toString();
}
private List<String> generateBatch(String generatorType, String uno, int count) {
assert ObjectUtil.isNotEmpty(uno) : "uno 不能为空";
if (count <= 0) {
return Collections.emptyList();
}
Map<String, ConfigDto> configMap = configService.getActiveConfigMapByType(IVS_CODE_GENERATOR);
if (!configMap.containsKey(generatorType)) {
throw new ServiceException("未配置编号生成器:类型=" + IVS_CODE_GENERATOR + ",编码生成器=" + generatorType);
}
CodeGeneratorConfig config = configMap.get(generatorType)
.getValueAsObject(CodeGeneratorConfig.class);
// 表达式
String expression = config.getExpression();
if (ObjectUtil.isEmpty(expression)) {
return Collections.emptyList();
}
// 参数(内置变量命名同常量命名方式——大写驼峰)
Map<String, Object> ctx = new HashMap<>();
if (ObjectUtil.isNotEmpty(config.getParams())) {
ctx.putAll(config.getParams());
}
if (ObjectUtil.isNotEmpty(uno)) {
ctx.put("UNO", uno);
}
ctx.put("SEQUENCE", nextId());
ctx.put("SHORT_SEQUENCE", nextShotId());
ctx.put("CURRENT_DATE", DateUtil.format(LocalDateTime.now(), config.getDateFormat()));
// 批量生成流水号
SerialNumberResp serialNumberBatch;
if (expression.contains(config.getSerialNumberKey())) {
serialNumberBatch = generateSerialNumberBatch(config.getBizType(), config.getBizKey(), config.getMinSerialNumber(), config.getCreatingModel(), count);
if (log.isDebugEnabled()) {
log.debug("generate:count={},serialNumberBatch={}", count, toJSONString(serialNumberBatch));
}
} else {
serialNumberBatch = null;
}
return IntStream.rangeClosed(1, count)
.mapToObj(index -> {
// 生成流水号
ctx.put("_INDEX_", index);
if (expression.contains(config.getSerialNumberKey())) {
// 流水号
Long serialNumber = serialNumberBatch.getStartNumber();
serialNumberBatch.setStartNumber(serialNumber + 1);
ctx.put(config.getSerialNumberKey(), serialNumber);
}
// 计算
return calculateSpel(ctx, expression).toString();
})
.collect(Collectors.toList());
}
public boolean isCodeMatched(String code, String generatorType) {
if (ObjectUtil.isEmpty(code) || ObjectUtil.isEmpty(generatorType)) {
return false;
}
ConfigDto configDto = configService.getActiveConfigOrThrow(IVS_CODE_GENERATOR, generatorType);
CodeGeneratorConfig config = configDto.getValueAsObject(CodeGeneratorConfig.class);
return isCodeMatched(code, config);
}
public boolean isCodeMatched(String code, CodeGeneratorConfig config) { public boolean isCodeMatched(String code, CodeGeneratorConfig config) {
if (ObjectUtil.isEmpty(code) || ObjectUtil.isEmpty(config)) { if (ObjectUtil.isEmpty(code) || ObjectUtil.isEmpty(config)) {
...@@ -91,8 +259,44 @@ public class SysManager extends AbstractService { ...@@ -91,8 +259,44 @@ public class SysManager extends AbstractService {
String format; String format;
} }
private Long generateSerialNumber(String bizType, String bizKey, Long minSerialNumber, Integer creatingModel) {
SerialNumberReq req = new SerialNumberReq();
req.setBizType(bizType);
req.setBizKey(bizKey);
req.setNumberCount(1);
req.setMinNumber(minSerialNumber);
req.setCreatingModel(creatingModel);
req.setRetryTimes(3);
SerialNumberResp sn = serialNumberService.nextNumber(req);
return sn.getStartNumber();
}
private Long generateSerialNumber(String bizType, String bizKey) {
return generateSerialNumber(bizType, bizKey, 0L, 0);
}
private SerialNumberResp generateSerialNumberBatch(String bizType, String bizKey, Long minSerialNumber, Integer creatingModel, Integer numberCount) {
SerialNumberReq req = new SerialNumberReq();
req.setBizType(bizType);
req.setBizKey(bizKey);
req.setNumberCount(numberCount);
req.setMinNumber(minSerialNumber);
req.setCreatingModel(creatingModel);
req.setRetryTimes(3);
return serialNumberService.nextNumber(req);
}
private Long generateOrInitSerialNumber(String bizType, String bizKey) {
SerialNumberReq req = new SerialNumberReq();
req.setBizType(bizType);
req.setBizKey(bizKey);
req.setNumberCount(1);
req.setMinNumber(0L);
req.setCreatingModel(1);
req.setRetryTimes(3);
SerialNumberResp sn = serialNumberService.nextNumber(req);
return sn.getStartNumber();
}
/******************************************************************* /*******************************************************************
* 文件管理 * 文件管理
......
...@@ -12,7 +12,6 @@ import com.jmai.sys.entity.SysConfig; ...@@ -12,7 +12,6 @@ import com.jmai.sys.entity.SysConfig;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import static com.jmai.api.base.BaseService.selectOne; import static com.jmai.api.base.BaseService.selectOne;
import static com.jmai.api.base.BaseService.toJSONString; import static com.jmai.api.base.BaseService.toJSONString;
......
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 sign in to comment