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;
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.beans.factory.annotation.Autowired;
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.RestController;
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.enums.BusinessType;
import com.xdadan.erp.emis.domain.EmisTmsSiteBatchMiss;
@ -24,7 +23,7 @@ import com.xdadan.erp.common.core.page.TableDataInfo;
/**
* TMS漏组批次信息Controller
*
*
* @author heyu
*/
@RestController
@ -126,4 +125,51 @@ public class EmisTmsSiteBatchMissController extends EmisBaseController {
public AjaxResult remove(@PathVariable Long[] 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)
@DataAuditField(fieldComment = "目的网点名称")
private String dispatchUnderlingSiteName;
/** 人工审核备注 */
private String manualRemark;
/* 完成状态 1:系统审核完成,2:人工审核完成,3:无需组批次 默认为1*/
private String blManual;
}

View File

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

View File

@ -2,16 +2,17 @@ package com.xdadan.erp.emis.service;
import java.util.List;
import com.xdadan.erp.emis.domain.EmisTmsSiteBatchMiss;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
/**
* TMS漏组批次信息Service接口
*
*
* @author heyu
*/
public interface IEmisTmsSiteBatchMissService {
/**
* 查询TMS漏组批次信息
*
*
* @param id TMS漏组批次信息主键
* @return TMS漏组批次信息
*/
@ -19,7 +20,7 @@ public interface IEmisTmsSiteBatchMissService {
/**
* 查询TMS漏组批次信息列表
*
*
* @param emisTmsSiteBatchMiss TMS漏组批次信息
* @return TMS漏组批次信息集合
*/
@ -27,7 +28,7 @@ public interface IEmisTmsSiteBatchMissService {
/**
* 新增TMS漏组批次信息
*
*
* @param emisTmsSiteBatchMiss TMS漏组批次信息
* @return 结果
*/
@ -35,7 +36,7 @@ public interface IEmisTmsSiteBatchMissService {
/**
* 修改TMS漏组批次信息
*
*
* @param emisTmsSiteBatchMiss TMS漏组批次信息
* @return 结果
*/
@ -43,7 +44,7 @@ public interface IEmisTmsSiteBatchMissService {
/**
* 批量删除TMS漏组批次信息
*
*
* @param ids 需要删除的TMS漏组批次信息主键集合
* @return 结果
*/
@ -51,7 +52,7 @@ public interface IEmisTmsSiteBatchMissService {
/**
* 删除TMS漏组批次信息信息
*
*
* @param id TMS漏组批次信息主键
* @return 结果
*/
@ -70,4 +71,14 @@ public interface IEmisTmsSiteBatchMissService {
* @return TMS漏组批次信息列表
*/
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;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
@ -9,6 +8,8 @@ import java.util.concurrent.Executors;
import cn.hutool.core.collection.CollectionUtil;
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.service.EmisBaseService;
import com.xdadan.erp.emis.utils.WaybillHelper;
@ -18,11 +19,12 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.xdadan.erp.emis.service.IEmisTmsSiteBatchMissService;
/**
* TMS漏组批次信息Service业务层处理
*
*
* @author heyu
*/
@Service
@ -52,7 +54,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
/**
* 查询TMS漏组批次信息
*
*
* @param id TMS漏组批次信息主键
* @return TMS漏组批次信息
*/
@ -64,7 +66,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
/**
* 查询TMS漏组批次信息列表
*
*
* @param emisTmsSiteBatchMiss TMS漏组批次信息
* @return TMS漏组批次信息
*/
@ -84,49 +86,53 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
list = emisTmsSiteBatchMissMapper.selectEmisTmsSiteBatchMissList(emisTmsSiteBatchMiss);
}
// // 收集所有virtualRemark中的单号
// Set<String> relatedBillCodes = new HashSet<>();
// for (EmisTmsSiteBatchMiss miss : list) {
// String virtualRemark = miss.getVirtualRemark();
// if (virtualRemark != null && !virtualRemark.trim().isEmpty()) {
// String[] codes = virtualRemark.split(",");
// for (String code : codes) {
// relatedBillCodes.add(code.trim());
// }
// }
// }
// if (CollectionUtil.isEmpty(relatedBillCodes)) {
// return list;
// }
// // 批量查找相关单号
// List<EmisWaybill> relatedList = relatedBillCodes.isEmpty() ? Collections.emptyList()
// : emisTmsSiteBatchMissMapper.selectByBillCodes(new ArrayList<>(relatedBillCodes));
// Map<String, EmisWaybill> relatedMap = relatedList.stream()
// .collect(Collectors.toMap(EmisWaybill::getBillCode, Function.identity(), (a, b) -> a));
// // 过滤逻辑
// list = list.stream()
// .filter(wb -> {
// String virtualRemark = wb.getVirtualRemark();
// if (virtualRemark == null || virtualRemark.trim().isEmpty()) {
// return true;
// }
// String[] relatedNos = virtualRemark.split(",");
// for (String no : relatedNos) {
// EmisWaybill related = relatedMap.get(no.trim());
// if (related != null && Integer.valueOf(173).equals(related.getProblemType())) {
// return false;
// }
// }
// return true;
// })
// .collect(Collectors.toList());
// // 收集所有virtualRemark中的单号
// Set<String> relatedBillCodes = new HashSet<>();
// for (EmisTmsSiteBatchMiss miss : list) {
// String virtualRemark = miss.getVirtualRemark();
// if (virtualRemark != null && !virtualRemark.trim().isEmpty()) {
// String[] codes = virtualRemark.split(",");
// for (String code : codes) {
// relatedBillCodes.add(code.trim());
// }
// }
// }
// if (CollectionUtil.isEmpty(relatedBillCodes)) {
// return list;
// }
// // 批量查找相关单号
// List<EmisWaybill> relatedList = relatedBillCodes.isEmpty() ?
// Collections.emptyList()
// : emisTmsSiteBatchMissMapper.selectByBillCodes(new
// ArrayList<>(relatedBillCodes));
// Map<String, EmisWaybill> relatedMap = relatedList.stream()
// .collect(Collectors.toMap(EmisWaybill::getBillCode, Function.identity(), (a,
// b) -> a));
// // 过滤逻辑
// list = list.stream()
// .filter(wb -> {
// String virtualRemark = wb.getVirtualRemark();
// if (virtualRemark == null || virtualRemark.trim().isEmpty()) {
// return true;
// }
// String[] relatedNos = virtualRemark.split(",");
// for (String no : relatedNos) {
// EmisWaybill related = relatedMap.get(no.trim());
// if (related != null && Integer.valueOf(173).equals(related.getProblemType()))
// {
// return false;
// }
// }
// return true;
// })
// .collect(Collectors.toList());
return list;
}
/**
* 新增TMS漏组批次信息
*
*
* @param emisTmsSiteBatchMiss TMS漏组批次信息
* @return 结果
*/
@ -138,7 +144,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
/**
* 修改TMS漏组批次信息
*
*
* @param emisTmsSiteBatchMiss TMS漏组批次信息
* @return 结果
*/
@ -150,19 +156,19 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
/**
* 批量删除TMS漏组批次信息
*
*
* @param ids 需要删除的TMS漏组批次信息主键
* @return 结果
*/
@Override
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);
}
/**
* 删除TMS漏组批次信息信息
*
*
* @param id TMS漏组批次信息主键
* @return 结果
*/
@ -180,6 +186,43 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
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
@Override
public void autoScanSiteBatch(String lineCode) {
@ -371,4 +414,4 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements
return tree;
}
}
}

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
from emis_waybill a
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}
and a.del_flag = '0'
and a.send_date <![CDATA[ > ]]> '2025-01-01 00:00:00'

View File

@ -3,7 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xdadan.erp.emis.mapper.EmisTmsSiteBatchMissMapper">
<resultMap type="EmisTmsSiteBatchMiss" id="EmisTmsSiteBatchMissResult" extends="com.xdadan.erp.emis.mapper.EmisBaseMapper.EmisBaseResult">
<result property="id" column="id"/>
<result property="billCode" column="bill_code"/>
@ -48,6 +48,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="problemType" column="problem_type" />
<result property="dispatchUnderlingSiteCode" column="dispatch_underling_site_code" />
<result property="dispatchUnderlingSiteName" column="dispatch_underling_site_name" />
<result property="manual_remark" column="manualRemark" />
<result property="bl_manual" column="blManual" />
</resultMap>
<sql id="selectEmisTmsSiteBatchMissVo">
@ -132,20 +134,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectEmisTmsSiteBatchMissList" parameterType="EmisTmsSiteBatchMiss" resultMap="EmisTmsSiteBatchMissResult">
<choose>
<when test="missCount == -4">
<when test="missCount == -4 or missCount == -7">
<!-- 当missCount=-4时,查询emis_waybill_batch_status表 -->
select
distinct w.bill_code, null as id, '已组批次成功' as miss_reason,
null as create_by, null as create_time, null as update_by, null as update_time,
null as create_by, null as create_time, null as update_by, null as update_time,
null as remark, '0' as del_flag,
w.trans_line_type as line_code, w.product_type, w.start_site_code, w.next_site_code,
w.trans_line_type as line_code, w.product_type, w.start_site_code, w.next_site_code,
null as supplier_code, null as start_date, null as end_date, '0' as miss_type,
w.send_site_code, s1.site_name as send_site_name,
w.send_country, c1.name as send_country_name, w.destination_code, s2.site_name as dispatch_underling_site_name, w.bl_is_question,
l.line_name as line_name,
w.receive_country, c2.name as receive_country_name, w.send_date, w.bl_sign, w.sign_date,
w.payment_type, w.parcel_qty, w.bill_weight, w.total_volume, w.volume_weight,
w.settlement_weight, w.freight, w.remark as waybill_remark, w.fee_remark,
w.settlement_weight, w.freight, w.remark as waybill_remark, w.fee_remark,
null as manager, null as trans_manager,
(SELECT GROUP_CONCAT(s.site_name ORDER BY FIND_IN_SET(s.site_code, w.start_site_code))
FROM emis_site s
@ -157,7 +159,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
(SELECT GROUP_CONCAT(p.prod_name)
FROM emis_trans_product p
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
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
@ -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 ) )">
and ( b.`bill_code`=#{billCode} or b.bill_code like concat('%',#{billCode}) )
</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 ">
and b.bill_code in
<foreach collection="params.billCodeSortList" item="item" open="(" separator="," close=")">
@ -313,12 +319,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</otherwise>
</choose>
</select>
<select id="selectEmisTmsSiteBatchMissById" parameterType="Long" resultMap="EmisTmsSiteBatchMissResult">
<include refid="selectEmisTmsSiteBatchMissVo"/>
where m.id = #{id} and m.del_flag = '0'
</select>
<insert id="insertEmisTmsSiteBatchMiss" parameterType="EmisTmsSiteBatchMiss" useGeneratedKeys="true" keyProperty="id">
insert into emis_tms_site_batch_miss
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -358,7 +364,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</update>
<update id="deleteEmisTmsSiteBatchMissByIds" parameterType="String">
update emis_tms_site_batch_miss set del_flag = '1' where id in
update emis_tms_site_batch_miss set del_flag = '1' where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
@ -437,4 +443,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{billCode}
</foreach>
</select>
</mapper>
</mapper>

View File

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