瀏覽代碼

入库管理完成

master
huminghao 2 週之前
父節點
當前提交
c86451e71d
共有 30 個檔案被更改,包括 1040 行新增123 行删除
  1. 6
    0
      gly-base-core/src/main/java/cn/com/taiji/core/entity/dict/log/OperateType.java
  2. 0
    1
      gly-base-core/src/main/java/cn/com/taiji/core/entity/invw/InvwCardDetails.java
  3. 0
    1
      gly-base-core/src/main/java/cn/com/taiji/core/entity/invw/InvwObuDetails.java
  4. 0
    18
      gly-base-core/src/main/java/cn/com/taiji/core/manager/comm/OperateLogManager.java
  5. 3
    0
      gly-base-core/src/main/java/cn/com/taiji/core/repo/jpa/invw/InvwCardDetailsRepo.java
  6. 13
    0
      gly-base-core/src/main/java/cn/com/taiji/core/repo/jpa/invw/InvwEnterApplyDetailsRepo.java
  7. 6
    0
      gly-base-core/src/main/java/cn/com/taiji/core/repo/jpa/invw/InvwObuDetailsRepo.java
  8. 5
    0
      zhywpt-app-invw/build.gradle
  9. 44
    6
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/api/enter/InvwEnterApplyController.java
  10. 126
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyAddRequestDTO.java
  11. 7
    1
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyAddResponseDTO.java
  12. 31
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCancelRequestDTO.java
  13. 25
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCancelResponseDTO.java
  14. 99
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCodeValidRequestDTO.java
  15. 25
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCodeValidResponseDTO.java
  16. 37
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyConfirmRequestDTO.java
  17. 25
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyConfirmResponseDTO.java
  18. 0
    65
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyInfoApplyRequestDTO.java
  19. 24
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyParseExcelRequestDTO.java
  20. 25
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyParseExcelResponseDTO.java
  21. 131
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyUpdateRequestDTO.java
  22. 25
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyUpdateResponseDTO.java
  23. 36
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyViewRequestDTO.java
  24. 32
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyViewResponseDTO.java
  25. 14
    16
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/manager/AbstractInvwManager.java
  26. 15
    4
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/manager/enter/InvwEnterApplyManager.java
  27. 235
    11
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/manager/enter/InvwEnterApplyManagerImpl.java
  28. 30
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/model/enter/EnterApplyDetailModel.java
  29. 19
    0
      zhywpt-app-invw/src/main/java/cn/com/taiji/invw/tools/SourceTargetMapper.java
  30. 2
    0
      zhywpt-app-invw/src/main/resources/bootstrap.yml

+ 6
- 0
gly-base-core/src/main/java/cn/com/taiji/core/entity/dict/log/OperateType.java 查看文件

