소스 검색

网点旧件出库记录

FengChaoYu 8 달 전
부모
커밋
20a76c00ff

+ 16 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsOldOutRecordDTO.java

@@ -0,0 +1,16 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.plus.entity.AdminWebsit;
+import com.gree.mall.manager.plus.entity.WebsitPartsOldOutRecord;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel
+public class WebsitPartsOldOutRecordDTO extends WebsitPartsOldOutRecord {
+    @ApiModelProperty("网点")
+    AdminWebsit adminWebsit;
+}

+ 124 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsOldOutVO.java

@@ -0,0 +1,124 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class WebsitPartsOldOutVO {
+
+    @ZfireField(hide = true)
+    @ApiModelProperty("id")
+    private String id;
+
+    @ApiModelProperty("凭证号")
+    private String voucherNo;
+
+    @ApiModelProperty("申请单号")
+    private String applyNo;
+
+    @ApiModelProperty("开单备注")
+    private String remark;
+
+    @ApiModelProperty("事物类型")
+    private String objectType;
+
+    @ApiModelProperty("配件编码")
+    private String partsNumber;
+
+    @ApiModelProperty("配件名称")
+    private String partsName;
+
+    @ApiModelProperty("物料组名称")
+    private String materialGroupName;
+
+    @ApiModelProperty("单位")
+    private String goodsStockUnit;
+
+    @ApiModelProperty("单价")
+    private BigDecimal price;
+
+    @ApiModelProperty("数量")
+    private BigDecimal qty;
+
+    @ApiModelProperty("新件编码(退旧件)")
+    private String newNo;
+
+    @ApiModelProperty("原价价格")
+    private BigDecimal primaryPrice;
+
+    @ApiModelProperty("折扣价格")
+    private BigDecimal discPrice;
+
+    @ApiModelProperty("优惠价格(实收)")
+    private BigDecimal realPrice;
+
+    @ApiModelProperty("新旧差价")
+    private BigDecimal diffPrice;
+
+    @ApiModelProperty("发出单位")
+    private String sendUnit;
+
+    @ApiModelProperty("领入单位")
+    private String receiveUnit;
+
+    @ApiModelProperty("发出网点编号")
+    private String sendShopId;
+
+    @ApiModelProperty("发出网点名称")
+    private String sendShopName;
+
+    @ApiModelProperty("发出配件网点编号")
+    private String sendPartsWebsiteNumber;
+
+    @ApiModelProperty("领入网点编号")
+    private String receiveShopId;
+
+    @ApiModelProperty("领入网点名称")
+    private String receiveShopName;
+
+    @ApiModelProperty("领入配件网点编号")
+    private String receivePartsWebsiteNumber;
+
+    @ApiModelProperty("开单日期")
+    private Date orderDate;
+
+    @ApiModelProperty("系统序号")
+    private String sysNo;
+
+    @ApiModelProperty("验收日期")
+    private Date receiveDate;
+
+    @ApiModelProperty("开单人")
+    private String operateBy;
+
+    @ApiModelProperty("发出单位区域")
+    private String sendUnitArea;
+
+    @ApiModelProperty("领入单位区域")
+    private String receiveUnitArea;
+
+    @ApiModelProperty("维修自编号")
+    private String repairCustomNo;
+
+    @ApiModelProperty("导入日期")
+    private Date importDate;
+
+    @ApiModelProperty("创建人")
+    private String createBy;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("修改人")
+    private String updateBy;
+
+    @ApiModelProperty("修改时间")
+    private Date updateTime;
+}

+ 55 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitStockOutListBean.java

@@ -0,0 +1,55 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@ApiModel
+@Data
+public class WebsitStockOutListBean {
+
+    @NotBlank(message = "发出网点编号不能空")
+    @ApiModelProperty(value = "发出网点编号", required = true)
+    private String sendWebsitId;
+
+    @NotBlank(message = "发出网点名称不能空")
+    @ApiModelProperty(value = "发出网点名称", required = true)
+    private String sendWebsitName;
+
+    @ApiModelProperty("凭证号")
+    private String voucherNo;
+
+    @ApiModelProperty("申请单号")
+    private String applyNo;
+
+    @ApiModelProperty("开单备注")
+    private String remark;
+
+    @NotBlank(message = "事物类型不能空")
+    @ApiModelProperty(value = "事物类型", required = true)
+    private String objectType;
+
+    @NotBlank(message = "配件编码不能空")
+    @ApiModelProperty(value = "配件编码", required = true)
+    private String partsNumber;
+
+    @NotBlank(message = "配件名称不能空")
+    @ApiModelProperty(value = "配件名称", required = true)
+    private String partsName;
+
+    @ApiModelProperty("物料组名称")
+    private String materialGroupName;
+
+    @ApiModelProperty("单位")
+    private String goodsStockUnit;
+
+    @NotNull(message = "数量不能空")
+    @Min(value = 1, message = "数量少于0")
+    @ApiModelProperty(value = "数量", required = true)
+    private BigDecimal qty;
+}

