demand: 新增批量确认组批次接口 人工审核组批次区分无需组批次和组批次已完成 漏组批次查询条件支持查询人工审核的运单 漏组批次查询返回完成状态区分人工审核/系统审核

committer: heyu
This commit is contained in:
aike 2025-08-21 17:38:21 +08:00
parent 35f6ec9f74
commit 39b9f83dbc
8 changed files with 205 additions and 84 deletions

View File

@ -1,8 +1,8 @@
package com.xdadan.erp.web.emis; package com.xdadan.erp.web.emis;
import java.util.List; import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.xdadan.erp.emis.domain.exception.EmisBizError;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.xdadan.erp.common.annotation.Log; import com.xdadan.erp.common.annotation.Log;
import com.xdadan.erp.common.core.controller.BaseController;
import com.xdadan.erp.common.core.domain.AjaxResult; import com.xdadan.erp.common.core.domain.AjaxResult;
import com.xdadan.erp.common.enums.BusinessType; import com.xdadan.erp.common.enums.BusinessType;
import com.xdadan.erp.emis.domain.EmisTmsSiteBatchMiss; import com.xdadan.erp.emis.domain.EmisTmsSiteBatchMiss;
@ -126,4 +125,51 @@ public class EmisTmsSiteBatchMissController extends EmisBaseController {
public AjaxResult remove(@PathVariable Long[] ids) { public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(emisTmsSiteBatchMissService.deleteEmisTmsSiteBatchMissByIds(ids)); return toAjax(emisTmsSiteBatchMissService.deleteEmisTmsSiteBatchMissByIds(ids));
} }
/**
* 批量确认组批次:参数通过 params.billCodeList 传入
*/
@PreAuthorize("@ss.hasPermi('emis:emisTmsSiteBatchMiss:confirm')")
@Log(title = "TMS漏组批次信息", businessType = BusinessType.UPDATE)
@PostMapping("/confirmBatch")
public AjaxResult confirmBatch(@RequestBody EmisTmsSiteBatchMiss req) throws EmisBizError {
Object listObj = req.getParams() != null ? req.getParams().get("billCodeList") : null;
if (listObj == null) {
return AjaxResult.error("参数缺失:billCodeList");
}
String remark = req.getManualRemark();
List<String> billCodes;
if (listObj instanceof List) {
List<?> tmp = (List<?>) listObj;
billCodes = new java.util.ArrayList<>();
for (Object o : tmp) {
if (o != null) {
String s = String.valueOf(o).trim();
if (!s.isEmpty()) {
billCodes.add(s);
}
}
}
} else if (listObj instanceof String) {
String str = ((String) listObj).trim();
if (str.isEmpty()) {
billCodes = java.util.Collections.emptyList();
} else {
String[] arr = str.split(",");
billCodes = new java.util.ArrayList<>(arr.length);
for (String a : arr) {
if (a != null) {
String s = a.trim();
if (!s.isEmpty()) {
billCodes.add(s);
}
}
}
}
} else {
return AjaxResult.error("参数格式错误:billCodeList");
}
emisTmsSiteBatchMissService.confirmBatch(billCodes, remark, req.getBlManual());
return AjaxResult.success("确认成功");
}
} }

View File

@ -134,4 +134,10 @@ public class EmisTmsSiteBatchMiss extends BaseEntity {
@TableField(exist = false) @TableField(exist = false)
@DataAuditField(fieldComment = "目的网点名称") @DataAuditField(fieldComment = "目的网点名称")
private String dispatchUnderlingSiteName; private String dispatchUnderlingSiteName;
/** 人工审核备注 */
private String manualRemark;
/* 完成状态 1:系统审核完成,2:人工审核完成,3:无需组批次 默认为1*/
private String blManual;
} }

View File