@@ -11,6 +11,12 @@ public enum OperateType {

ORDER_ADDRESS("收货地址管理"),
REFUND_RECEIVE("退费接收信息管理"),

//入库
ENTER_APPLY("入库申请"),
UPDATE_ENTER_APPLY("修改入库申请"),
CONFIRM_ENTER_APPLY("确认入库"),
CANCEL_ENTER_APPLY("取消入库"),
;
private final String value;


+ 0
- 1
gly-base-core/src/main/java/cn/com/taiji/core/entity/invw/InvwCardDetails.java 查看文件

@@ -25,7 +25,6 @@ import java.time.LocalDateTime;
@Table(name = "INVW_CARD_DETAILS")
public class InvwCardDetails extends StringPropertyUUIDEntity {

@NotBlank
@Size(max = 32)
@Column(name = "BATCH_ID")
private String batchId;//入库批次编号

+ 0
- 1
gly-base-core/src/main/java/cn/com/taiji/core/entity/invw/InvwObuDetails.java 查看文件

@@ -25,7 +25,6 @@ import java.time.LocalDateTime;
@Table(name = "INVW_OBU_DETAILS")
public class InvwObuDetails extends StringPropertyUUIDEntity {

@NotBlank
@Size(max = 32)
@Column(name = "BATCH_ID")
private String batchId;//入库批次编号

+ 0
- 18
gly-base-core/src/main/java/cn/com/taiji/core/manager/comm/OperateLogManager.java 查看文件

@@ -1,18 +0,0 @@
package cn.com.taiji.core.manager.comm;

import cn.com.taiji.core.entity.dict.basic.SourceType;
import cn.com.taiji.core.entity.dict.log.OperateType;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 17:57
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
public interface OperateLogManager {

void persistOperateLog(OperateType operateType, String operatorDataId, SourceType source,
String openId, String msg, String ip);

}

+ 3
- 0
gly-base-core/src/main/java/cn/com/taiji/core/repo/jpa/invw/InvwCardDetailsRepo.java 查看文件

@@ -15,6 +15,9 @@ public interface InvwCardDetailsRepo extends AbstractJpaRepo<InvwCardDetails, St
@Query(value = "from InvwCardDetails where storeCode = ?1")
List<InvwCardDetails> findByStoreCode(String storeCode);

@Query(" from InvwCardDetails where TO_NUMBER(cardId) >= TO_NUMBER(?1) and TO_NUMBER(cardId) <= TO_NUMBER(?2)")
List<InvwCardDetails> queryByCardIdBetween(String startId, String endId);

@Query(value = "select count(id) from InvwCardDetails where storeCode = ?1")
long findCountByStoreCode(String storeCode);


+ 13
- 0
gly-base-core/src/main/java/cn/com/taiji/core/repo/jpa/invw/InvwEnterApplyDetailsRepo.java 查看文件

@@ -2,7 +2,20 @@ package cn.com.taiji.core.repo.jpa.invw;

import cn.com.taiji.common.repo.jpa.AbstractJpaRepo;
import cn.com.taiji.core.entity.invw.InvwEnterApplyDetails;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


public interface InvwEnterApplyDetailsRepo extends AbstractJpaRepo<InvwEnterApplyDetails, String>{

@Transactional
@Modifying
@Query("delete from InvwEnterApplyDetails where applyNo = ?1")
void deleteByApplyNo(String applyNo);

@Query(" from InvwEnterApplyDetails where applyNo = ?1")
List<InvwEnterApplyDetails> queryByApplyNo(String applyNo);
}

+ 6
- 0
gly-base-core/src/main/java/cn/com/taiji/core/repo/jpa/invw/InvwObuDetailsRepo.java 查看文件

@@ -1,6 +1,7 @@
package cn.com.taiji.core.repo.jpa.invw;

import cn.com.taiji.common.repo.jpa.AbstractJpaRepo;
import cn.com.taiji.core.entity.invw.InvwCardDetails;
import cn.com.taiji.core.entity.dict.invw.InvDeviceStatus;
import cn.com.taiji.core.entity.invw.InvwObuDetails;
import org.springframework.data.jpa.repository.Modifying;
@@ -29,4 +30,9 @@ public interface InvwObuDetailsRepo extends AbstractJpaRepo<InvwObuDetails, Stri
@Query(value = "update InvwObuDetails set storeCode = ?1,agencyId=?2,channelId=?3 " +
" where storeCode = ?4 and status = ?5 and cardId >= ?6 and cardId <= ?7")
int updateStoreCodeByStoreCode(String storeCode, String agencyId, String channelId, String oldStoreCode, InvDeviceStatus status, String cardIdStart, String cardIdEnd);


@Query(" from InvwObuDetails where TO_NUMBER(obuId) >= TO_NUMBER(?1) and TO_NUMBER(obuId) <= TO_NUMBER(?2)")
List<InvwObuDetails> queryByObuIdBetween(String startId, String endId);

}

+ 5
- 0
zhywpt-app-invw/build.gradle 查看文件

@@ -24,6 +24,11 @@ dependencies {
runtimeOnly 'com.oracle.database.jdbc:ojdbc8:19.10.0.0'
runtimeOnly 'cn.easyproject:orai18n:12.1.0.2.0'

// 添加 MapStruct 核心库依赖
implementation 'org.mapstruct:mapstruct:1.5.5.Final'
// 添加 MapStruct 注解处理器依赖
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'

}

bootJar {

+ 44
- 6
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/api/enter/InvwEnterApplyController.java 查看文件

@@ -4,9 +4,7 @@ import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.common.model.dao.Pagination;
import cn.com.taiji.common.web.ApiResponse;
import cn.com.taiji.invw.api.MyValidController;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyInfoApplyRequestDTO;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyInfoApplyResponseDTO;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyPageRequestDTO;
import cn.com.taiji.invw.dto.enter.*;
import cn.com.taiji.invw.manager.enter.InvwEnterApplyManager;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -25,10 +23,10 @@ import javax.validation.Valid;
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@Api(tags = {"入库申请"})
@Api(tags = {"入库管理"})
@RestController
@RequestMapping("/api/enterApply")
public class InvwEnterApplyController extends MyValidController {
class InvwEnterApplyController extends MyValidController {

@Autowired
private InvwEnterApplyManager manager;
@@ -41,8 +39,48 @@ public class InvwEnterApplyController extends MyValidController {

@ApiOperation("入库提交申请")
@PostMapping("/apply")
public ApiResponse<InvwEnterApplyInfoApplyResponseDTO> apply(@Valid @RequestBody InvwEnterApplyInfoApplyRequestDTO dto) throws ManagerException {
public ApiResponse<InvwEnterApplyAddResponseDTO> apply(@Valid @RequestBody InvwEnterApplyAddRequestDTO dto) throws ManagerException {
return ApiResponse.of(manager.apply(dto)).setMessage("入库申请提交成功");
}

@ApiOperation("入库申请信息详情")
@PostMapping("/view")
public ApiResponse<InvwEnterApplyViewResponseDTO> view(@Valid @RequestBody InvwEnterApplyViewRequestDTO dto) throws ManagerException {
return ApiResponse.of(manager.view(dto)).setMessage("入库申请信息详情查询完成");
}

@ApiOperation("入库申请信息修改提交")
@PostMapping("/update")
public ApiResponse<InvwEnterApplyUpdateResponseDTO> update(@Valid @RequestBody InvwEnterApplyUpdateRequestDTO dto) throws ManagerException {
return ApiResponse.of(manager.update(dto)).setMessage("入库申请信息修改成功");
}


@ApiOperation("确认入库")
@PostMapping("/confirm")
public ApiResponse<InvwEnterApplyConfirmResponseDTO> confirm(@Valid @RequestBody InvwEnterApplyConfirmRequestDTO dto) throws ManagerException {
return ApiResponse.of(manager.confirm(dto)).setMessage("确认入库提交成功");
}

@ApiOperation("取消入库")
@PostMapping("/cancel")
public ApiResponse<InvwEnterApplyCancelResponseDTO> cancel(@Valid @RequestBody InvwEnterApplyCancelRequestDTO dto) throws ManagerException {
return ApiResponse.of(manager.cancel(dto)).setMessage("取消入库提交成功");
}

@ApiOperation("号段校验")
@PostMapping("/codeValid")
public ApiResponse<InvwEnterApplyCodeValidResponseDTO> codeValid(@Valid @RequestBody InvwEnterApplyCodeValidRequestDTO dto) throws ManagerException {
return ApiResponse.of(manager.codeValid(dto)).setMessage("号段校验完成");
}

@ApiOperation("解析excel获取号段")
@PostMapping("/parseExcel")
public ApiResponse<InvwEnterApplyParseExcelResponseDTO> parseExcel(@Valid @RequestBody InvwEnterApplyParseExcelRequestDTO dto) throws ManagerException {
return ApiResponse.of(manager.parseExcel(dto)).setMessage("excel数据输出完成");
}




}

+ 126
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyAddRequestDTO.java 查看文件

@@ -0,0 +1,126 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.common.pub.CollectionTools;
import cn.com.taiji.core.entity.dict.basic.CardType;
import cn.com.taiji.core.entity.dict.basic.DeviceVersion;
import cn.com.taiji.core.entity.dict.basic.ObuType;
import cn.com.taiji.core.entity.dict.invw.InventoryType;
import cn.com.taiji.core.entity.dict.invw.OwnType;
import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigInteger;
import java.util.List;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请请求")
@Getter
@Setter
public class InvwEnterApplyAddRequestDTO extends AbstractBizRequestDTO {

@ApiModelProperty(value = "仓库编号")
@NotBlank
private String storeCode;

@ApiModelProperty(value = "仓库渠道编号")
private String agencyId;

@ApiModelProperty(value = "库存类型:卡、签")
@NotNull
@Enumerated(EnumType.STRING)
private InventoryType inventoryType;

@ApiModelProperty(value = "库存型号")
@NotNull
@Enumerated(EnumType.STRING)
private DeviceVersion version;

@ApiModelProperty(value = "采购厂商")
@NotBlank
private String brand;

@ApiModelProperty(value = "卡类型")
@Enumerated(EnumType.STRING)
private CardType cardType;

@ApiModelProperty(value = "签类型")
@Enumerated(EnumType.STRING)
private ObuType obuType;

@ApiModelProperty(value = "单价")
private Long unitPrice;

@ApiModelProperty(value = "产权类型")
@NotNull
@Enumerated(EnumType.STRING)
private OwnType ownType;

@ApiModelProperty(value = "附件地址")
private String filePath;

@ApiModelProperty(value = "起始-结束号段list")
@NotNull
private List<EnterApplyDetailModel> enterApplyDetailModels;

public void valid() throws ManagerException {
if (InventoryType.CARD.equals(inventoryType)){
if (cardType == null){
throw new ManagerException("未选择卡类型");
}
for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
if (detailModel.getStartId().length() != 20 || detailModel.getEndId().length() != 20){
throw new ManagerException("卡号长度必须为20");
}
}

}else if (InventoryType.OBU.equals(inventoryType)){
if (obuType == null){
throw new ManagerException("未选择签类型");
}

for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
if (StringUtils.isEmpty(detailModel.getStartId()) || StringUtils.isEmpty(detailModel.getEndId())){
throw new ManagerException("起始或结束号段未填写完整");
}
if (detailModel.getStartId().length() != 16 || detailModel.getEndId().length() != 16){
throw new ManagerException("签号长度必须为16");
}
}

if (ObuType.SINGLE_CHIP.equals(obuType)){
if (cardType == null){
throw new ManagerException("单片式OBU时,卡类型必填");
}
for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
int obuNUm = new BigInteger(detailModel.getEndId()).subtract(new BigInteger(detailModel.getStartId())).intValueExact()+1;
int cardNUm = new BigInteger(detailModel.getEndCardId()).subtract(new BigInteger(detailModel.getStartCardId())).intValueExact()+1;
if (obuNUm != cardNUm){
throw new ManagerException("单片式OBU时,签的号段与卡的号段数量必须相同");
}
if (StringUtils.isEmpty(detailModel.getStartCardId()) || StringUtils.isEmpty(detailModel.getEndCardId())){
throw new ManagerException("单片式OBU时,卡的是的段号和结束段号必填");
}
if (detailModel.getStartCardId().length() != 20 || detailModel.getEndCardId().length() != 20){
throw new ManagerException("卡号长度必须为20");
}
}
}
}
}
}

zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyInfoApplyResponseDTO.java → zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyAddResponseDTO.java 查看文件

@@ -15,5 +15,11 @@ import lombok.Setter;
@ApiModel(description = "入库申请响应")
@Getter
@Setter
public class InvwEnterApplyInfoApplyResponseDTO extends BaseModel {
public class InvwEnterApplyAddResponseDTO extends BaseModel {

private String id;

public InvwEnterApplyAddResponseDTO(String id) {
this.id = id;
}
}

+ 31
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCancelRequestDTO.java 查看文件

@@ -0,0 +1,31 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotBlank;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "取消入库请求")
@Getter
@Setter
public class InvwEnterApplyCancelRequestDTO extends AbstractBizRequestDTO {

@ApiModelProperty(value = "申请id")
@NotBlank
private String id;

@ApiModelProperty(value = "取消理由")
@NotBlank
private String reason;

}

+ 25
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCancelResponseDTO.java 查看文件

@@ -0,0 +1,25 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "取消入库响应")
@Getter
@Setter
public class InvwEnterApplyCancelResponseDTO extends BaseModel {

private String id;

public InvwEnterApplyCancelResponseDTO(String id) {
this.id = id;
}
}

+ 99
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCodeValidRequestDTO.java 查看文件

@@ -0,0 +1,99 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.core.entity.dict.basic.CardType;
import cn.com.taiji.core.entity.dict.basic.DeviceVersion;
import cn.com.taiji.core.entity.dict.basic.ObuType;
import cn.com.taiji.core.entity.dict.invw.InventoryType;
import cn.com.taiji.core.entity.dict.invw.OwnType;
import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigInteger;
import java.util.List;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "号段校验请求")
@Getter
@Setter
public class InvwEnterApplyCodeValidRequestDTO extends AbstractBizRequestDTO {


@ApiModelProperty(value = "库存类型:卡、签")
@NotNull
@Enumerated(EnumType.STRING)
private InventoryType inventoryType;

@ApiModelProperty(value = "卡类型")
@Enumerated(EnumType.STRING)
private CardType cardType;

@ApiModelProperty(value = "签类型")
@Enumerated(EnumType.STRING)
private ObuType obuType;

@ApiModelProperty(value = "起始-结束号段list")
@NotNull
private List<EnterApplyDetailModel> enterApplyDetailModels;

public void valid() throws ManagerException {
if (InventoryType.CARD.equals(inventoryType)){
if (cardType == null){
throw new ManagerException("未选择卡类型");
}
for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
if (detailModel.getStartId().length() != 20 || detailModel.getEndId().length() != 20){
throw new ManagerException("卡号长度必须为20");
}
}

}else if (InventoryType.OBU.equals(inventoryType)){
if (obuType == null){
throw new ManagerException("未选择签类型");
}

for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
if (StringUtils.isEmpty(detailModel.getStartId()) || StringUtils.isEmpty(detailModel.getEndId())){
throw new ManagerException("起始或结束号段未填写完整");
}
if (detailModel.getStartId().length() != 16 || detailModel.getEndId().length() != 16){
throw new ManagerException("签号长度必须为16");
}
}

if (ObuType.SINGLE_CHIP.equals(obuType)){
if (cardType == null){
throw new ManagerException("单片式OBU时,卡类型必填");
}
for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
int obuNUm = new BigInteger(detailModel.getEndId()).subtract(new BigInteger(detailModel.getStartId())).intValueExact()+1;
int cardNUm = new BigInteger(detailModel.getEndCardId()).subtract(new BigInteger(detailModel.getStartCardId())).intValueExact()+1;
if (obuNUm != cardNUm){
throw new ManagerException("单片式OBU时,签的号段与卡的号段数量必须相同");
}
if (StringUtils.isEmpty(detailModel.getStartCardId()) || StringUtils.isEmpty(detailModel.getEndCardId())){
throw new ManagerException("单片式OBU时,卡的是的段号和结束段号必填");
}
if (detailModel.getStartCardId().length() != 20 || detailModel.getEndCardId().length() != 20){
throw new ManagerException("卡号长度必须为20");
}
}
}
}
}
}

+ 25
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyCodeValidResponseDTO.java 查看文件

@@ -0,0 +1,25 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "号段校验响应")
@Getter
@Setter
public class InvwEnterApplyCodeValidResponseDTO extends BaseModel {

private Boolean valid;

public InvwEnterApplyCodeValidResponseDTO(Boolean valid) {
this.valid = valid;
}
}

+ 37
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyConfirmRequestDTO.java 查看文件

@@ -0,0 +1,37 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.core.entity.dict.basic.CardType;
import cn.com.taiji.core.entity.dict.basic.DeviceVersion;
import cn.com.taiji.core.entity.dict.basic.ObuType;
import cn.com.taiji.core.entity.dict.invw.InventoryType;
import cn.com.taiji.core.entity.dict.invw.OwnType;
import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "确认入库请求")
@Getter
@Setter
public class InvwEnterApplyConfirmRequestDTO extends AbstractBizRequestDTO {

@ApiModelProperty(value = "申请id")
@NotBlank
private String id;

}

+ 25
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyConfirmResponseDTO.java 查看文件

@@ -0,0 +1,25 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "确认入库响应")
@Getter
@Setter
public class InvwEnterApplyConfirmResponseDTO extends BaseModel {

private String id;

public InvwEnterApplyConfirmResponseDTO(String id) {
this.id = id;
}
}

+ 0
- 65
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyInfoApplyRequestDTO.java 查看文件

@@ -1,65 +0,0 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.core.entity.dict.basic.CardType;
import cn.com.taiji.core.entity.dict.basic.DeviceVersion;
import cn.com.taiji.core.entity.dict.basic.ObuType;
import cn.com.taiji.core.entity.dict.invw.InventoryType;
import cn.com.taiji.core.entity.dict.invw.OwnType;
import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.Column;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请请求")
@Getter
@Setter
public class InvwEnterApplyInfoApplyRequestDTO extends AbstractBizRequestDTO {

@ApiModelProperty(value = "仓库编号")
@NotBlank
private String storeCode;

@ApiModelProperty(value = "库存类型:卡、签")
@NotNull
private InventoryType inventoryType;

@ApiModelProperty(value = "库存型号")
@NotNull
private DeviceVersion version;

@ApiModelProperty(value = "采购厂商")
@NotBlank
private String brand;

@ApiModelProperty(value = "卡类型")
private CardType cardType;

@ApiModelProperty(value = "签类型")
private ObuType obuType;

@ApiModelProperty(value = "单价")
private Long unitPrice;

@ApiModelProperty(value = "产权类型")
private OwnType ownType;

@ApiModelProperty(value = "一发系统号段申请批次号")
private String BatchNo;

@ApiModelProperty(value = "附件地址")
private String filePath;

}

+ 24
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyParseExcelRequestDTO.java 查看文件

@@ -0,0 +1,24 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请查看详情请求")
@Getter
@Setter
public class InvwEnterApplyParseExcelRequestDTO extends AbstractBizRequestDTO {

@ApiModelProperty("excel的url")
private String excelUrl;

}

+ 25
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyParseExcelResponseDTO.java 查看文件

@@ -0,0 +1,25 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.model.BaseModel;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请查看详情响应")
@Getter
@Setter
public class InvwEnterApplyParseExcelResponseDTO extends BaseModel {

private List<EnterApplyDetailModel> list;

}

+ 131
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyUpdateRequestDTO.java 查看文件