+ 6 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/stock/WebsitStockDTO.java

@@ -96,6 +96,12 @@ public class WebsitStockDTO {
     @ApiModelProperty("采购订单号")
     private String purchaseId;
 
+    @ApiModelProperty(value = "凭证号")
+    private String voucherNo;
+
+    @ApiModelProperty(value = "申请单号")
+    private String applyNo;
+
     public WebsitStock createPartsStock() {
         WebsitStock websitStock = new WebsitStock();
         BeanUtils.copyProperties(this, websitStock);

+ 9 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java

@@ -12,6 +12,7 @@ import com.gree.mall.manager.bean.material.vender.WebsitPurchaseCheckVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderVO;
+import com.gree.mall.manager.zfire.bean.PartsParamBean;
 import com.gree.mall.manager.zfire.bean.WebsitGoodsParamBean;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import org.apache.ibatis.annotations.Param;
@@ -258,4 +259,12 @@ public interface MaterialMapper {
      * @return
      */
     IPage<WebsitPartsNewInVO> websitPartsNewInPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 旧配件出库列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitPartsOldOutVO> websitPartsOldOutPage(Page page, @Param("ex") PartsParamBean zfireParamBean);
 }

+ 136 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPartsOldOutController.java

@@ -0,0 +1,136 @@
+package com.gree.mall.manager.controller.material.manage;
+
+import cn.hutool.core.lang.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsOldOutVO;
+import com.gree.mall.manager.bean.material.manage.WebsitStockOutListBean;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.material.manage.WebsitPartsOldOutLogic;
+import com.gree.mall.manager.utils.excel.ExcelUtils;
+import com.gree.mall.manager.zfire.bean.PartsParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
+@RestController
+@Api(value = "网点旧件出库记录", tags ={"网点旧件出库记录"} )
+@RequestMapping(value = "/parts/old-out", produces = "application/json; charset=utf-8")
+public class WebsitPartsOldOutController {
+
+    @Resource
+    WebsitPartsOldOutLogic websitPartsOldOutLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation("网点旧件出库记录列表")
+    public ResponseHelper<IPage<WebsitPartsOldOutVO>> list(
+            @RequestBody PartsParamBean zfireParamBean
+    ) throws RemoteServiceException {
+        IPage<WebsitPartsOldOutVO> partsBeanIPage = websitPartsOldOutLogic.pageList(zfireParamBean);
+        return ResponseHelper.success(partsBeanIPage, new TypeReference<WebsitPartsOldOutVO>() {});
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation("网点旧件出库记录列表导出")
+    public void listExport(
+            @RequestBody PartsParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitPartsOldOutVO> stockBeanIPage = websitPartsOldOutLogic.pageList(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(stockBeanIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @ApiOperation(value = "新增网点新旧件出库记录")
+    @PostMapping("/add")
+    public ResponseHelper add(
+            @ApiParam(required = true, value = "网点出库记录") @RequestBody List<WebsitStockOutListBean> beans
+    ) throws Exception {
+        websitPartsOldOutLogic.add(beans);
+        return ResponseHelper.success();
+    }
+
+    @ApiOperation(value = "审核网点新旧件出库记录")
+    @PostMapping("/confirm")
+    public ResponseHelper confirm(
+            @ApiParam(required = true, value = "网点出库记录") @RequestBody List<String> ids
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.OLD_OUT + "add");
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("请稍候, 正在审核中");
+        }
+        try {
+            websitPartsOldOutLogic.confirm(ids);
+        } catch(Exception e) {
+            log.error("【网点旧件出库记录处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+        return ResponseHelper.success();
+    }
+
+
+    @PostMapping("/import")
+    @ApiOperation("导入网点旧件出库记录")
+    public ResponseHelper importOldOut(
+            MultipartFile file
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.OLD_OUT + "add");
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("请稍候再导入...");
+        }
+        try {
+            List<Object> objects = ExcelUtils.importExcel(file);
+            websitPartsOldOutLogic.importOldOut(objects);
+        } catch(Exception e) {
+            log.error("【网点旧件出库记录处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+        return ResponseHelper.success();
+    }
+
+    @ApiOperation(value = "删除网点旧件出库记录")
+    @PostMapping("/del")
+    public ResponseHelper delOldOut(
+            @ApiParam(required = true, value = "网点旧件出库记录id") @RequestParam List<String> ids
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.OLD_OUT + "add");
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("请稍候再操作...");
+        }
+        try {
+            websitPartsOldOutLogic.delOldOut(ids);
+        } catch(Exception e) {
+            log.error("【网点旧件出库记录处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+}

+ 6 - 2
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsAttrEnum.java

@@ -13,8 +13,12 @@ import lombok.RequiredArgsConstructor;
 public enum PartsAttrEnum implements BaseEnum {
     NEW("NEW","新件"),
     FACTORY("FACTORY","旧件返厂"),
-    OLD("OLD","旧件");
-
+    OLD("OLD","旧件"),
+    WAY("WAY", "在途"),
+    TEMP_NEW("TEMP_NEW", "临占新件"),
+    TEMP_OLD("TEMP_OLD", "临占旧件"),
+    CHANGE_NEW("CHANGE_NEW", "转销售新件"),
+    ;
     @EnumValue
     @JsonValue
     private final String key;

+ 21 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsObjectTypeEnum.java

@@ -0,0 +1,21 @@
+package com.gree.mall.manager.enums.material;
+
+import lombok.Getter;
+
+@Getter
+public enum PartsObjectTypeEnum {
+    NOT_RETURN("无件返回"),
+    NEW_REFUND("新件退库"),
+    OLD_REFUND("退旧件"),
+    ;
+
+    private final String desc;
+
+    PartsObjectTypeEnum(String desc) {
+        this.desc = desc;
+    }
+
+    public static PartsObjectTypeEnum findDescByKey(String desc) {
+        return PartsObjectTypeEnum.valueOf(desc);
+    }
+}

+ 106 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebitPartsOldStockLogic.java

@@ -0,0 +1,106 @@
+package com.gree.mall.manager.logic.material.manage;
+
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsOldOutRecordDTO;
+import com.gree.mall.manager.bean.material.stock.WebsitStockDTO;
+import com.gree.mall.manager.enums.material.DirectFlagEnum;
+import com.gree.mall.manager.enums.material.PartsAttrEnum;
+import com.gree.mall.manager.enums.material.PartsObjectTypeEnum;
+import com.gree.mall.manager.enums.material.WebsitGoodsTypeEnum;
+import com.gree.mall.manager.logic.material.stock.WebsitGoodsStockLogic;
+import com.gree.mall.manager.plus.entity.WebsitPartsOldOutRecord;
+import com.gree.mall.manager.plus.entity.WebsitPartsOldOutRecordBak;
+import com.gree.mall.manager.plus.service.WebsitPartsOldOutRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Slf4j
+public class WebitPartsOldStockLogic {
+
+    @Resource
+    WebsitGoodsStockLogic websitGoodsStockLogic;
+
+    public void oldOutStock(WebsitPartsOldOutRecordDTO oldOutRecord, WebsitPartsOldOutRecordService websitPartsOldOutRecordService, boolean isImport) throws Exception {
+        List<WebsitStockDTO> shopStockDTOS = new ArrayList<>();
+
+        // 入库注值
+        WebsitStockDTO websitStockDTO = new WebsitStockDTO();
+        websitStockDTO.setCompanyWechatId(oldOutRecord.getCompanyWechatId());
+        websitStockDTO.setCompanyWechatName(oldOutRecord.getCompanyWechatName());
+        websitStockDTO.setWebsitId(oldOutRecord.getSendWebsitId());
+        websitStockDTO.setWebsitName(oldOutRecord.getSendWebsitName());
+        websitStockDTO.setSdate(oldOutRecord.getCreateTime());
+        websitStockDTO.setPartsAttr(oldOutRecord.getObjectType().equals(PartsObjectTypeEnum.NEW_REFUND.toString()) ? PartsAttrEnum.NEW.toString() : PartsAttrEnum.OLD.toString());
+        websitStockDTO.setGoodsId(oldOutRecord.getPartsNumber());
+        websitStockDTO.setGoodsName(oldOutRecord.getPartsName());
+        websitStockDTO.setGoodsType(WebsitGoodsTypeEnum.P.getKey());
+        websitStockDTO.setVoucherNo(isImport ? oldOutRecord.getVoucherNo() : IdWorker.getTimeId());
+        websitStockDTO.setApplyNo(isImport ? oldOutRecord.getApplyNo() : IdWorker.getTimeId());
+        websitStockDTO.setPrice(oldOutRecord.getPrice());
+        websitStockDTO.setRef(oldOutRecord.getId());
+        websitStockDTO.setRefType(oldOutRecord.getObjectType());
+        websitStockDTO.setChangeQty(oldOutRecord.getQty());
+        websitStockDTO.setDirectFlag(DirectFlagEnum.SUB.getKey());
+        websitStockDTO.setRemark(oldOutRecord.getRemark());
+        websitStockDTO.setOperateBy(isImport ? oldOutRecord.getCreateBy() : oldOutRecord.getOperateBy());
+        websitStockDTO.setOperateTime(isImport ? oldOutRecord.getCreateTime() : oldOutRecord.getImportDate());
+        websitStockDTO.setObj("网点");
+        websitStockDTO.setStorageId(oldOutRecord.getStorageId());
+        shopStockDTOS.add(websitStockDTO);
+
+        // 开始处理库存
+        websitGoodsStockLogic.handleWebsitStock(shopStockDTOS);
+
+        // 库存处理完后保存记录
+        if (isImport) {
+            websitPartsOldOutRecordService.save(oldOutRecord);
+        } else {
+            websitPartsOldOutRecordService.lambdaUpdate()
+                    .set(WebsitPartsOldOutRecord::getVoucherNo, websitStockDTO.getVoucherNo())
+                    .set(WebsitPartsOldOutRecord::getApplyNo, websitStockDTO.getApplyNo())
+                    .set(WebsitPartsOldOutRecord::getOperateBy, oldOutRecord.getOperateBy())
+                    .set(WebsitPartsOldOutRecord::getImportDate, oldOutRecord.getImportDate())
+                    .set(WebsitPartsOldOutRecord::getReceiveDate, oldOutRecord.getReceiveDate())
+                    .eq(WebsitPartsOldOutRecord::getId, oldOutRecord.getId())
+                    .update();
+        }
+    }
+
+    public void delOldOutStock(WebsitPartsOldOutRecord outRecord) throws Exception {
+        // 发出
+        WebsitStockDTO sendShopStockDTO = new WebsitStockDTO();
+        sendShopStockDTO.setWebsitId(outRecord.getSendWebsitId());
+        sendShopStockDTO.setWebsitName(outRecord.getSendWebsitName());
+        sendShopStockDTO.setSdate(outRecord.getCreateTime());
+        sendShopStockDTO.setGoodsId(outRecord.getPartsNumber());
+        sendShopStockDTO.setGoodsName(outRecord.getPartsName());
+        sendShopStockDTO.setGoodsType(WebsitGoodsTypeEnum.P.getKey());
+        sendShopStockDTO.setPrice(outRecord.getPrice());
+        sendShopStockDTO.setVoucherNo(outRecord.getVoucherNo());
+        sendShopStockDTO.setApplyNo(outRecord.getApplyNo());
+        sendShopStockDTO.setRef(outRecord.getId());
+        sendShopStockDTO.setRefType(outRecord.getObjectType());
+        sendShopStockDTO.setPartsAttr(outRecord.getObjectType().equals("新件退库") ? PartsAttrEnum.NEW.getKey() : PartsAttrEnum.OLD.getKey());
+        sendShopStockDTO.setChangeQty(outRecord.getQty());
+        sendShopStockDTO.setDirectFlag(DirectFlagEnum.SUB.getKey());
+        sendShopStockDTO.setRemark(outRecord.getRemark());
+        sendShopStockDTO.setOperateBy(outRecord.getCreateBy());
+        sendShopStockDTO.setOperateTime(outRecord.getCreateTime());
+        sendShopStockDTO.setObj("网点");
+        sendShopStockDTO.setStorageId(outRecord.getStorageId());
+
+        websitGoodsStockLogic.handleWebsitStock(new ArrayList<WebsitStockDTO>(){{ this.add(sendShopStockDTO); }});
+
+        // 库存处理完后删除记录及备份
+        outRecord.deleteById();
+        WebsitPartsOldOutRecordBak partsShopOldOutRecordBak = new WebsitPartsOldOutRecordBak();
+        BeanUtils.copyProperties(outRecord, partsShopOldOutRecordBak);
+        partsShopOldOutRecordBak.insert();
+    }
+}

+ 327 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsOldOutLogic.java

@@ -0,0 +1,327 @@
+package com.gree.mall.manager.logic.material.manage;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ReUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsOldOutRecordDTO;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsOldOutVO;
+import com.gree.mall.manager.bean.material.manage.WebsitStockOutListBean;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.IsEnum;
+import com.gree.mall.manager.enums.material.NormTypeEnum;
+import com.gree.mall.manager.enums.material.PartsObjectTypeEnum;
+import com.gree.mall.manager.enums.material.WebsitGoodsTypeEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.AdminWebsit;
+import com.gree.mall.manager.plus.entity.Storage;
+import com.gree.mall.manager.plus.entity.WebsitGoods;
+import com.gree.mall.manager.plus.entity.WebsitPartsOldOutRecord;
+import com.gree.mall.manager.plus.service.*;
+import com.gree.mall.manager.utils.ValidateUtil;
+import com.gree.mall.manager.zfire.bean.PartsParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WebsitPartsOldOutLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitPartsOldOutRecordService websitPartsOldOutRecordService;
+    private final AdminWebsitService adminWebsitService;
+    private final WebsitGoodsService websitGoodsService;
+    private final WebitPartsOldStockLogic webitPartsOldStockLogic;
+    private final StorageService storageService;
+    private final WebsitPartsOldOutRecordBakService websitPartsOldOutRecordBakService;
+
+
+    public IPage<WebsitPartsOldOutVO> pageList(PartsParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitPartsOldOutVO.class, adminUser);
+        IPage<WebsitPartsOldOutVO> page = materialMapper.websitPartsOldOutPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+        return page;
+    }
+
+    public void add(List<WebsitStockOutListBean> beans) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        if (adminUser.getType() != 0) {
+            throw new RuntimeException("非网点账号不能添加");
+        }
+
+        final List<AdminWebsit> websitList = adminWebsitService.lambdaQuery()
+                .in(AdminWebsit::getWebsitId, adminUser.getAdminWebsitIds())
+                .isNotNull(AdminWebsit::getPartsWebsitId)
+                .list();
+
+        Map<String, AdminWebsit> websitMap = websitList.stream()
+                .collect(Collectors.toMap(AdminWebsit::getPartsWebsitId, Function.identity()));
+
+        final List<Storage> storageList = storageService.lambdaQuery()
+                .eq(Storage::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                .in(Storage::getWebsitId, adminUser.getAdminWebsitIds())
+                .eq(Storage::getIsDefault, IsEnum.Y.getValue())
+                .list();
+
+        Map<String, Storage> storageMap = storageList.stream()
+                .collect(Collectors.toMap(Storage::getWebsitId, Function.identity()));
+
+        if (CollectionUtil.isNotEmpty(beans)) {
+            List<WebsitPartsOldOutRecord> recordList = new ArrayList<>();
+            for (WebsitStockOutListBean bean : beans) {
+                ValidateUtil.validate(bean);
+                final AdminWebsit websit = websitMap.get(bean.getSendWebsitId());
+                final Storage storage = storageMap.get(websit.getWebsitId());
+
+                WebsitPartsOldOutRecord record = new WebsitPartsOldOutRecord();
+                record.setId(IdWorker.getIdStr())
+                        .setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                        .setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName())
+                        .setId(IdWorker.getIdStr())
+                        .setSysNo(record.getId())
+                        .setVoucherNo(bean.getVoucherNo())
+                        .setApplyNo(bean.getApplyNo())
+                        .setRemark(bean.getRemark())
+                        .setObjectType(bean.getObjectType())
+                        .setPartsNumber(bean.getPartsNumber())
+                        .setPartsName(bean.getPartsName())
+                        .setMaterialGroupName(bean.getMaterialGroupName())
+                        .setGoodsStockUnit(bean.getGoodsStockUnit())
+                        .setQty(bean.getQty())
+                        .setSendWebsitId(bean.getSendWebsitId())
+                        .setSendWebsitName(bean.getSendWebsitName())
+                        .setOrderDate(DateUtil.date())
+                        .setStorageId(storage.getStorageId())
+                        .setStorageName(storage.getStorageName());
+                recordList.add(record);
+            }
+            websitPartsOldOutRecordService.saveBatch(recordList);
+        }
+    }
+
+    @Transactional
+    public void importOldOut(List<Object> objects) {
+        if (objects.size() > 0) {
+            // 注入对象
+            List<WebsitPartsOldOutRecordDTO> oldOutRecordDTOList = this.handleOldOutRecordObj(objects);
+            for (int i = 0; i < oldOutRecordDTOList.size(); i++) {
+                WebsitPartsOldOutRecordDTO oldOutRecord = oldOutRecordDTOList.get(i);
+                Integer count = websitPartsOldOutRecordService.lambdaQuery()
+                        .eq(WebsitPartsOldOutRecord::getSysNo, oldOutRecord.getSysNo())
+                        .count();
+                if (count > 0) {
+                    // 已经处理过的系统序号就跳过
+                    continue;
+                }
+                try {
+                    webitPartsOldStockLogic.oldOutStock(oldOutRecord, websitPartsOldOutRecordService, true);
+                } catch (Exception e) {
+                    throw new RemoteServiceException("第" + (i+2) + "行,“" + oldOutRecord.getVoucherNo() + "”处理库存时出错,原因:" + e.getMessage());
+                }
+            }
+        }
+    }
+
+    private List<WebsitPartsOldOutRecordDTO> handleOldOutRecordObj(List<Object> objects) {
+        DateTime curDate = DateUtil.date();
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+
+        final List<AdminWebsit> websitList = adminWebsitService.lambdaQuery()
+                .in(AdminWebsit::getWebsitId, adminUser.getAdminWebsitIds())
+                .isNotNull(AdminWebsit::getPartsWebsitId)
+                .list();
+
+        Map<String, AdminWebsit> websitMap = websitList.stream()
+                .collect(Collectors.toMap(AdminWebsit::getPartsWebsitId, Function.identity()));
+
+        // 查询配件资料
+        final List<WebsitGoods> partsList = websitGoodsService.lambdaQuery()
+                .eq(WebsitGoods::getGoodsCode, objects.stream()
+                        .map(v -> (Optional.ofNullable(((List<Object>) v).get(4))).orElse(""))
+                        .collect(Collectors.toSet()))
+                .eq(WebsitGoods::getGoodsType, WebsitGoodsTypeEnum.P.getKey())
+                .eq(WebsitGoods::getNormType, NormTypeEnum.M.getKey())
+                .list();
+
+        Map<String, WebsitGoods> partsMap = partsList.stream()
+                .collect(Collectors.toMap(WebsitGoods::getGoodsCode, Function.identity()));
+
+        final List<Storage> storageList = storageService.lambdaQuery()
+                .eq(Storage::getCompanyWechatId, adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                .in(Storage::getWebsitId, adminUser.getAdminWebsitIds())
+                .eq(Storage::getIsDefault, IsEnum.Y.getValue())
+                .list();
+
+        Map<String, Storage> storageMap = storageList.stream()
+                .collect(Collectors.toMap(Storage::getWebsitId, Function.identity()));
+
+        List<WebsitPartsOldOutRecordDTO> oldOutRecordDTOS = new ArrayList<>();
+        for (int i = 1; i < objects.size(); i++) {
+            List<Object> row = (List<Object>) objects.get(i);
+            String voucherNo = (String) row.get(0);
+            String applyNo = (String) row.get(1);
+            String remark = (String) row.get(2);
+            String objectType = (String) row.get(3);
+            String partsNumber = (String) row.get(4);
+            String priceStr = (String) row.get(7);
+            String qtyStr = (String) row.get(8);
+            String newNo = (String) row.get(9);
+            String primaryPriceStr = (String) row.get(10);
+            String discPriceStr = (String) row.get(11);
+            String realPriceStr = (String) row.get(12);
+            String diffPriceStr = (String) row.get(13);
+            String sendUnit = (String) row.get(14);
+            String receiveUnit = (String) row.get(15);
+            String orderDateStr = (String) row.get(16);
+            String sysNo = (String) row.get(17);
+            String receiveDate = (String) row.get(18);
+            String operateBy = (String) row.get(19);
+            String sendUnitArea = (String) row.get(20);
+            String receiveUnitArea = (String) row.get(21);
+            String repairCustomNo = (String) row.get(22);
+            PartsObjectTypeEnum objectTypeEnum = PartsObjectTypeEnum.findDescByKey(objectType);
+            if (StringUtils.isBlank(objectType) || Objects.isNull(objectTypeEnum)) {
+                throw new RemoteServiceException("第" + (i+2) + "行,事物类型格式不符,只能是“退旧件,无件返回,新件退库”");
+            }
+            if (StringUtils.isBlank(voucherNo)) {
+                throw new RemoteServiceException("第" + (i+2) + "行,凭证号不能为空");
+            }
+            if (StringUtils.isBlank(partsNumber)) {
+                throw new RemoteServiceException("第" + (i+2) + "行,配件编码不能为空");
+            }
+            if (StringUtils.isBlank(sendUnit) || sendUnit.indexOf(":") <= 0) {
+                throw new RemoteServiceException("第" + (i+2) + "行,发出单位格式不符");
+            }
+            if (StringUtils.isBlank(orderDateStr) || !ReUtil.isMatch("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{1,2}:\\d{1,2}", orderDateStr)) {
+                throw new RemoteServiceException("第" + (i+1) + "行,开单日期格式不符,正确格式:yyyy-MM-dd HH:mm:ss");
+            }
+            String sendUnitNumber = sendUnit.split(":")[0];
+            AdminWebsit sendShop = websitMap.get(sendUnitNumber);
+            WebsitGoods parts = partsMap.get(partsNumber);
+            if (Objects.isNull(sendShop)) {
+                throw new RemoteServiceException("第" + (i+2) + "行,发出单位未配置");
+            }
+            if (Objects.isNull(parts)) {
+                throw new RemoteServiceException("第" + (i+2) + "行,配件编码未配置");
+            }
+            if (StringUtils.isBlank(sysNo)) {
+                throw new RemoteServiceException("第" + (i+2) + "行,系统序号不能为空");
+            }
+            final Storage storage = storageMap.get(sendShop.getWebsitId());
+
+            WebsitPartsOldOutRecordDTO partsShopOldOutRecordDTO = new WebsitPartsOldOutRecordDTO();
+            partsShopOldOutRecordDTO.setId(IdWorker.getIdStr())
+                    .setCompanyWechatId(adminUser.getAdminCompanyWechat().getCompanyWechatId())
+                    .setCompanyWechatName(adminUser.getAdminCompanyWechat().getCompanyName())
+                    .setVoucherNo(voucherNo)
+                    .setApplyNo(applyNo)
+                    .setRemark(remark)
+                    .setObjectType(objectTypeEnum.toString())
+                    .setPartsNumber(partsNumber)
+                    .setPartsName(parts.getGoodsName())
+                    .setGoodsStockUnit(parts.getGoodsStockUnit())
+                    .setPrice(new BigDecimal(StringUtils.isNotBlank(priceStr) ? priceStr : "0"))
+                    .setQty(new BigDecimal(StringUtils.isNotBlank(qtyStr) ? qtyStr : "0"))
+                    .setNewNo(newNo)
+                    .setPrimaryPrice(new BigDecimal(StringUtils.isNotBlank(primaryPriceStr) ? primaryPriceStr : "0"))
+                    .setDiscPrice(new BigDecimal(StringUtils.isNotBlank(discPriceStr) ? discPriceStr : "0"))
+                    .setRealPrice(new BigDecimal(StringUtils.isNotBlank(realPriceStr) ? realPriceStr : "0"))
+                    .setDiffPrice(new BigDecimal(StringUtils.isNotBlank(diffPriceStr) ? diffPriceStr : "0"))
+                    .setSendUnit(sendUnit)
+                    .setReceiveUnit(receiveUnit)
+                    .setSendWebsitId(sendShop.getWebsitId())
+                    .setSendWebsitName(sendShop.getName())
+                    .setReceiveWebsitId("")
+                    .setReceiveWebsitName("")
+                    .setOrderDate(StringUtils.isNotBlank(orderDateStr) ? DateUtil.parseDateTime(orderDateStr) : null)
+                    .setSysNo(sysNo)
+                    .setReceiveDate(StringUtils.isNotBlank(receiveDate) ? DateUtil.parseDate(receiveDate) : DateUtil.date())
+                    .setOperateBy(operateBy)
+                    .setSendUnitArea(sendUnitArea)
+                    .setReceiveUnitArea(receiveUnitArea)
+                    .setRepairCustomNo(repairCustomNo)
+                    .setImportDate(curDate)
+                    .setStorageId(storage.getStorageId())
+                    .setStorageName(storage.getStorageName());
+            partsShopOldOutRecordDTO.setAdminWebsit(sendShop);
+            oldOutRecordDTOS.add(partsShopOldOutRecordDTO);
+        }
+
+        return oldOutRecordDTOS;
+    }
+
+    @Transactional
+    public void confirm(List<String> ids) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        if (adminUser.getType() == 2) {
+            throw new RuntimeException("网点账号不能审核");
+        }
+        List<WebsitPartsOldOutRecord> recordList = websitPartsOldOutRecordService.listByIds(ids);
+        if (CollectionUtil.isNotEmpty(recordList)) {
+            Date curDate = DateUtil.date();
+            int i = 1;
+
+            Map<String, AdminWebsit> websitMap = adminWebsitService.lambdaQuery()
+                    .in(AdminWebsit::getWebsitId, recordList.stream().map(WebsitPartsOldOutRecord::getSendWebsitId).distinct().collect(Collectors.toList()))
+                    .list()
+                    .stream()
+                    .collect(Collectors.toMap(AdminWebsit::getWebsitId, Function.identity()));
+
+            for (WebsitPartsOldOutRecord partsShopOldOutRecord : recordList) {
+                try {
+                    WebsitPartsOldOutRecordDTO oldOutRecord = new WebsitPartsOldOutRecordDTO();
+                    BeanUtils.copyProperties(partsShopOldOutRecord, oldOutRecord);
+                    oldOutRecord.setReceiveDate(curDate);
+                    oldOutRecord.setImportDate(curDate);
+                    oldOutRecord.setOperateBy(adminUser.getNickName());
+                    oldOutRecord.setAdminWebsit(websitMap.get(oldOutRecord.getSendWebsitId()));
+                    webitPartsOldStockLogic.oldOutStock(oldOutRecord, websitPartsOldOutRecordService, false);
+                } catch (Exception e) {
+                    throw new RemoteServiceException("第" + (i) + "条,“" + partsShopOldOutRecord.getSysNo() + "”处理库存时出错,原因:" + e.getMessage());
+                }
+                i++;
+            }
+        }
+    }
+
+    @Transactional
+    public void delOldOut(List<String> ids) throws Exception {
+        if (CollectionUtil.isEmpty(ids)) {
+            return;
+        }
+        List<WebsitPartsOldOutRecord> partsTransRecordList = websitPartsOldOutRecordService.lambdaQuery()
+                .in(WebsitPartsOldOutRecord::getId, ids)
+                .list();
+        if (CollectionUtil.isEmpty(partsTransRecordList)) {
+            return;
+        }
+        for (WebsitPartsOldOutRecord partsShopOldOutRecord : partsTransRecordList) {
+            if (Objects.nonNull(partsShopOldOutRecord.getImportDate())) {
+                webitPartsOldStockLogic.delOldOutStock(partsShopOldOutRecord);
+            } else {
+                partsShopOldOutRecord.deleteById();
+            }
+        }
+    }
+}

+ 2 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/stock/WebitPurchaseStockLogic.java

@@ -169,6 +169,8 @@ public class WebitPurchaseStockLogic {
             websitStockDTO.setWebsitName(inRecord.getReceiveWebsitName());
             websitStockDTO.setSdate(inRecord.getCreateTime());
             websitStockDTO.setPartsAttr(PartsAttrEnum.NEW.toString());
+            websitStockDTO.setVoucherNo(inRecord.getVoucherNo());
+            websitStockDTO.setApplyNo(inRecord.getVoucherNo());
             websitStockDTO.setGoodsId(inRecord.getPartsNumber());
             websitStockDTO.setGoodsName(inRecord.getPartsName());
             websitStockDTO.setGoodsType(WebsitGoodsTypeEnum.P.getKey());

+ 22 - 0
mall-server-api/src/main/resources/mapper/MaterialMapper.xml

@@ -521,4 +521,26 @@
         </if>
         ${ex.orderBy}
     </select>
+
+    <select id="websitPartsOldOutPage"
+            resultType="com.gree.mall.manager.bean.material.manage.WebsitPartsOldOutVO">
+        SELECT
+            ${ex.selected}
+        FROM
+            websit_parts_old_out_record a
+        ${ex.query}
+        <if test="ex.receiveDate != null">
+            AND a.receive_date IS NULL
+        </if>
+        <if test="ex.adminWebsitIds != null and ex.adminWebsitIds.size > 0">
+            AND a.send_websit_id IN
+            <foreach item="item" index="index" collection="ex.adminWebsitIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
 </mapper>