@ -45,6 +45,10 @@ public class EmisWaybillBatchStatus extends BaseEntity {
@DataAuditField(fieldComment = "批次状态,1:组批次成功") @DataAuditField(fieldComment = "批次状态,1:组批次成功")
private String siteBatchStatus; private String siteBatchStatus;
/* 完成状态 */
@DataAuditField(fieldComment = "1:系统审核完成,2:人工审核完成,3:无需组批次 默认为1")
private String blManual;
/* 备注 */ /* 备注 */
@DataAuditField(fieldComment = "备注") @DataAuditField(fieldComment = "备注")
private String remark; private String remark;

View File

@ -2,6 +2,7 @@ package com.xdadan.erp.emis.service;
import java.util.List; import java.util.List;
import com.xdadan.erp.emis.domain.EmisTmsSiteBatchMiss; import com.xdadan.erp.emis.domain.EmisTmsSiteBatchMiss;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
/** /**
* TMS漏组批次信息Service接口 * TMS漏组批次信息Service接口
@ -70,4 +71,14 @@ public interface IEmisTmsSiteBatchMissService {
* @return TMS漏组批次信息列表 * @return TMS漏组批次信息列表
*/ */
public List<EmisTmsSiteBatchMiss> selectByBillCodeCount(Integer count); public List<EmisTmsSiteBatchMiss> selectByBillCodeCount(Integer count);
/**
* 批量确认组批次:
* 1) 根据运单号列表删除漏组批次数据
* 2) 新增运单组批次状态,site_batch_status=1
*
* @param billCodes 运单号列表
* @param blManual
*/
void confirmBatch(List<String> billCodes, String remark, String blManual) throws EmisBizError;
} }

View File