@@ -0,0 +1,131 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.core.entity.dict.basic.CardType;
import cn.com.taiji.core.entity.dict.basic.DeviceVersion;
import cn.com.taiji.core.entity.dict.basic.ObuType;
import cn.com.taiji.core.entity.dict.invw.InventoryType;
import cn.com.taiji.core.entity.dict.invw.OwnType;
import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigInteger;
import java.util.List;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请修改信息请求")
@Getter
@Setter
public class InvwEnterApplyUpdateRequestDTO extends AbstractBizRequestDTO {

@ApiModelProperty(value = "申请id")
@NotBlank
private String id;

@ApiModelProperty(value = "仓库编号")
@NotBlank
private String storeCode;

@ApiModelProperty(value = "仓库渠道编号")
private String agencyId;

@ApiModelProperty(value = "库存类型:卡、签")
@NotNull
@Enumerated(EnumType.STRING)
private InventoryType inventoryType;

@ApiModelProperty(value = "库存型号")
@NotNull
@Enumerated(EnumType.STRING)
private DeviceVersion version;

@ApiModelProperty(value = "采购厂商")
@NotBlank
private String brand;

@ApiModelProperty(value = "卡类型")
@Enumerated(EnumType.STRING)
private CardType cardType;

@ApiModelProperty(value = "签类型")
@Enumerated(EnumType.STRING)
private ObuType obuType;

@ApiModelProperty(value = "单价")
private Long unitPrice;

@ApiModelProperty(value = "产权类型")
@NotNull
@Enumerated(EnumType.STRING)
private OwnType ownType;

@ApiModelProperty(value = "附件地址")
private String filePath;

@ApiModelProperty(value = "起始-结束号段list")
@NotNull
private List<EnterApplyDetailModel> enterApplyDetailModels;


public void valid() throws ManagerException {
if (InventoryType.CARD.equals(inventoryType)){
if (cardType == null){
throw new ManagerException("未选择卡类型");
}
for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
if (detailModel.getStartId().length() != 20 || detailModel.getEndId().length() != 20){
throw new ManagerException("卡号长度必须为20");
}
}

}else if (InventoryType.OBU.equals(inventoryType)){
if (obuType == null){
throw new ManagerException("未选择签类型");
}

for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
if (StringUtils.isEmpty(detailModel.getStartId()) || StringUtils.isEmpty(detailModel.getEndId())){
throw new ManagerException("起始或结束号段未填写完整");
}
if (detailModel.getStartId().length() != 16 || detailModel.getEndId().length() != 16){
throw new ManagerException("卡号长度必须为16");
}
}

if (ObuType.SINGLE_CHIP.equals(obuType)){
if (cardType == null){
throw new ManagerException("单片式OBU时,卡类型必填");
}
for (EnterApplyDetailModel detailModel : enterApplyDetailModels) {
int obuNUm = new BigInteger(detailModel.getEndId()).subtract(new BigInteger(detailModel.getStartId())).intValueExact()+1;
int cardNUm = new BigInteger(detailModel.getEndCardId()).subtract(new BigInteger(detailModel.getStartCardId())).intValueExact()+1;
if (obuNUm != cardNUm){
throw new ManagerException("单片式OBU时,签的号段与卡的号段数量必须相同");
}
if (StringUtils.isEmpty(detailModel.getStartCardId()) || StringUtils.isEmpty(detailModel.getEndCardId())){
throw new ManagerException("单片式OBU时,卡的是的段号和结束段号必填");
}
if (detailModel.getStartCardId().length() != 20 || detailModel.getEndCardId().length() != 20){
throw new ManagerException("卡号长度必须为20");
}
}
}
}
}

}

+ 25
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyUpdateResponseDTO.java 查看文件

@@ -0,0 +1,25 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请修改信息响应")
@Getter
@Setter
public class InvwEnterApplyUpdateResponseDTO extends BaseModel {

private String id;

public InvwEnterApplyUpdateResponseDTO(String id) {
this.id = id;
}
}

+ 36
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyViewRequestDTO.java 查看文件

@@ -0,0 +1,36 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.core.entity.dict.basic.CardType;
import cn.com.taiji.core.entity.dict.basic.DeviceVersion;
import cn.com.taiji.core.entity.dict.basic.ObuType;
import cn.com.taiji.core.entity.dict.invw.InventoryType;
import cn.com.taiji.core.entity.dict.invw.OwnType;
import cn.com.taiji.invw.dto.AbstractBizRequestDTO;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请查看详情请求")
@Getter
@Setter
public class InvwEnterApplyViewRequestDTO extends AbstractBizRequestDTO {

@ApiModelProperty("申请id")
private String id;

}

+ 32
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/dto/enter/InvwEnterApplyViewResponseDTO.java 查看文件

@@ -0,0 +1,32 @@
package cn.com.taiji.invw.dto.enter;

import cn.com.taiji.common.model.BaseModel;
import cn.com.taiji.core.entity.invw.InvwEnterApply;
import cn.com.taiji.core.entity.invw.InvwEnterApplyDetails;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 16:59
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@ApiModel(description = "入库申请查看详情响应")
@Getter
@Setter
public class InvwEnterApplyViewResponseDTO extends BaseModel {

private InvwEnterApply enterApply;

private List<InvwEnterApplyDetails> applyDetailsList;

public InvwEnterApplyViewResponseDTO(InvwEnterApply enterApply, List<InvwEnterApplyDetails> applyDetailsList){
this.enterApply = enterApply;
this.applyDetailsList = applyDetailsList;
}
}

gly-base-core/src/main/java/cn/com/taiji/core/manager/comm/OperateLogManagerImpl.java → zhywpt-app-invw/src/main/java/cn/com/taiji/invw/manager/AbstractInvwManager.java 查看文件

@@ -1,4 +1,4 @@
package cn.com.taiji.core.manager.comm;
package cn.com.taiji.invw.manager;

