Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
huang.tao
/
jmai-platform
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
4b26d05a
authored
Dec 05, 2025
by
huangtao
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
销毁审批
parent
8ee8787e
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
525 additions
and
16 deletions
jmai-api/src/main/java/com/jmai/api/consts/Decodes.java
jmai-api/src/main/java/com/jmai/api/consts/VerifyConfigs.java
jmai-api/src/main/java/com/jmai/api/consts/VerifyKeys.java
jmai-api/src/main/java/com/jmai/api/consts/enums/StatusEnum.java
jmai-physic/src/main/java/com/jmai/physic/controller/PhysicDestroyCheckController.java
jmai-physic/src/main/java/com/jmai/physic/dto/PhysicDestroyCheckCreateReq.java
jmai-physic/src/main/java/com/jmai/physic/entity/PhysicDestroyCheck.java
jmai-physic/src/main/java/com/jmai/physic/service/impl/PhysicDestroyCheckServiceImpl.java
jmai-physic/src/main/java/com/jmai/physic/service/impl/PhysicStorageAmpouleServiceImpl.java
jmai-physic/src/main/resources/mapper/PhysicStorageAmpouleMapper.xml
jmai-sys/src/main/java/com/jmai/sys/consts/BizFileTypes.java
jmai-sys/src/main/java/com/jmai/sys/consts/ConfigTypes.java
jmai-sys/src/main/java/com/jmai/sys/manager/SysManager.java
jmai-sys/src/main/java/com/jmai/sys/service/ConfigService.java
logs/jmai/error.log
spy.log
jmai-api/src/main/java/com/jmai/api/consts/Decodes.java
0 → 100644
View file @
4b26d05a
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]))"
;
}
jmai-api/src/main/java/com/jmai/api/consts/VerifyConfigs.java
0 → 100644
View file @
4b26d05a
package
com
.
jmai
.
api
.
consts
;
// 移到ConfigFetcher中去
@Deprecated
public
interface
VerifyConfigs
{
/**
* 解码设置
*/
String
SYS_DECODE_SETTING
=
"sys.decode.setting"
;
interface
SysDecodeSetting
{
/**************************
* 解码相关配置
**************************/
String
DECODE_SETTING
=
"decodeSetting"
;
}
}
jmai-api/src/main/java/com/jmai/api/consts/VerifyKeys.java
0 → 100644
View file @
4b26d05a
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
;
}
jmai-api/src/main/java/com/jmai/api/consts/enums/StatusEnum.java
View file @
4b26d05a
...
...
@@ -31,7 +31,7 @@ public enum StatusEnum {
.
findAny
();
}
public
static
com
.
jmai
.
api
.
consts
.
enums
.
StatusEnum
getOrThrow
(
Integer
code
)
{
public
static
StatusEnum
getOrThrow
(
Integer
code
)
{
return
valueOf
(
code
)
.
orElseThrow
(()
->
new
ServiceException
(
"枚举类型不正确,StatusEnum:code="
+
code
));
}
...
...
@@ -43,17 +43,17 @@ public enum StatusEnum {
public
static
String
getNameOf
(
Integer
code
)
{
return
valueOf
(
code
)
.
map
(
com
.
jmai
.
api
.
consts
.
enums
.
StatusEnum
::
getName
)
.
map
(
StatusEnum:
:
getName
)
.
orElse
(
""
);
}
public
static
boolean
isInactive
(
Integer
code
)
{
com
.
jmai
.
api
.
consts
.
enums
.
StatusEnum
status
=
getOrThrow
(
code
);
StatusEnum
status
=
getOrThrow
(
code
);
return
status
==
INACTIVE
;
}
public
static
boolean
isActive
(
Integer
code
)
{
com
.
jmai
.
api
.
consts
.
enums
.
StatusEnum
status
=
getOrThrow
(
code
);
StatusEnum
status
=
getOrThrow
(
code
);
return
status
==
ACTIVE
;
}
}
jmai-physic/src/main/java/com/jmai/physic/controller/PhysicDestroyCheckController.java
View file @
4b26d05a
...
...
@@ -16,6 +16,7 @@ import com.jmai.sys.aop.Auth;
import
com.jmai.sys.ctx.SpringContextUtils
;
import
com.jmai.sys.dto.ResponseData
;
import
com.jmai.sys.entity.SysUser
;
import
com.jmai.sys.manager.SysManager
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
...
...
@@ -40,6 +41,8 @@ public class PhysicDestroyCheckController {
@Resource
private
PhysicDestroyCheckService
physicDestroyCheckService
;
@PostMapping
(
"/create"
)
@ApiOperation
(
value
=
"创建"
)
public
ResponseData
create
(
@RequestBody
@Valid
PhysicDestroyCheckCreateReq
req
)
{
...
...
jmai-physic/src/main/java/com/jmai/physic/dto/PhysicDestroyCheckCreateReq.java
View file @
4b26d05a
...
...
@@ -13,6 +13,6 @@ public class PhysicDestroyCheckCreateReq {
private
String
applyDeptId
;
private
String
applyTitle
;
private
String
applyReason
;
private
String
images
;
private
List
<
Long
>
images
;
private
List
<
PhysicDestroyCheckDetail
>
checkDetailList
;
}
jmai-physic/src/main/java/com/jmai/physic/entity/PhysicDestroyCheck.java
View file @
4b26d05a
...
...
@@ -11,13 +11,14 @@ import lombok.Data;
@ApiModel
(
description
=
"药品销毁审核表"
)
@TableName
(
"physic_destroy_check"
)
public
class
PhysicDestroyCheck
extends
BaseVersionEntity
{
private
String
orderNo
;
private
String
applyName
;
private
Long
applyDeptId
;
private
String
applyTitle
;
private
String
applyReason
;
private
String
images
;
private
Integer
destroyNum
;
@ApiModelProperty
(
value
=
"状态 0-
审批中 1
-已销毁 "
)
@ApiModelProperty
(
value
=
"状态 0-
5审批中 6
-已销毁 "
)
private
Integer
status
;
private
String
xhUser
;
private
String
jdUser
;
...
...
jmai-physic/src/main/java/com/jmai/physic/service/impl/PhysicDestroyCheckServiceImpl.java
View file @
4b26d05a
package
com
.
jmai
.
physic
.
service
.
impl
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.json.JSONUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
...
...
@@ -15,11 +16,15 @@ import com.jmai.physic.service.PhysicDestroyCheckDetailService;
import
com.jmai.physic.service.PhysicDestroyCheckService
;
import
com.jmai.physic.vo.PhysicDestroyCheckVO
;
import
com.jmai.physic.vo.PhysicDestroyNumVO
;
import
com.jmai.sys.consts.BizFileTypes
;
import
com.jmai.sys.consts.enums.RoleTypeEum
;
import
com.jmai.sys.ctx.SpringContextUtils
;
import
com.jmai.sys.entity.SysUser
;
import
com.jmai.sys.manager.SysManager
;
import
com.jmai.sys.mapper.SysUserMapper
;
import
com.jmai.sys.service.BizFileService
;
import
com.jmai.sys.service.impl.BaseServiceImpl
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
...
...
@@ -52,17 +57,29 @@ public class PhysicDestroyCheckServiceImpl extends BaseServiceImpl<PhysicDestroy
@Resource
private
PhysicStorageAmpouleMapper
physicStorageAmpouleMapper
;
@Resource
private
BizFileService
bizFileService
;
@Resource
private
SysManager
sysManager
;
@Transactional
@Override
public
void
create
(
PhysicDestroyCheckCreateReq
req
)
{
PhysicDestroyCheck
check
=
new
PhysicDestroyCheck
();
BeanUtil
.
copyProperties
(
req
,
check
);
check
.
setOrderNo
(
sysManager
.
newCheck
(
"123"
));
this
.
save
(
check
);
for
(
PhysicDestroyCheckDetail
physicDestroyCheckDetail
:
req
.
getCheckDetailList
())
{
physicDestroyCheckDetail
.
setCheckId
(
check
.
getId
());
}
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
...
...
@@ -144,11 +161,12 @@ public class PhysicDestroyCheckServiceImpl extends BaseServiceImpl<PhysicDestroy
ampoule
.
setPhysicName
(
physicDestroyCheckDetail
.
getPhysicName
());
ampoule
.
setBatchNo
(
ampoule
.
getBatchNo
());
ampoule
.
setAcceptDeptId
(
sysUser
.
getDeptId
());
ampoule
.
setPhysicNum
(
physicDestroyCheckDetail
.
getPhysicNum
()
);
ampoule
.
setPhysicNum
(
0
);
ampoule
.
setPhysicSpec
(
physicDestroyCheckDetail
.
getPhysicSpec
());
ampoule
.
setExpendNum
(
physicDestroyCheckDetail
.
getPhysicNum
());
ampoule
.
setType
(
2
);
ampoule
.
setDestroyStatus
(
1
);
ampoule
.
setOrderNo
(
physicDestroyCheck
.
getOrderNo
());
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
());
ampoule
.
setBatchBalance
(
batchNoSum
-
physicDestroyCheckDetail
.
getPhysicNum
());
...
...
jmai-physic/src/main/java/com/jmai/physic/service/impl/PhysicStorageAmpouleServiceImpl.java
View file @
4b26d05a
...
...
@@ -74,11 +74,10 @@ public class PhysicStorageAmpouleServiceImpl extends AbstractService implements
ampoule
.
setPhysicNum
(
physic
.
getPhysicNum
());
ampoule
.
setPhysicSpec
(
physic
.
getPhysicSpec
());
ampoule
.
setPhysicType
(
physic
.
getPhysicType
());
ampoule
.
setAcquireNum
(
physic
.
getPhysicNum
());
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
());
ampoule
.
setBatchBalance
(
batchNoSum
-
physic
.
getPhysicNum
()
);
ampoule
.
setPhysicNum
(
physicSum
-
physic
.
getPhysicNum
()
);
ampoule
.
setBatchBalance
(
batchNoSum
);
ampoule
.
setPhysicNum
(
physicSum
);
physicStorageAmpouleMapper
.
insert
(
ampoule
);
}
}
...
...
@@ -90,6 +89,12 @@ public class PhysicStorageAmpouleServiceImpl extends AbstractService implements
Page
<
PhysicStorageAmpouleVO
>
page
=
buildEmptyPage
(
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
;
}
...
...
jmai-physic/src/main/resources/mapper/PhysicStorageAmpouleMapper.xml
View file @
4b26d05a
...
...
@@ -34,7 +34,7 @@
<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}))
group by physic_name,physic_spec,batch_no,factory_name,accept_dept_id
</select>
...
...
jmai-sys/src/main/java/com/jmai/sys/consts/BizFileTypes.java
View file @
4b26d05a
...
...
@@ -14,5 +14,8 @@ public interface BizFileTypes {
@ApiModelProperty
(
"药品专用登记图片"
)
String
PHYSIC_RECORD_IMAGE
=
"physic.record.image"
;
@ApiModelProperty
(
"空安瓿销毁审批图片"
)
String
AMPOULE_DESTROY_IMAGE
=
"physic.destroy.image"
;
}
jmai-sys/src/main/java/com/jmai/sys/consts/ConfigTypes.java
View file @
4b26d05a
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_KEY
=
"bizKey"
;
String
KEY_ORDER_TYPE
=
"orderType"
;
...
...
@@ -24,6 +26,16 @@ public interface ConfigTypes {
// 用户权限
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 {
*/
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"
;
}
/**
* 快照设置
...
...
jmai-sys/src/main/java/com/jmai/sys/manager/SysManager.java
View file @
4b26d05a
package
com
.
jmai
.
sys
.
manager
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.jmai.api.exception.ServiceException
;
import
com.jmai.sys.AbstractService
;
import
com.jmai.sys.consts.enums.SysFileTypeEnum
;
import
com.jmai.sys.dto.PrintReqVo
;
import
com.jmai.sys.dto.UploadResultVo
;
import
com.jmai.sys.dto.*
;
import
com.jmai.sys.exception.ErrorCode
;
import
com.jmai.sys.service.ConfigService
;
import
com.jmai.sys.service.SerialNumberService
;
...
...
@@ -23,9 +23,17 @@ import javax.annotation.Resource;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.time.LocalDateTime
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.List
;
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
com
.
jmai
.
sys
.
consts
.
ConfigTypes
.
IVS_CODE_GENERATOR
;
import
static
com
.
jmai
.
sys
.
consts
.
ConfigTypes
.
IvsCodeGenerator
.*;
@Slf4j
@Component
...
...
@@ -41,11 +49,171 @@ public class SysManager extends AbstractService {
* 编码生成
* 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
)
{
if
(
ObjectUtil
.
isEmpty
(
code
)
||
ObjectUtil
.
isEmpty
(
config
))
{
...
...
@@ -91,8 +259,44 @@ public class SysManager extends AbstractService {
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
();
}
/*******************************************************************
* 文件管理
...
...
jmai-sys/src/main/java/com/jmai/sys/service/ConfigService.java
View file @
4b26d05a
...
...
@@ -12,7 +12,6 @@ import com.jmai.sys.entity.SysConfig;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
import
static
com
.
jmai
.
api
.
base
.
BaseService
.
selectOne
;
import
static
com
.
jmai
.
api
.
base
.
BaseService
.
toJSONString
;
...
...
logs/jmai/error.log
View file @
4b26d05a
This diff is collapsed.
Click to expand it.
spy.log
View file @
4b26d05a
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment