入库相关接口开发2.0

This commit is contained in:
2025-06-04 11:34:07 +08:00
parent 1bfc086e8f
commit 0f51415b64
18 changed files with 812 additions and 33 deletions

View File

@@ -43,13 +43,13 @@ public class PcdeDetailController extends BaseController
} }
/** /**
* 查询全部库位明细列表 * 获取未被入库单据使用的库位列表
*/ */
@PreAuthorize("@ss.hasPermi('information:pcdedetail:list')") @PreAuthorize("@ss.hasPermi('information:pcdedetail:list')")
@GetMapping("/getAll") @GetMapping("/getAll")
public AjaxResult getAll() public AjaxResult getAll()
{ {
List<PcdeDetail> list = pcdeDetailService.selectPcdeDetailList(new PcdeDetail()); List<PcdeDetail> list = pcdeDetailService.getAllPcde();
return success(list); return success(list);
} }

View File

@@ -66,4 +66,11 @@ public interface IPcdeDetailService
* @return * @return
*/ */
String importPcdeDetail(List<PcdeDetail> list, String operName); String importPcdeDetail(List<PcdeDetail> list, String operName);
/**
* 获取未被入库单据使用的库位列表
* @return
*/
List<PcdeDetail> getAllPcde();
} }

View File

@@ -1,6 +1,7 @@
package com.zg.project.information.service.impl; package com.zg.project.information.service.impl;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.zg.common.exception.ServiceException; import com.zg.common.exception.ServiceException;
@@ -183,4 +184,23 @@ public class PcdeDetailServiceImpl implements IPcdeDetailService
return "恭喜您,数据已全部导入成功!共 " + successNum + " 条。"; return "恭喜您,数据已全部导入成功!共 " + successNum + " 条。";
} }
} }
/**
* 获取未被入库单据使用的库位列表
*/
@Override
public List<PcdeDetail> getAllPcde() {
// 查询所有库位
List<PcdeDetail> pcdeList = pcdeDetailMapper.selectPcdeDetailList(new PcdeDetail());
// 查询已被使用过的库位码pcode
List<String> usedPcodeList = rkInfoMapper.selectUsedPcodes();
// 过滤掉已使用的
List<PcdeDetail> availableList = pcdeList.stream()
.filter(p -> !usedPcodeList.contains(p.getLocationCode()))
.collect(Collectors.toList());
return availableList;
}
} }

View File