@ -1,7 +1,6 @@
package com.xdadan.erp.emis.service.impl; package com.xdadan.erp.emis.service.impl;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future; import java.util.concurrent.Future;
@ -9,6 +8,8 @@ import java.util.concurrent.Executors;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.xdadan.erp.emis.domain.*; import com.xdadan.erp.emis.domain.*;
import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
import com.xdadan.erp.emis.mapper.*; import com.xdadan.erp.emis.mapper.*;
import com.xdadan.erp.emis.service.EmisBaseService; import com.xdadan.erp.emis.service.EmisBaseService;
import com.xdadan.erp.emis.utils.WaybillHelper; import com.xdadan.erp.emis.utils.WaybillHelper;
@ -18,6 +19,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.xdadan.erp.emis.service.IEmisTmsSiteBatchMissService; import com.xdadan.erp.emis.service.IEmisTmsSiteBatchMissService;
/** /**
@ -99,10 +101,13 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
// return list; // return list;
// } // }
// // 批量查找相关单号 // // 批量查找相关单号
// List<EmisWaybill> relatedList = relatedBillCodes.isEmpty() ? Collections.emptyList() // List<EmisWaybill> relatedList = relatedBillCodes.isEmpty() ?
// : emisTmsSiteBatchMissMapper.selectByBillCodes(new ArrayList<>(relatedBillCodes)); // Collections.emptyList()
// : emisTmsSiteBatchMissMapper.selectByBillCodes(new
// ArrayList<>(relatedBillCodes));
// Map<String, EmisWaybill> relatedMap = relatedList.stream() // Map<String, EmisWaybill> relatedMap = relatedList.stream()
// .collect(Collectors.toMap(EmisWaybill::getBillCode, Function.identity(), (a, b) -> a)); // .collect(Collectors.toMap(EmisWaybill::getBillCode, Function.identity(), (a,
// b) -> a));
// // 过滤逻辑 // // 过滤逻辑
// list = list.stream() // list = list.stream()
// .filter(wb -> { // .filter(wb -> {
@ -113,7 +118,8 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
// String[] relatedNos = virtualRemark.split(","); // String[] relatedNos = virtualRemark.split(",");
// for (String no : relatedNos) { // for (String no : relatedNos) {
// EmisWaybill related = relatedMap.get(no.trim()); // EmisWaybill related = relatedMap.get(no.trim());
// if (related != null && Integer.valueOf(173).equals(related.getProblemType())) { // if (related != null && Integer.valueOf(173).equals(related.getProblemType()))
// {
// return false; // return false;
// } // }
// } // }
@ -156,7 +162,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
*/ */
@Override @Override
public int deleteEmisTmsSiteBatchMissByIds(Long[] ids) { public int deleteEmisTmsSiteBatchMissByIds(Long[] ids) {
log.info("Deleting TMS site batch miss by ids: {}", ids); log.info("Deleting TMS site batch miss by ids: {}", (Object) ids);
return emisTmsSiteBatchMissMapper.deleteEmisTmsSiteBatchMissByIds(ids); return emisTmsSiteBatchMissMapper.deleteEmisTmsSiteBatchMissByIds(ids);
} }
@ -180,6 +186,43 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
return emisTmsSiteBatchMissMapper.selectByBillCodeCount(count); return emisTmsSiteBatchMissMapper.selectByBillCodeCount(count);
} }
/**
* 批量确认:删除漏组批次并插入运单组批状态
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void confirmBatch(List<String> billCodes, String remark, String blManual) throws EmisBizError {
if (billCodes == null || billCodes.isEmpty()) {
throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "运单号不能为空");
}
if (StringUtil.isBlank(blManual)) {
throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "完成状态不能为空");
}
// 1) 逻辑删除漏组批次数据
emisTmsSiteBatchMissMapper.deleteByBillCodes(billCodes);
// 2) 新增运单组批次状态 site_batch_status=1(幂等:insert ignore)
Date now = new Date();
String userName = getCurrentUser() != null ? getCurrentUser().getUserName() : null;
String siteCode = getCurrentUser() != null ? getCurrentUser().getOwnerSiteCode() : null;
List<EmisWaybillBatchStatus> toInsert = billCodes.stream().distinct().map(code -> {
EmisWaybillBatchStatus s = new EmisWaybillBatchStatus();
s.setBillCode(code);
s.setSiteBatchStatus("1");
s.setRemark(remark);
s.setBlManual(blManual);
s.setCreateBy(userName);
s.setCreateTime(now);
s.setCreateSite(siteCode);
return s;
}).collect(Collectors.toList());
if (!toInsert.isEmpty()) {
emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(toInsert);
}
}
@Async @Async
@Override @Override
public void autoScanSiteBatch(String lineCode) { public void autoScanSiteBatch(String lineCode) {

View File

@ -232,6 +232,7 @@
select a.id, a.bill_code,a.trans_line_type, a.product_type,a.start_site_code,a.send_site_code select a.id, a.bill_code,a.trans_line_type, a.product_type,a.start_site_code,a.send_site_code
from emis_waybill a from emis_waybill a
left join emis_tms_site_batch_dtl b on a.bill_code = b.bill_code and b.del_flag = '0' left join emis_tms_site_batch_dtl b on a.bill_code = b.bill_code and b.del_flag = '0'
inner join emis_waybill_batch_status c on a.bill_code = c.bill_code and c.site_batch_status = '1' and c.del_flag = '0'
where b.batch_no = #{batchNo} where b.batch_no = #{batchNo}
and a.del_flag = '0' and a.del_flag = '0'
and a.send_date <![CDATA[ > ]]> '2025-01-01 00:00:00' and a.send_date <![CDATA[ > ]]> '2025-01-01 00:00:00'

View File

@ -48,6 +48,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="problemType" column="problem_type" /> <result property="problemType" column="problem_type" />
<result property="dispatchUnderlingSiteCode" column="dispatch_underling_site_code" /> <result property="dispatchUnderlingSiteCode" column="dispatch_underling_site_code" />
<result property="dispatchUnderlingSiteName" column="dispatch_underling_site_name" /> <result property="dispatchUnderlingSiteName" column="dispatch_underling_site_name" />
<result property="manual_remark" column="manualRemark" />
<result property="bl_manual" column="blManual" />
</resultMap> </resultMap>
<sql id="selectEmisTmsSiteBatchMissVo"> <sql id="selectEmisTmsSiteBatchMissVo">
@ -132,7 +134,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectEmisTmsSiteBatchMissList" parameterType="EmisTmsSiteBatchMiss" resultMap="EmisTmsSiteBatchMissResult"> <select id="selectEmisTmsSiteBatchMissList" parameterType="EmisTmsSiteBatchMiss" resultMap="EmisTmsSiteBatchMissResult">
<choose> <choose>
<when test="missCount == -4"> <when test="missCount == -4 or missCount == -7">
<!-- 当missCount=-4时,查询emis_waybill_batch_status表 --> <!-- 当missCount=-4时,查询emis_waybill_batch_status表 -->
select select
distinct w.bill_code, null as id, '已组批次成功' as miss_reason, distinct w.bill_code, null as id, '已组批次成功' as miss_reason,
@ -157,7 +159,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
(SELECT GROUP_CONCAT(p.prod_name) (SELECT GROUP_CONCAT(p.prod_name)
FROM emis_trans_product p FROM emis_trans_product p
WHERE FIND_IN_SET(p.prod_code, w.product_type) WHERE FIND_IN_SET(p.prod_code, w.product_type)
AND p.del_flag = '0') as product_type_name AND p.del_flag = '0') as product_type_name,
b.remark as manual_remark,b.bl_manual
from emis_waybill_batch_status b from emis_waybill_batch_status b
inner join emis_waybill w on b.bill_code = w.bill_code and w.del_flag='0' inner join emis_waybill w on b.bill_code = w.bill_code and w.del_flag='0'
left join emis_site s1 on w.send_site_code=s1.site_code and s1.del_flag=0 left join emis_site s1 on w.send_site_code=s1.site_code and s1.del_flag=0
@ -170,6 +173,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="billCode != null and billCode != '' and ( params.billCodeSortList == null or (params.billCodeSortList != null and params.billCodeSortList.size() == 1 ) )"> <if test="billCode != null and billCode != '' and ( params.billCodeSortList == null or (params.billCodeSortList != null and params.billCodeSortList.size() == 1 ) )">
and ( b.`bill_code`=#{billCode} or b.bill_code like concat('%',#{billCode}) ) and ( b.`bill_code`=#{billCode} or b.bill_code like concat('%',#{billCode}) )
</if> </if>
<if test="missCount == -7">
AND (b.bl_manual = '2' or b.bl_manual = '3')
</if>
<if test="params.billCodeSortList != null and params.billCodeSortList.size() > 1 "> <if test="params.billCodeSortList != null and params.billCodeSortList.size() > 1 ">
and b.bill_code in and b.bill_code in
<foreach collection="params.billCodeSortList" item="item" open="(" separator="," close=")"> <foreach collection="params.billCodeSortList" item="item" open="(" separator="," close=")">

View File

@ -4,10 +4,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xdadan.erp.emis.mapper.EmisWaybillBatchStatusMapper"> <mapper namespace="com.xdadan.erp.emis.mapper.EmisWaybillBatchStatusMapper">
<resultMap type="com.xdadan.erp.emis.domain.EmisWaybillBatchStatus" id="EmisWaybillBatchStatusResult"> <resultMap type="com.xdadan.erp.emis.domain.EmisWaybillBatchStatus" id="EmisWaybillBatchStatusResult" extends="com.xdadan.erp.emis.mapper.EmisBaseMapper.EmisBaseResult">
<result property="id" column="id"/> <result property="id" column="id"/>
<result property="billCode" column="bill_code"/> <result property="billCode" column="bill_code"/>
<result property="siteBatchStatus" column="site_batch_status"/> <result property="siteBatchStatus" column="site_batch_status"/>
<result property="blManual" column="bl_manual"/>
<result property="remark" column="remark"/> <result property="remark" column="remark"/>
<result property="createBy" column="create_by"/> <result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/> <result property="createTime" column="create_time"/>
@ -16,31 +17,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectEmisWaybillBatchStatusVo"> <sql id="selectEmisWaybillBatchStatusVo">
select id, bill_code, site_batch_status, remark, select id, bill_code, site_batch_status, bl_manual, remark,
create_by, create_time, update_by, update_time create_by, create_time, update_by, update_time, del_flag
from emis_waybill_batch_status from emis_waybill_batch_status
</sql> </sql>
<insert id="batchInsertEmisWaybillBatchStatus" parameterType="java.util.List"> <insert id="batchInsertEmisWaybillBatchStatus" parameterType="java.util.List">
insert ignore into emis_waybill_batch_status ( insert ignore into emis_waybill_batch_status (
bill_code, site_batch_status, remark, bill_code, site_batch_status, bl_manual, remark,
create_by, create_time, update_by, update_time create_by, create_time, update_by, update_time,create_site,update_site
) values ) values
<foreach collection="list" item="item" separator=","> <foreach collection="list" item="item" separator=",">
( (
#{item.billCode}, #{item.siteBatchStatus}, #{item.remark}, #{item.billCode}, #{item.siteBatchStatus}, #{item.blManual}, #{item.remark},
#{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime} #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.createSite},
#{item.updateSite}
) )
</foreach> </foreach>
</insert> </insert>
<!-- 根据运单号列表批量删除批次状态 --> <!-- 根据运单号列表批量逻辑删除批次状态 -->
<delete id="deleteByBillCodes" parameterType="java.util.List"> <update id="deleteByBillCodes" parameterType="java.util.List">
delete from emis_waybill_batch_status update emis_waybill_batch_status
set del_flag = '1'
where bill_code in where bill_code in
<foreach collection="billCodes" item="billCode" open="(" separator="," close=")"> <foreach collection="billCodes" item="billCode" open="(" separator="," close=")">
#{billCode} #{billCode}
</foreach> </foreach>
</delete> and del_flag = '0'
</update>
</mapper> </mapper>