import cn.com.taiji.common.pub.IPTools;
import cn.com.taiji.common.pub.TimeTools;
@@ -9,23 +9,20 @@ import cn.com.taiji.core.entity.user.AccountInfo;
import cn.com.taiji.core.repo.jpa.log.OperateLogRepo;
import cn.com.taiji.core.repo.jpa.user.AccountInfoRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Optional;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/19 17:15
* @Date: 2025/5/22 15:32
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@Service
public class OperateLogManagerImpl implements OperateLogManager{
public abstract class AbstractInvwManager extends AbstractCommManager{

@Autowired
private OperateLogRepo operateLogRepo;
@@ -33,14 +30,16 @@ public class OperateLogManagerImpl implements OperateLogManager{
private AccountInfoRepo accountInfoRepo;

// 操作日志记录
@Override
public void persistOperateLog(OperateType operateType, String operatorDataId, SourceType source,
String openId, String msg, String ip) {
saveOperateLog(operateType, operatorDataId, source, openId, getAccountName(openId,null), msg, ip);
protected void persistOperateLog(OperateType operateType, String operatorDataId, SourceType source,
String openId, String msg) {
saveOperateLog(operateType, operatorDataId, source, openId, getAccountName(openId), msg);
}

private void saveOperateLog(OperateType operateType, String dataId, SourceType source, String openId,
String operatorName, String msg, String ip) {
protected void saveOperateLog(OperateType operateType, String dataId, SourceType source, String openId,
String operatorName, String msg) {
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String ip = IPTools.getIpAddr(request);
LocalDateTime now = LocalDateTime.now();
OperateLog log = new OperateLog();
log.setPartKey(Long.valueOf(now.format(TimeTools.yyyyMM)));
@@ -55,15 +54,14 @@ public class OperateLogManagerImpl implements OperateLogManager{
operateLogRepo.persist(log);
}

private String getAccountName(String openId, String defaultName) {
return Optional.ofNullable(getAccountInfo(openId)).map(AccountInfo::getUserName).orElse(defaultName);
protected String getAccountName(String openId) {
return getAccountInfo(openId).getUserName();
}

private AccountInfo getAccountInfo(String openId) {
protected AccountInfo getAccountInfo(String openId) {
if (openId == null) {
return null;
}
return accountInfoRepo.findByOpenId(openId);
}

}

+ 15
- 4
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/manager/enter/InvwEnterApplyManager.java 查看文件

@@ -1,9 +1,8 @@
package cn.com.taiji.invw.manager.enter;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.common.model.dao.Pagination;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyInfoApplyRequestDTO;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyInfoApplyResponseDTO;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyPageRequestDTO;
import cn.com.taiji.invw.dto.enter.*;

/**
* @Auther: humh
@@ -16,5 +15,17 @@ public interface InvwEnterApplyManager {

Pagination page(InvwEnterApplyPageRequestDTO req);

InvwEnterApplyInfoApplyResponseDTO apply(InvwEnterApplyInfoApplyRequestDTO dto);
InvwEnterApplyAddResponseDTO apply(InvwEnterApplyAddRequestDTO dto) throws ManagerException;

InvwEnterApplyUpdateResponseDTO update(InvwEnterApplyUpdateRequestDTO dto) throws ManagerException;

InvwEnterApplyConfirmResponseDTO confirm(InvwEnterApplyConfirmRequestDTO dto) throws ManagerException;

InvwEnterApplyViewResponseDTO view(InvwEnterApplyViewRequestDTO dto);

InvwEnterApplyCancelResponseDTO cancel(InvwEnterApplyCancelRequestDTO dto);

InvwEnterApplyCodeValidResponseDTO codeValid(InvwEnterApplyCodeValidRequestDTO dto) throws ManagerException;

InvwEnterApplyParseExcelResponseDTO parseExcel(InvwEnterApplyParseExcelRequestDTO dto);
}

+ 235
- 11
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/manager/enter/InvwEnterApplyManagerImpl.java 查看文件

@@ -1,16 +1,39 @@
package cn.com.taiji.invw.manager.enter;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.common.model.dao.Pagination;
import cn.com.taiji.core.manager.comm.OperateLogManager;
import cn.com.taiji.core.manager.comm.OperateLogManagerImpl;
import cn.com.taiji.common.pub.BeanTools;
import cn.com.taiji.common.pub.CollectionTools;
import cn.com.taiji.core.entity.dict.basic.ObuType;
import cn.com.taiji.core.entity.dict.invw.InvApplyStatus;
import cn.com.taiji.core.entity.dict.invw.InvDeviceStatus;
import cn.com.taiji.core.entity.dict.invw.InventoryType;
import cn.com.taiji.core.entity.dict.log.OperateType;
import cn.com.taiji.core.entity.invw.InvwCardDetails;
import cn.com.taiji.core.entity.invw.InvwEnterApply;
import cn.com.taiji.core.entity.invw.InvwEnterApplyDetails;
import cn.com.taiji.core.entity.invw.InvwObuDetails;
import cn.com.taiji.core.repo.jpa.invw.InvwCardDetailsRepo;
import cn.com.taiji.core.repo.jpa.invw.InvwEnterApplyDetailsRepo;
import cn.com.taiji.core.repo.jpa.invw.InvwEnterApplyRepo;
import cn.com.taiji.core.repo.jpa.invw.InvwObuDetailsRepo;
import cn.com.taiji.core.repo.request.invw.InvwEnterApplyPageRequest;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyInfoApplyRequestDTO;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyInfoApplyResponseDTO;
import cn.com.taiji.invw.dto.enter.InvwEnterApplyPageRequestDTO;
import cn.com.taiji.invw.manager.AbstractCommManager;
import cn.com.taiji.invw.dto.enter.*;
import cn.com.taiji.invw.manager.AbstractInvwManager;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import cn.com.taiji.invw.tools.GenerateNoUtil;
import cn.com.taiji.invw.tools.SourceTargetMapper;
import com.alibaba.excel.EasyExcel;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.File;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
* @Auther: humh
@@ -20,24 +43,225 @@ import org.springframework.stereotype.Service;
* @version: 1.0
*/
@Service
public class InvwEnterApplyManagerImpl extends AbstractCommManager implements InvwEnterApplyManager {
public class InvwEnterApplyManagerImpl extends AbstractInvwManager implements InvwEnterApplyManager {

@Autowired
private InvwEnterApplyRepo repo;
@Autowired
private OperateLogManager operateLogManager;
private InvwEnterApplyDetailsRepo applyDetailsRepo;
@Autowired
private InvwCardDetailsRepo cardDetailsRepo;
@Autowired
private InvwObuDetailsRepo obuDetailsRepo;


@Override
public Pagination page(InvwEnterApplyPageRequestDTO req) {

InvwEnterApplyPageRequest pageRequest = copyProperties(req, new InvwEnterApplyPageRequest());
return repo.page(pageRequest);
}

@Override
public InvwEnterApplyInfoApplyResponseDTO apply(InvwEnterApplyInfoApplyRequestDTO dto) {
@Transactional(rollbackFor = Exception.class)
public InvwEnterApplyAddResponseDTO apply(InvwEnterApplyAddRequestDTO dto) throws ManagerException {
dto.valid();
//起始号段、结束号段做校验
startIdAndEndIdValid(dto.getInventoryType(), dto.getObuType(), dto.getEnterApplyDetailModels());
//申请入库
InvwEnterApply enterApply = copyProperties(dto, new InvwEnterApply());
enterApply.setApplyNo(GenerateNoUtil.generateApplyNo());
//获取总价,统计数量*单价
int sum = dto.getEnterApplyDetailModels().stream().mapToInt(o -> new BigInteger(o.getEndId()).subtract(new BigInteger(o.getStartId())).intValueExact()+1).sum();
enterApply.setApplyCount(sum);
enterApply.setTotalPrice(sum * enterApply.getUnitPrice());
LocalDateTime now = LocalDateTime.now();
enterApply.setApplyTime(now);
enterApply.setInsertTime(now);
enterApply.setApplyStatus(InvApplyStatus.NEW);
repo.save(enterApply);
//插入明细表,通过代理对象调用子方法,确保事务拦截器生效(避免同类内部调用绕过代理的问题)
addInventoryApplyDetail(dto.getEnterApplyDetailModels(), enterApply);
persistOperateLog(OperateType.ENTER_APPLY, enterApply.getId(), dto.getOrderSource(), dto.getOpenId(), "入库申请");
return new InvwEnterApplyAddResponseDTO(enterApply.getId());
}

@Override
@Transactional(rollbackFor = Exception.class)
public InvwEnterApplyUpdateResponseDTO update(InvwEnterApplyUpdateRequestDTO dto) throws ManagerException {
dto.valid();
//起始号段、结束号段做校验
startIdAndEndIdValid(dto.getInventoryType(), dto.getObuType(), dto.getEnterApplyDetailModels());
//申请入库
InvwEnterApply enterApply = repo.findById(dto.getId()).orElse(null);
BeanTools.copyProperties(dto, enterApply);
//获取总价,统计数量*单价
int sum = dto.getEnterApplyDetailModels().stream().mapToInt(o -> new BigInteger(o.getEndId()).subtract(new BigInteger(o.getStartId())).intValueExact()+1).sum();
enterApply.setApplyCount(sum);
enterApply.setTotalPrice(sum * enterApply.getUnitPrice());
LocalDateTime now = LocalDateTime.now();
enterApply.setApplyTime(now);
enterApply.setInsertTime(now);
enterApply.setApplyStatus(InvApplyStatus.NEW);
repo.merge(enterApply);
//插入明细表及检查结果表,通过代理对象调用子方法,确保事务拦截器生效(避免同类内部调用绕过代理的问题)
updateInventoryApplyDetail(dto.getEnterApplyDetailModels(), enterApply);
persistOperateLog(OperateType.UPDATE_ENTER_APPLY, enterApply.getId(), dto.getOrderSource(), dto.getOpenId(), "入库申请修改");
return new InvwEnterApplyUpdateResponseDTO(enterApply.getId());
}

@Override
@Transactional(rollbackFor = Exception.class)
public InvwEnterApplyConfirmResponseDTO confirm(InvwEnterApplyConfirmRequestDTO dto) throws ManagerException {
InvwEnterApply enterApply = repo.findById(dto.getId()).orElse(null);
List<InvwEnterApplyDetails> detailsList = applyDetailsRepo.queryByApplyNo(enterApply.getApplyNo());
//再次校验号段
startIdAndEndIdValid(enterApply.getInventoryType(),enterApply.getObuType(),SourceTargetMapper.INSTANCE.enterToApplyDetailsListModel(detailsList));
//进行入库处理,通过代理对象调用子方法,确保事务拦截器生效(避免同类内部调用绕过代理的问题)
LocalDateTime now = LocalDateTime.now();
addCardAndObuDetails(enterApply, detailsList, now);
//更新状态
enterApply.setSureTime(now);
enterApply.setApplyStatus(InvApplyStatus.COMFIRE);
repo.merge(enterApply);
persistOperateLog(OperateType.CONFIRM_ENTER_APPLY, enterApply.getId(), dto.getOrderSource(), dto.getOpenId(), "确认入库");
return new InvwEnterApplyConfirmResponseDTO(dto.getId());
}

@Override
public InvwEnterApplyViewResponseDTO view(InvwEnterApplyViewRequestDTO dto) {
InvwEnterApply enterApply = repo.findById(dto.getId()).orElse(null);
List<InvwEnterApplyDetails> applyDetailsList = applyDetailsRepo.queryByApplyNo(enterApply.getApplyNo());
return new InvwEnterApplyViewResponseDTO(enterApply, applyDetailsList);
}

@Override
@Transactional(rollbackFor = Exception.class)
public InvwEnterApplyCancelResponseDTO cancel(InvwEnterApplyCancelRequestDTO dto) {
InvwEnterApply enterApply = repo.findById(dto.getId()).orElse(null);
enterApply.setApplyStatus(InvApplyStatus.REJECT);
enterApply.setReason(dto.getReason());
repo.merge(enterApply);
persistOperateLog(OperateType.CANCEL_ENTER_APPLY, enterApply.getId(), dto.getOrderSource(), dto.getOpenId(), "取消入库");
return new InvwEnterApplyCancelResponseDTO(dto.getId());
}

@Override
public InvwEnterApplyCodeValidResponseDTO codeValid(InvwEnterApplyCodeValidRequestDTO dto) throws ManagerException {
dto.valid();
//校验
startIdAndEndIdValid(dto.getInventoryType(),dto.getObuType(),dto.getEnterApplyDetailModels());

return new InvwEnterApplyCodeValidResponseDTO(true);
}

@Override
public InvwEnterApplyParseExcelResponseDTO parseExcel(InvwEnterApplyParseExcelRequestDTO dto) {

operateLogManager.persistOperateLog(null,"",null,"","","");
return null;
}


public void addCardAndObuDetails(InvwEnterApply enterApply, List<InvwEnterApplyDetails> detailsList, LocalDateTime now) {
if (InventoryType.CARD.equals(enterApply.getInventoryType())) {
ArrayList<InvwCardDetails> cardList = Lists.newArrayList();
for (InvwEnterApplyDetails applyDetails : detailsList) {
for (int i = 0; i < new BigInteger(applyDetails.getEndId()).subtract(new BigInteger(applyDetails.getStartId())).intValueExact()+1; i++) {
InvwCardDetails cardDetails = copyProperties(enterApply, new InvwCardDetails(), "id", "insertTime");
cardDetails.setOrderNo(enterApply.getApplyNo());
cardDetails.setInsertTime(now);
cardDetails.setCardId(new BigInteger(applyDetails.getStartId()).add(BigInteger.valueOf(i)).toString());
cardDetails.setStatus(InvDeviceStatus.NEW);
cardList.add(cardDetails);
}
}
cardDetailsRepo.saveAll(cardList);
}else if (InventoryType.OBU.equals(enterApply.getInventoryType())) {
ArrayList<InvwObuDetails> obuList = Lists.newArrayList();
for (InvwEnterApplyDetails applyDetails : detailsList) {
for (int i = 0; i < new BigInteger(applyDetails.getEndId()).subtract(new BigInteger(applyDetails.getStartId())).intValueExact()+1; i++) {
InvwObuDetails obuDetails = copyProperties(enterApply, new InvwObuDetails(), "id", "insertTime");
obuDetails.setInsertTime(now);
obuDetails.setOrderNo(enterApply.getApplyNo());
obuDetails.setObuId(new BigInteger(applyDetails.getStartId()).add(BigInteger.valueOf(i)).toString());
obuDetails.setCardId(new BigInteger(applyDetails.getStartCardId()).add(BigInteger.valueOf(i)).toString());
obuDetails.setStatus(InvDeviceStatus.NEW);
obuList.add(obuDetails);
}
}
obuDetailsRepo.saveAll(obuList);
//OBU单片式处理card
if (ObuType.SINGLE_CHIP.equals(enterApply.getObuType())){
ArrayList<InvwCardDetails> cardList = Lists.newArrayList();
for (InvwEnterApplyDetails applyDetails : detailsList) {
for (int i = 0; i < new BigInteger(applyDetails.getEndCardId()).subtract(new BigInteger(applyDetails.getStartCardId())).intValueExact()+1; i++) {
InvwCardDetails cardDetails = copyProperties(enterApply, new InvwCardDetails(), "id", "insertTime");
cardDetails.setInsertTime(now);
cardDetails.setOrderNo(enterApply.getApplyNo());
cardDetails.setStatus(InvDeviceStatus.NEW);
cardDetails.setCardId(new BigInteger(applyDetails.getStartCardId()).add(BigInteger.valueOf(i)).toString());
cardList.add(cardDetails);
}
}
cardDetailsRepo.saveAll(cardList);
}
}
}

private void updateInventoryApplyDetail(List<EnterApplyDetailModel> detailModels, InvwEnterApply enterApply) throws ManagerException {
applyDetailsRepo.deleteByApplyNo(enterApply.getApplyNo());
addInventoryApplyDetail(detailModels, enterApply);
}


/**
* 入库申请明细
*
* @param detailModels
* @param enterApply
*/
@Transactional
private void addInventoryApplyDetail(List<EnterApplyDetailModel> detailModels, InvwEnterApply enterApply) {
//保存数据明细数据
List<InvwEnterApplyDetails> applyDetailEntity = SourceTargetMapper.INSTANCE.modelListToEnterApplyDetailsList(detailModels);
applyDetailEntity.forEach(s -> {
s.setApplyNo(enterApply.getApplyNo());
s.setInsertTime(enterApply.getInsertTime());
});
applyDetailsRepo.saveAll(applyDetailEntity);
}

/**
* @return
* @author: humh
* @description: 起始、结束段号校验
* @date: 2025/5/21 15:40
*/
private void startIdAndEndIdValid(InventoryType inventoryType, ObuType obuType, List<EnterApplyDetailModel> detailModels) throws ManagerException {
if (InventoryType.CARD.equals(inventoryType)) {
for (EnterApplyDetailModel detailModel : detailModels) {
List<InvwCardDetails> detailsList = cardDetailsRepo.queryByCardIdBetween(detailModel.getStartId(), detailModel.getEndId());
if (!CollectionTools.isEmpty(detailsList)) {
throw new ManagerException("卡号段已存在!");
}
}

} else if (InventoryType.OBU.equals(inventoryType)) {
if (ObuType.SINGLE_CHIP.equals(obuType)) {
for (EnterApplyDetailModel detailModel : detailModels) {
List<InvwCardDetails> detailsList = cardDetailsRepo.queryByCardIdBetween(detailModel.getStartCardId(), detailModel.getEndCardId());
if (!CollectionTools.isEmpty(detailsList)) {
throw new ManagerException("卡号段已存在!");
}
}
}
for (EnterApplyDetailModel detailModel : detailModels) {
List<InvwObuDetails> detailsList = obuDetailsRepo.queryByObuIdBetween(detailModel.getStartId(), detailModel.getEndId());
if (!CollectionTools.isEmpty(detailsList)) {
throw new ManagerException("签号段已存在!");
}
}
}
}


}

+ 30
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/model/enter/EnterApplyDetailModel.java 查看文件

@@ -0,0 +1,30 @@
package cn.com.taiji.invw.model.enter;

import cn.com.taiji.common.model.BaseModel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;

/**
* @Auther: humh
* @Description:
* @Date: 2025/5/21 10:44
* @email: huminghao@mail.taiji.com.cn
* @version: 1.0
*/
@Getter
@Setter
public class EnterApplyDetailModel extends BaseModel {

@ExcelProperty(index = 1)
private String startId; //起始编码

@ExcelProperty(index = 2)
private String endId; //结束编码

@ExcelProperty(index = 3)
private String startCardId;//单片式OBU时有值

@ExcelProperty(index = 4)
private String endCardId;//单片式OBU时有值
}

+ 19
- 0
zhywpt-app-invw/src/main/java/cn/com/taiji/invw/tools/SourceTargetMapper.java 查看文件

@@ -0,0 +1,19 @@
package cn.com.taiji.invw.tools;

import cn.com.taiji.core.entity.invw.InvwEnterApplyDetails;
import cn.com.taiji.invw.model.enter.EnterApplyDetailModel;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;

import java.util.List;

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SourceTargetMapper {
/** 通行流水 字段数量类型相同,数量少:仅能让多的转换成少的,故没有toEntity*/
SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);

List<InvwEnterApplyDetails> modelListToEnterApplyDetailsList(List<EnterApplyDetailModel> model);

List<EnterApplyDetailModel> enterToApplyDetailsListModel(List<InvwEnterApplyDetails> entity);
}

+ 2
- 0
zhywpt-app-invw/src/main/resources/bootstrap.yml 查看文件

@@ -31,6 +31,8 @@ spring:
refresh: true
- data-id: comm-client.yaml
refresh: true
- data-id: minio-client.yaml
refresh: true
server:
port: 9085
servlet:

Loading…
取消
儲存