@@ -3,6 +3,7 @@ package com.zg.project.wisdom.controller;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.zg.project.wisdom.domain.dto.PcRkInfoBatchDTO;
import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO; import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO;
import com.zg.project.wisdom.service.IGysJhService; import com.zg.project.wisdom.service.IGysJhService;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -31,7 +32,7 @@ import com.zg.framework.web.page.TableDataInfo;
* @date 2025-05-28 * @date 2025-05-28
*/ */
@RestController @RestController
@RequestMapping("/wisdom/stock") @RequestMapping("/pc/wisdom/stock")
public class RkInfoController extends BaseController public class RkInfoController extends BaseController
{ {
@Autowired @Autowired
@@ -75,10 +76,10 @@ public class RkInfoController extends BaseController
/** /**
* 新增库存单据主 * 新增库存单据主
*/ */
@PostMapping("/add")
@PreAuthorize("@ss.hasPermi('wisdom:stock:add')") @PreAuthorize("@ss.hasPermi('wisdom:stock:add')")
@Log(title = "库存单据主", businessType = BusinessType.INSERT) @Log(title = "库存单据主", businessType = BusinessType.INSERT)
@PostMapping("/add") public AjaxResult batchAdd(@RequestBody PcRkInfoBatchDTO dto) {
public AjaxResult batchAdd(@RequestBody RkInfoBatchDTO dto) {
return toAjax(rkInfoService.batchInsert(dto)); return toAjax(rkInfoService.batchInsert(dto));
} }

View File

@@ -0,0 +1,97 @@
package com.zg.project.wisdom.controller.app;
import com.zg.common.utils.poi.ExcelUtil;
import com.zg.framework.aspectj.lang.annotation.Log;
import com.zg.framework.aspectj.lang.enums.BusinessType;
import com.zg.framework.web.controller.BaseController;
import com.zg.framework.web.domain.AjaxResult;
import com.zg.framework.web.page.TableDataInfo;
import com.zg.project.wisdom.domain.RkInfo;
import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO;
import com.zg.project.wisdom.service.IRkInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 库存单据主Controller
*
* @author zg
* @date 2025-05-28
*/
@RestController
@RequestMapping("/wisdom/stock")
public class AppRkInfoController extends BaseController {
@Autowired
private IRkInfoService rkInfoService;
/**
* 查询库存单据主列表
*/
@PreAuthorize("@ss.hasPermi('wisdom:stock:list')")
@GetMapping("/list")
public TableDataInfo list(RkInfo rkInfo)
{
startPage();
List<RkInfo> list = rkInfoService.selectRkInfoList(rkInfo);
return getDataTable(list);
}
/**
* 导出库存单据主列表
*/
@PreAuthorize("@ss.hasPermi('wisdom:stock:export')")
@Log(title = "库存单据主", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, RkInfo rkInfo)
{
List<RkInfo> list = rkInfoService.selectRkInfoList(rkInfo);
ExcelUtil<RkInfo> util = new ExcelUtil<RkInfo>(RkInfo.class);
util.exportExcel(response, list, "库存单据主数据");
}
/**
* 获取库存单据主详细信息
*/
@PreAuthorize("@ss.hasPermi('wisdom:stock:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(rkInfoService.selectRkInfoById(id));
}
/**
* 新增库存单据主
*/
@PreAuthorize("@ss.hasPermi('wisdom:stock:add')")
@Log(title = "库存单据主", businessType = BusinessType.INSERT)
@PostMapping("/add")
public AjaxResult batchAdd(@RequestBody RkInfoBatchDTO dto) {
return toAjax(rkInfoService.batchInsertApp(dto));
}
/**
* 修改库存单据主
*/
@PreAuthorize("@ss.hasPermi('wisdom:stock:edit')")
@Log(title = "库存单据主", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody RkInfo rkInfo)
{
return toAjax(rkInfoService.updateRkInfo(rkInfo));
}
/**
* 删除库存单据主
*/
@PreAuthorize("@ss.hasPermi('wisdom:stock:remove')")
@Log(title = "库存单据主", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(rkInfoService.deleteRkInfoByIds(ids));
}
}

View File

@@ -121,6 +121,10 @@ public class RkInfo extends BaseEntity
@Excel(name = "库位码") @Excel(name = "库位码")
private String pcode; private String pcode;
/** 库位主键ID */
@Excel(name = "库位主键ID")
private String pcodeId;
/** 托盘码 */ /** 托盘码 */
@Excel(name = "托盘码") @Excel(name = "托盘码")
private String trayCode; private String trayCode;
@@ -384,6 +388,14 @@ public class RkInfo extends BaseEntity
return pcode; return pcode;
} }
public void setPcodeId(String pcodeId) {
this.pcodeId = pcodeId;
}
public String getPcodeId() {
return pcodeId;
}
public void setTrayCode(String trayCode) public void setTrayCode(String trayCode)
{ {
this.trayCode = trayCode; this.trayCode = trayCode;
@@ -441,6 +453,7 @@ public class RkInfo extends BaseEntity
.append("dw", getDw()) .append("dw", getDw())
.append("realQty", getRealQty()) .append("realQty", getRealQty())
.append("pcode", getPcode()) .append("pcode", getPcode())
.append("pcodeId", getPcodeId())
.append("trayCode", getTrayCode()) .append("trayCode", getTrayCode())
.append("entityId", getEntityId()) .append("entityId", getEntityId())
.append("createBy", getCreateBy()) .append("createBy", getCreateBy())

View File

@@ -0,0 +1,64 @@
package com.zg.project.wisdom.domain.dto;
import java.util.List;
/**
* PC端 - 入库请求 DTO
*/
public class PcRkInfoBatchDTO {
/** 入库类型 */
private String rkType;
/** 物资类型 */
private String wlType;
/** 理货员 */
private String lihuoY;
/** 所属仓库 */
private String cangku;
/** 入库记录列表(每条为完整入库项) */
private List<PcRkInfoItemDTO> rkList;
public String getRkType() {
return rkType;
}
public void setRkType(String rkType) {
this.rkType = rkType;
}
public String getWlType() {
return wlType;
}
public void setWlType(String wlType) {
this.wlType = wlType;
}
public String getLihuoY() {
return lihuoY;
}
public void setLihuoY(String lihuoY) {
this.lihuoY = lihuoY;
}
public String getCangku() {
return cangku;
}
public void setCangku(String cangku) {
this.cangku = cangku;
}
public List<PcRkInfoItemDTO> getRkList() {
return rkList;
}
public void setRkList(List<PcRkInfoItemDTO> rkList) {
this.rkList = rkList;
}
}

View File

@@ -0,0 +1,242 @@
package com.zg.project.wisdom.domain.dto;
import java.math.BigDecimal;
/**
* PC端 - 入库明细 DTO字段驼峰命名规范
*/
public class PcRkInfoItemDTO {
/** 县局 */
private String xj;
/** 供应计划主键ID */
private Long gysJhId;
/** 本地物料号 */
private String wlNo;
/** 项目描述 */
private String xmMs;
/** 项目号 */
private String xmNo;
/** SAP物料号 */
private String sapWlNo;
/** SAP物料描述 */
private String sapWlMs;
/** 供应商编码 */
private String gysNo;
/** 供应商名称 */
private String gysMc;
/** SAP订单编号 */
private String sapNo;
/** 计划交货数量 */
private Long jhQty;
/** 合同数量 */
private Long htQty;
/** 计量单位 */
private String dw;
/** 计划交货金额 */
private BigDecimal jhAmt;
/** 合同单价 */
private BigDecimal htDj;
/** 实际入库数量 */
private Long realQty;
/** 库位码 */
private String pcode;
/** 库位主键ID */
private String pcodeId;
/** 托盘码 */
private String trayCode;
/** 实物 ID */
private String entityId;
/** 备注 */
private String remark;
// ======= Getter / Setter =======
public String getXj() {
return xj;
}
public void setXj(String xj) {
this.xj = xj;
}
public Long getGysJhId() {
return gysJhId;
}
public void setGysJhId(Long gysJhId) {
this.gysJhId = gysJhId;
}
public String getWlNo() {
return wlNo;
}
public void setWlNo(String wlNo) {
this.wlNo = wlNo;
}
public String getXmMs() {
return xmMs;
}
public void setXmMs(String xmMs) {
this.xmMs = xmMs;
}
public String getXmNo() {
return xmNo;
}
public void setXmNo(String xmNo) {
this.xmNo = xmNo;
}
public String getSapWlNo() {
return sapWlNo;
}
public void setSapWlNo(String sapWlNo) {
this.sapWlNo = sapWlNo;
}
public String getSapWlMs() {
return sapWlMs;
}
public void setSapWlMs(String sapWlMs) {
this.sapWlMs = sapWlMs;
}
public String getGysNo() {
return gysNo;
}
public void setGysNo(String gysNo) {
this.gysNo = gysNo;
}
public String getGysMc() {
return gysMc;
}
public void setGysMc(String gysMc) {
this.gysMc = gysMc;
}
public String getSapNo() {
return sapNo;
}
public void setSapNo(String sapNo) {
this.sapNo = sapNo;
}
public Long getJhQty() {
return jhQty;
}
public void setJhQty(Long jhQty) {
this.jhQty = jhQty;
}
public Long getHtQty() {
return htQty;
}
public void setHtQty(Long htQty) {
this.htQty = htQty;
}
public String getDw() {
return dw;
}
public void setDw(String dw) {
this.dw = dw;
}
public BigDecimal getJhAmt() {
return jhAmt;
}
public void setJhAmt(BigDecimal jhAmt) {
this.jhAmt = jhAmt;
}
public BigDecimal getHtDj() {
return htDj;
}
public void setHtDj(BigDecimal htDj) {
this.htDj = htDj;
}
public Long getRealQty() {
return realQty;
}
public void setRealQty(Long realQty) {
this.realQty = realQty;
}
public String getPcode() {
return pcode;
}
public void setPcode(String pcode) {
this.pcode = pcode;
}
public String getPcodeId() {
return pcodeId;
}
public void setPcodeId(String pcodeId) {
this.pcodeId = pcodeId;
}
public String getTrayCode() {
return trayCode;
}
public void setTrayCode(String trayCode) {
this.trayCode = trayCode;
}
public String getEntityId() {
return entityId;
}
public void setEntityId(String entityId) {
this.entityId = entityId;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}

View File

@@ -19,7 +19,6 @@ public class RkInfoBatchDTO {
/** 入库物料列表 */ /** 入库物料列表 */
private List<RkInfoItemDTO> rkList; private List<RkInfoItemDTO> rkList;
// Getters and Setters
public String getRkType() { public String getRkType() {
return rkType; return rkType;
} }

View File

@@ -1,19 +1,66 @@
package com.zg.project.wisdom.domain.dto; package com.zg.project.wisdom.domain.dto;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/**
* APP端 - 入库明细 DTO
*/
public class RkInfoItemDTO { public class RkInfoItemDTO {
/** 物料号 */ /** 供应计划主键ID */
private Long gysJhId;
/** SAP物料号数据库字段 wl_no */
private String wlNo; private String wlNo;
/** SAP物料描述数据库字段 wl_ms */
private String wlMs;
/** 项目号(数据库字段 xm_no */
private String xmNo;
/** 项目描述 */ /** 项目描述 */
private String xmMs; private String xmMs;
/** 扫码记录列表 */ /** 县局 */
private String xj;
/** 供应商编码 */
private String gysNo;
/** 供应商名称 */
private String gysMc;
/** SAP订单编号 */
private String sapNo;
/** 计划交货数量 */
private Long jhQty;
/** 合同数量 */
private Long htQty;
/** 计量单位 */
private String dw;
/** 计划交货金额 */
private BigDecimal jhAmt;
/** 合同单价 */
private BigDecimal htDj;
/** 实物扫码记录列表 */
private List<RkInfoScanDTO> scanList; private List<RkInfoScanDTO> scanList;
// Getters and Setters public Long getGysJhId() {
return gysJhId;
}
public void setGysJhId(Long gysJhId) {
this.gysJhId = gysJhId;
}
public String getWlNo() { public String getWlNo() {
return wlNo; return wlNo;
} }
@@ -22,6 +69,22 @@ public class RkInfoItemDTO {
this.wlNo = wlNo; this.wlNo = wlNo;
} }
public String getWlMs() {
return wlMs;
}
public void setWlMs(String wlMs) {
this.wlMs = wlMs;
}
public String getXmNo() {
return xmNo;
}
public void setXmNo(String xmNo) {
this.xmNo = xmNo;
}
public String getXmMs() { public String getXmMs() {
return xmMs; return xmMs;
} }
@@ -30,6 +93,78 @@ public class RkInfoItemDTO {
this.xmMs = xmMs; this.xmMs = xmMs;
} }
public String getXj() {
return xj;
}
public void setXj(String xj) {
this.xj = xj;
}
public String getGysNo() {
return gysNo;
}
public void setGysNo(String gysNo) {
this.gysNo = gysNo;
}
public String getGysMc() {
return gysMc;
}
public void setGysMc(String gysMc) {
this.gysMc = gysMc;
}
public String getSapNo() {
return sapNo;
}
public void setSapNo(String sapNo) {
this.sapNo = sapNo;
}
public Long getJhQty() {
return jhQty;
}
public void setJhQty(Long jhQty) {
this.jhQty = jhQty;
}
public Long getHtQty() {
return htQty;
}
public void setHtQty(Long htQty) {
this.htQty = htQty;
}
public String getDw() {
return dw;
}
public void setDw(String dw) {
this.dw = dw;
}
public BigDecimal getJhAmt() {
return jhAmt;
}
public void setJhAmt(BigDecimal jhAmt) {
this.jhAmt = jhAmt;
}
public BigDecimal getHtDj() {
return htDj;
}
public void setHtDj(BigDecimal htDj) {
this.htDj = htDj;
}
public List<RkInfoScanDTO> getScanList() { public List<RkInfoScanDTO> getScanList() {
return scanList; return scanList;
} }

View File

@@ -5,19 +5,21 @@ public class RkInfoScanDTO {
/** 库位码 */ /** 库位码 */
private String pcode; private String pcode;
/** 库位主键ID */
private String pcodeId;
/** 托盘码 */ /** 托盘码 */
private String trayCode; private String trayCode;
/** 实际入库数量 */ /** 实际数量 */
private Long realQty; private Long realQty;
/** 实物ID */ /** 实物 ID */
private String entityId; private String entityId;
/** 备注 */ /** 备注 */
private String remark; private String remark;
// Getters and Setters
public String getPcode() { public String getPcode() {
return pcode; return pcode;
} }
@@ -26,6 +28,14 @@ public class RkInfoScanDTO {
this.pcode = pcode; this.pcode = pcode;
} }
public String getPcodeId() {
return pcodeId;
}
public void setPcodeId(String pcodeId) {
this.pcodeId = pcodeId;
}
public String getTrayCode() { public String getTrayCode() {
return trayCode; return trayCode;
} }

View File

@@ -65,4 +65,10 @@ public interface GysJhMapper
* @return * @return
*/ */
List<GysJh> getBySapNo(String sapNo); List<GysJh> getBySapNo(String sapNo);
/**
* 修改状态
* @param gysJhId
*/
void updateStatusById(Long gysJhId);
} }

View File

@@ -66,4 +66,11 @@ public interface RkInfoMapper
* @return * @return
*/ */
int countRkInfoByLocationCode(@Param("locationCode") String locationCode); int countRkInfoByLocationCode(@Param("locationCode") String locationCode);
/**
* 查询已使用库位
* @return
*/
List<String> selectUsedPcodes();
} }

View File

@@ -2,6 +2,7 @@ package com.zg.project.wisdom.service;
import java.util.List; import java.util.List;
import com.zg.project.wisdom.domain.RkInfo; import com.zg.project.wisdom.domain.RkInfo;
import com.zg.project.wisdom.domain.dto.PcRkInfoBatchDTO;
import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO; import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO;
/** /**
@@ -54,9 +55,16 @@ public interface IRkInfoService
public int deleteRkInfoById(Long id); public int deleteRkInfoById(Long id);
/** /**
* 新增入库单据 * PC新增入库单据
* @param dto * @param dto
* @return * @return
*/ */
int batchInsert(RkInfoBatchDTO dto); int batchInsert(PcRkInfoBatchDTO dto);
/**
* APP新增入库单据
* @param dto
* @return
*/
int batchInsertApp(RkInfoBatchDTO dto);
} }

View File

@@ -3,19 +3,23 @@ package com.zg.project.wisdom.service.impl;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import com.zg.common.exception.ServiceException;
import com.zg.common.utils.DateUtils; import com.zg.common.utils.DateUtils;
import com.zg.common.utils.SecurityUtils; import com.zg.common.utils.SecurityUtils;
import com.zg.project.wisdom.domain.GysJh; import com.zg.project.wisdom.domain.GysJh;
import com.zg.project.wisdom.domain.dto.RkInfoBatchDTO; import com.zg.project.wisdom.domain.dto.*;
import com.zg.project.wisdom.domain.dto.RkInfoItemDTO; import com.zg.project.wisdom.mapper.GysJhMapper;
import com.zg.project.wisdom.domain.dto.RkInfoScanDTO;
import com.zg.project.wisdom.service.IGysJhService; import com.zg.project.wisdom.service.IGysJhService;
import com.zg.project.wisdom.util.CodeConvertUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.zg.project.wisdom.mapper.RkInfoMapper; import com.zg.project.wisdom.mapper.RkInfoMapper;
import com.zg.project.wisdom.domain.RkInfo; import com.zg.project.wisdom.domain.RkInfo;
import com.zg.project.wisdom.service.IRkInfoService; import com.zg.project.wisdom.service.IRkInfoService;
import static com.zg.common.utils.SecurityUtils.getUsername;
/** /**
* 库存单据主Service业务层处理 * 库存单据主Service业务层处理
* *
@@ -29,6 +33,9 @@ public class RkInfoServiceImpl implements IRkInfoService
@Autowired @Autowired
private RkInfoMapper rkInfoMapper; private RkInfoMapper rkInfoMapper;
@Autowired
private GysJhMapper gysJhMapper;
/** /**
* 查询库存单据主 * 查询库存单据主
* *
@@ -97,44 +104,148 @@ public class RkInfoServiceImpl implements IRkInfoService
* @return * @return
*/ */
@Override @Override
public int batchInsert(RkInfoBatchDTO dto) { public int batchInsert(PcRkInfoBatchDTO dto) {
List<RkInfo> saveList = new ArrayList<>(); List<RkInfo> saveList = new ArrayList<>();
String username = SecurityUtils.getUsername(); // 获取当前登录用户 String username = SecurityUtils.getUsername();
Date now = DateUtils.getNowDate(); // 当前时间 Date now = DateUtils.getNowDate();
if (dto.getRkList() == null || dto.getRkList().isEmpty()) {
throw new ServiceException("rkList 入库明细列表不能为空");
}
for (PcRkInfoItemDTO item : dto.getRkList()) {
RkInfo entity = new RkInfo();
// 顶层字段
entity.setRkType(dto.getRkType());
entity.setWlType(dto.getWlType());
entity.setCangku(dto.getCangku());
entity.setLihuoY(dto.getLihuoY());
// 明细字段item
entity.setXj(item.getXj());
entity.setXmNo(item.getXmNo());
entity.setXmMs(item.getXmMs());
entity.setSapNo(item.getSapNo());
entity.setJhQty(item.getJhQty());
entity.setHtQty(item.getHtQty());
entity.setJhAmt(item.getJhAmt());
entity.setHtDj(item.getHtDj());
entity.setDw(item.getDw());
entity.setWlNo(item.getWlNo());
// entity.setWlMs(item.getWlMs());
entity.setGysNo(item.getGysNo());
entity.setGysMc(item.getGysMc());
// 库存字段
entity.setRealQty(item.getRealQty());
entity.setPcode(item.getPcode());
if (item.getPcode() != null) {
entity.setPcodeId(CodeConvertUtil.stringToHex(item.getPcode()));
}
entity.setTrayCode(item.getTrayCode());
entity.setEntityId(item.getEntityId());
entity.setRemark(item.getRemark());
// 系统字段
entity.setIsChuku("0");
entity.setIsDelete("0");
entity.setRkTime(now);
entity.setCreateBy(username);
entity.setCreateTime(now);
saveList.add(entity);
// 更新供应计划状态
if (item.getGysJhId() != null) {
gysJhMapper.updateStatusById(item.getGysJhId());
}
}
if (saveList.isEmpty()) {
throw new ServiceException("未提取到任何可保存的数据");
}
return rkInfoMapper.batchInsertRkInfo(saveList);
}
/**
* 新增入库单据APP
* @param dto
* @return
*/
@Override
public int batchInsertApp(RkInfoBatchDTO dto) {
List<RkInfo> saveList = new ArrayList<>();
String username = SecurityUtils.getUsername();
Date now = DateUtils.getNowDate();
if (dto.getRkList() == null || dto.getRkList().isEmpty()) {
throw new ServiceException("rkList 入库明细列表不能为空");
}
for (RkInfoItemDTO item : dto.getRkList()) { for (RkInfoItemDTO item : dto.getRkList()) {
for (RkInfoScanDTO scan : item.getScanList()) { List<RkInfoScanDTO> scanList = item.getScanList();
if (scanList == null || scanList.isEmpty()) {
continue;
}
for (RkInfoScanDTO scan : scanList) {
RkInfo entity = new RkInfo(); RkInfo entity = new RkInfo();
// ======= 来自最外层 DTO ======= // 批次字段
entity.setRkType(dto.getRkType()); entity.setRkType(dto.getRkType());
entity.setWlType(dto.getWlType()); entity.setWlType(dto.getWlType());
entity.setCangku(dto.getCangku()); entity.setCangku(dto.getCangku());
entity.setLihuoY(dto.getLihuoY()); entity.setLihuoY(dto.getLihuoY());
// ======= 中层 DTO ======= // 明细字段RkInfoItemDTO
entity.setWlNo(item.getWlNo()); entity.setXj(item.getXj());
entity.setXmMs(item.getXmMs()); entity.setXmMs(item.getXmMs());
entity.setXmNo(item.getXmNo());
entity.setSapNo(item.getSapNo());
entity.setJhQty(item.getJhQty());
entity.setHtQty(item.getHtQty());
entity.setJhAmt(item.getJhAmt());
entity.setHtDj(item.getHtDj());
entity.setDw(item.getDw());
entity.setWlNo(item.getWlNo());
entity.setWlMs(item.getWlMs());
entity.setGysNo(item.getGysNo());
entity.setGysMc(item.getGysMc());
// ======= 最内层 DTO ======= // 扫码记录RkInfoScanDTO
entity.setPcode(scan.getPcode()); entity.setPcode(scan.getPcode());
if (scan.getPcode() != null) {
entity.setPcodeId(CodeConvertUtil.stringToHex(scan.getPcode()));
}
entity.setTrayCode(scan.getTrayCode()); entity.setTrayCode(scan.getTrayCode());
entity.setRealQty(scan.getRealQty()); entity.setRealQty(scan.getRealQty());
entity.setEntityId(scan.getEntityId()); entity.setEntityId(scan.getEntityId());
entity.setRemark(scan.getRemark()); entity.setRemark(scan.getRemark());
// ======= 系统默认字段 ======= // 系统字段
entity.setIsChuku("0");
entity.setIsDelete("0"); entity.setIsDelete("0");
entity.setIsChuku("0");
entity.setRkTime(now); entity.setRkTime(now);
entity.setCreateBy(username); entity.setCreateBy(username);
entity.setCreateTime(now); entity.setCreateTime(now);
saveList.add(entity); saveList.add(entity);
} }
// 每个 item 的 供应计划主键ID 更新一次供应计划状态
if (item.getGysJhId() != null) {
gysJhMapper.updateStatusById(item.getGysJhId());
}
}
if (saveList.isEmpty()) {
throw new ServiceException("未提取到任何可保存的数据");
} }
// 批量插入到数据库
return rkInfoMapper.batchInsertRkInfo(saveList); return rkInfoMapper.batchInsertRkInfo(saveList);
} }

View File

@@ -0,0 +1,42 @@
package com.zg.project.wisdom.util;
/**
* 编码转换工具类 - 处理如库位码转十六进制字符串等逻辑
*/
public class CodeConvertUtil {
/**
* 将字符串转为十六进制字符串如用于生成库位ID
* @param input 原始字符串,例如 "A01-013004"
* @return 十六进制字符串,例如 "4130312D303133303034"
*/
public static String stringToHex(String input) {
if (input == null) {
return null;
}
StringBuilder hex = new StringBuilder();
for (char ch : input.toCharArray()) {
hex.append(String.format("%02X", (int) ch));
}
return hex.toString();
}
/**
* 可选:将十六进制字符串转换回原始字符串
* @param hex 十六进制字符串
* @return 原始字符串
*/
public static String hexToString(String hex) {
if (hex == null || hex.length() % 2 != 0) {
return null;
}
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i += 2) {
String str = hex.substring(i, i + 2);
output.append((char) Integer.parseInt(str, 16));
}
return output.toString();
}
}

View File

@@ -54,6 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="getBySapNo" parameterType="java.lang.String" resultMap="GysJhResult"> <select id="getBySapNo" parameterType="java.lang.String" resultMap="GysJhResult">
<include refid="selectGysJhVo"/> <include refid="selectGysJhVo"/>
WHERE sap_no = #{sapNo} WHERE sap_no = #{sapNo}
AND status = '0'
</select> </select>
<insert id="insertGysJh" parameterType="GysJh" useGeneratedKeys="true" keyProperty="id"> <insert id="insertGysJh" parameterType="GysJh" useGeneratedKeys="true" keyProperty="id">
@@ -137,6 +138,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id} where id = #{id}
</update> </update>
<update id="updateStatusById" parameterType="Long">
update gys_jh
set status = '1'
where id = #{id}
</update>
<delete id="deleteGysJhById" parameterType="Long"> <delete id="deleteGysJhById" parameterType="Long">
delete from gys_jh where id = #{id} delete from gys_jh where id = #{id}
</delete> </delete>

View File

@@ -62,20 +62,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<insert id="batchInsertRkInfo" parameterType="java.util.List"> <insert id="batchInsertRkInfo" parameterType="java.util.List">
insert into rk_info ( insert into rk_info (
rk_type, wl_type, cangku, lihuo_y, rk_time, rk_type, wl_type, cangku, lihuo_y, rk_time,
wl_no, xm_ms, pcode, tray_code, real_qty, entity_id, wl_no, wl_ms, xm_no, xm_ms, xj, sap_no, gys_no, gys_mc,
jh_qty, ht_qty, jh_amt, ht_dj, dw,
pcode, pcode_id, tray_code, real_qty, entity_id,
remark, is_chuku, is_delete, create_by, create_time remark, is_chuku, is_delete, create_by, create_time
) )
values values
<foreach collection="list" item="item" separator=","> <foreach collection="list" item="item" separator=",">
( (
#{item.rkType}, #{item.wlType}, #{item.cangku}, #{item.lihuoY}, #{item.rkTime}, #{item.rkType}, #{item.wlType}, #{item.cangku}, #{item.lihuoY}, #{item.rkTime},
#{item.wlNo}, #{item.xmMs}, #{item.pcode}, #{item.trayCode}, #{item.realQty}, #{item.entityId}, #{item.wlNo}, #{item.wlMs}, #{item.xmNo}, #{item.xmMs}, #{item.xj}, #{item.sapNo}, #{item.gysNo}, #{item.gysMc},
#{item.jhQty}, #{item.htQty}, #{item.jhAmt}, #{item.htDj}, #{item.dw},
#{item.pcode}, #{item.pcodeId}, #{item.trayCode}, #{item.realQty}, #{item.entityId},
#{item.remark}, #{item.isChuku}, #{item.isDelete}, #{item.createBy}, #{item.createTime} #{item.remark}, #{item.isChuku}, #{item.isDelete}, #{item.createBy}, #{item.createTime}
) )
</foreach> </foreach>
</insert> </insert>
<select id="selectRkInfoList" parameterType="RkInfo" resultMap="RkInfoResult"> <select id="selectRkInfoList" parameterType="RkInfo" resultMap="RkInfoResult">
<include refid="selectRkInfoVo"/> <include refid="selectRkInfoVo"/>
<where> <where>
@@ -114,7 +117,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectRkInfoById" parameterType="Long" resultMap="RkInfoResult"> <select id="selectRkInfoById" parameterType="Long" resultMap="RkInfoResult">
<include refid="selectRkInfoVo"/> <include refid="selectRkInfoVo"/>
where id = #{id} and is_delete = 0 where ri.id = #{id} and ri.is_delete = 0
</select> </select>
<select id="countRkInfoByLocationCode" resultType="int"> <select id="countRkInfoByLocationCode" resultType="int">
@@ -122,6 +125,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
FROM rk_info FROM rk_info
WHERE pcode = #{locationCode} AND is_delete = 0 WHERE pcode = #{locationCode} AND is_delete = 0
</select> </select>
<select id="selectUsedPcodes" resultType="java.lang.String">
SELECT DISTINCT pcode
FROM rk_info
WHERE is_delete = '0' AND is_chuku != '1'
</select>
<update id="updateRkInfo" parameterType="RkInfo"> <update id="updateRkInfo" parameterType="RkInfo">
update rk_info update rk_info
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">