|
@@ -10,7 +10,6 @@ import com.jsh.erp.constants.ExceptionConstants;
|
|
|
import com.jsh.erp.datasource.entities.*;
|
|
|
import com.jsh.erp.datasource.mappers.*;
|
|
|
import com.jsh.erp.datasource.vo.MaterialVoSearch;
|
|
|
-import com.jsh.erp.datasource.vo.MaterialWarnListVo;
|
|
|
import com.jsh.erp.exception.BusinessRunTimeException;
|
|
|
import com.jsh.erp.exception.JshException;
|
|
|
import com.jsh.erp.service.*;
|
|
@@ -31,7 +30,6 @@ import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.File;
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
|
|
|
@Service
|
|
@@ -74,8 +72,6 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
|
|
|
private MaterialExtendService materialExtendService;
|
|
|
@Resource
|
|
|
private SystemConfigService systemConfigService;
|
|
|
- @Resource
|
|
|
- private DepotHeadService depotHeadService;
|
|
|
|
|
|
@Value(value="${file.uploadType}")
|
|
|
private Long fileUploadType;
|
|
@@ -547,6 +543,10 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
|
|
|
//查询商品副条码相关列表
|
|
|
Map<Long, MaterialExtend> otherMaterialMap = new HashMap<>();
|
|
|
List<MaterialExtend> otherDataList = materialMapperEx.getOtherMaterialList();
|
|
|
+ for(MaterialExtend me: otherDataList) {
|
|
|
+ //遇到多个副条码的情况,只加第一个
|
|
|
+ otherMaterialMap.putIfAbsent(me.getMaterialId(), me);
|
|
|
+ }
|
|
|
String nameStr = "名称*,规格,型号,颜色,品牌,类别,基础重量(kg),基本单位*,副单位,基本条码*,副条码,比例,多属性," +
|
|
|
"采购价,零售价,销售价,最低售价,状态*,序列号,批号,自定义1,自定义2,自定义3,备注,系统sku,生产日期,保质期,供应商,商品条码,批次号,仓库名称,仓位货架";
|
|
|
List<String> nameList = StringUtil.strToStringList(nameStr);
|
|
@@ -599,9 +599,9 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
|
|
|
objs[25] = m.getProductionDate() == null ? "" : m.getProductionDate().toString();
|
|
|
objs[26] = m.getExpiryNum() == null ? "" : m.getExpiryNum().toString();
|
|
|
objs[27] = m.getSupplierId() == null ? "" : m.getSupplierId().toString();
|
|
|
- objs[28] = m.getmBarCode();
|
|
|
+ objs[28] = m.getBarCode();
|
|
|
objs[29] = m.getBatchNumber();
|
|
|
- objs[30] = m.getDepotId() == null ? "" : depotService.getDepot(m.getDepotId()).getName();
|
|
|
+ objs[30] = m.getDepotId() == null ? "" : m.getDepotId().toString();
|
|
|
objs[31] = m.getPosition();
|
|
|
//仓库期初库存
|
|
|
int i = 32;
|
|
@@ -1209,20 +1209,11 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
|
|
|
@Override
|
|
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
|
|
public void insertCurrentStockByMaterialAndDepot(Long depotId, Long mId, BigDecimal stock){
|
|
|
- //查询当前商品当前库存
|
|
|
- BigDecimal currentNumber = getCurrentStockByMaterialIdAndDepotId(mId,depotId);
|
|
|
MaterialCurrentStock materialCurrentStock = new MaterialCurrentStock();
|
|
|
materialCurrentStock.setDepotId(depotId);
|
|
|
materialCurrentStock.setMaterialId(mId);
|
|
|
materialCurrentStock.setCurrentNumber(stock);
|
|
|
- if (currentNumber == null){
|
|
|
- materialCurrentStockMapper.insertSelective(materialCurrentStock); //存入当前库存
|
|
|
- }else {
|
|
|
- //已有库存,修改当前库存
|
|
|
- currentNumber.add(materialCurrentStock.getCurrentNumber());
|
|
|
- materialCurrentStock.setCurrentNumber(currentNumber);
|
|
|
- materialCurrentStockMapper.updateByPrimaryKeySelective(materialCurrentStock);
|
|
|
- }
|
|
|
+ materialCurrentStockMapper.insertSelective(materialCurrentStock); //存入当前库存
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1625,394 +1616,6 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
|
|
|
return material;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取商品提醒
|
|
|
- */
|
|
|
- @Override
|
|
|
- public MaterialWarnListVo getMaterialWarn() {
|
|
|
- MaterialWarnListVo vo = new MaterialWarnListVo();
|
|
|
- List<String> noMovingPinReminders = new ArrayList<>();
|
|
|
- List<String> expirationReminders = new ArrayList<>();
|
|
|
- List<String> inventoryReminders = new ArrayList<>();
|
|
|
- //获取商品信息
|
|
|
- MaterialExample materialExample = new MaterialExample();
|
|
|
- materialExample.createCriteria().andDeleteFlagEqualTo("0");
|
|
|
- List<Material> materials = materialMapper.selectByExample(materialExample);
|
|
|
- //获取商品子表信息
|
|
|
- MaterialExtendExample materialExtendExample = new MaterialExtendExample();
|
|
|
- materialExtendExample.createCriteria().andDeleteFlagEqualTo("0");
|
|
|
- List<MaterialExtend> extendList = materialExtendMapper.selectByExample(materialExtendExample);
|
|
|
- //无动销提醒
|
|
|
- materials.stream().filter( v -> v.getMovingPinReminderCycle() != null)
|
|
|
- .forEach(v -> {
|
|
|
- //获取商品最后一条动销订单数据
|
|
|
- DepotHead depotHead = depotHeadService.getDepotLastByMaterialId(v.getId());
|
|
|
- if (depotHead != null){
|
|
|
- if (DateUtils.differentDaysByMillisecond(depotHead.getOperTime(),new Date()) > Integer.valueOf(v.getMovingPinReminderCycle())){
|
|
|
- //当前时间对比订单时间是否大于动销提醒周期
|
|
|
- String str = "商品名称:" + v.getName() + ",在[无动销提醒周期]内,无动销,请及时处理";
|
|
|
- noMovingPinReminders.add(str);
|
|
|
- }
|
|
|
- }else{
|
|
|
- //获取商品批次信息
|
|
|
- MaterialExtend m = materialExtendMapper.selectByMId(v.getId()).get(0);
|
|
|
- if (DateUtils.differentDaysByMillisecond(m.getCreateTime(),new Date()) > Integer.valueOf(v.getMovingPinReminderCycle())){
|
|
|
- String str = "商品名称:" + v.getName() + ",在[无动销提醒周期]内,无动销,请及时处理";
|
|
|
- noMovingPinReminders.add(str);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
- vo.setNoMovingPinReminder(noMovingPinReminders);
|
|
|
- //过期提醒
|
|
|
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
- extendList.stream().filter(v -> v.getInventory().doubleValue() > 0 && v.getProductionDate() != null && v.getExpiryNum() != null)
|
|
|
- .forEach(v ->{
|
|
|
- if (DateUtils.differentDaysByMillisecond(v.getProductionDate(),new Date()) > (v.getExpiryNum() -30)){
|
|
|
- String name = materialMapper.selectByPrimaryKey(v.getMaterialId()).getName();
|
|
|
- String str = "商品名称:" + name
|
|
|
- + ", 批次号:" + v.getBatchNumber()
|
|
|
- + ", 条码:" + v.getBarCode()
|
|
|
- + ", 生产日期:" + sdf.format(v.getProductionDate())
|
|
|
- + ", 保质期:" + v.getExpiryNum() + "天"
|
|
|
- + ", 库存:" + v.getInventory()
|
|
|
- + ",即将要过期,请及时处理";
|
|
|
- expirationReminders.add(str);
|
|
|
- }
|
|
|
- });
|
|
|
- vo.setExpirationReminder(expirationReminders);
|
|
|
- //库存提醒
|
|
|
- MaterialInitialStockExample initialStockExample = new MaterialInitialStockExample();
|
|
|
- initialStockExample.createCriteria().andDeleteFlagEqualTo("0");
|
|
|
-
|
|
|
- List<MaterialInitialStock> initialStocks = materialInitialStockMapper.selectByExample(initialStockExample);
|
|
|
- initialStocks.stream().filter(v -> v.getLowSafeStock() != null && v.getLowSafeStock().doubleValue() > 0)
|
|
|
- .forEach(v -> {
|
|
|
- //根据商品id和仓库id查询当前库存
|
|
|
- BigDecimal currentNumber = getCurrentStockByMaterialIdAndDepotId(v.getMaterialId(),v.getDepotId());
|
|
|
- if (currentNumber.doubleValue() <= v.getLowSafeStock().doubleValue()){
|
|
|
- Material material = materialMapper.selectByPrimaryKey(v.getMaterialId());
|
|
|
- String str = "商品名称:" + material.getName()
|
|
|
- + ",库存告警,请及时处理";
|
|
|
- inventoryReminders.add(str);
|
|
|
- }
|
|
|
- });
|
|
|
- vo.setInventoryReminder(inventoryReminders);
|
|
|
- return vo;
|
|
|
- }
|
|
|
-
|
|
|
- //导入表格
|
|
|
- @Override
|
|
|
- public BaseResponseInfo importExcelTwo(MultipartFile file, HttpServletRequest request) throws Exception {
|
|
|
- BaseResponseInfo info = new BaseResponseInfo();
|
|
|
- try {
|
|
|
- Long beginTime = System.currentTimeMillis();
|
|
|
- //文件扩展名只能为xls
|
|
|
- String fileName = file.getOriginalFilename();
|
|
|
- if (StringUtil.isNotEmpty(fileName)) {
|
|
|
- String fileExt = fileName.substring(fileName.indexOf(".") + 1);
|
|
|
- if (!"xls".equals(fileExt)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXTENSION_ERROR_CODE,
|
|
|
- ExceptionConstants.MATERIAL_EXTENSION_ERROR_MSG);
|
|
|
- }
|
|
|
- }
|
|
|
- Workbook workbook = Workbook.getWorkbook(file.getInputStream());
|
|
|
- Sheet src = workbook.getSheet(0);
|
|
|
- //获取真实的行数,剔除掉空白行
|
|
|
- int rightRows = ExcelUtils.getRightRows(src);
|
|
|
- List<Depot> depotList = depotService.getDepot();
|
|
|
- int depotCount = depotList.size();
|
|
|
- Map<String, Long> depotMap = parseDepotToMap(depotList);
|
|
|
- User user = userService.getCurrentUser();
|
|
|
- List<MaterialWithInitStock> mList = new ArrayList<>();
|
|
|
- //单次导入超出1000条
|
|
|
- if (rightRows > 1002) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_IMPORT_OVER_LIMIT_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_IMPORT_OVER_LIMIT_MSG));
|
|
|
- }
|
|
|
- for (int i = 2; i < rightRows; i++) {
|
|
|
- String name = ExcelUtils.getContent(src, i, 0); //名称
|
|
|
- String standard = ExcelUtils.getContent(src, i, 1); //规格
|
|
|
- String model = ExcelUtils.getContent(src, i, 2); //型号
|
|
|
- String color = ExcelUtils.getContent(src, i, 3); //颜色
|
|
|
- String brand = ExcelUtils.getContent(src, i, 4); //品牌
|
|
|
- String categoryName = ExcelUtils.getContent(src, i, 5); //类别
|
|
|
- String weight = ExcelUtils.getContent(src, i, 6); //基础重量(kg)
|
|
|
- String unit = ExcelUtils.getContent(src, i, 7); //基本单位
|
|
|
- //名称为空
|
|
|
- if (StringUtil.isEmpty(name)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NAME_EMPTY_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_NAME_EMPTY_MSG, i + 1));
|
|
|
- }
|
|
|
- //名称长度超出
|
|
|
- if (name.length() > 100) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NAME_OVER_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_NAME_OVER_MSG, i + 1));
|
|
|
- }
|
|
|
- //规格长度超出
|
|
|
- if (StringUtil.isNotEmpty(standard) && standard.length() > 100) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_STANDARD_OVER_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_STANDARD_OVER_MSG, i + 1));
|
|
|
- }
|
|
|
- //型号长度超出
|
|
|
- if (StringUtil.isNotEmpty(model) && model.length() > 100) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_MODEL_OVER_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_MODEL_OVER_MSG, i + 1));
|
|
|
- }
|
|
|
- //基本单位为空
|
|
|
- if (StringUtil.isEmpty(unit)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_UNIT_EMPTY_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_UNIT_EMPTY_MSG, i + 1));
|
|
|
- }
|
|
|
- //类别为空
|
|
|
- if (StringUtil.isEmpty(categoryName)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_Category_Name_EMPTY_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_Category_Name_EMPTY_MSG, i + 1));
|
|
|
- }
|
|
|
- MaterialWithInitStock m = new MaterialWithInitStock();
|
|
|
- //设置商品名字、规格、型号、颜色、品牌
|
|
|
- m.setName(name);
|
|
|
- m.setStandard(standard);
|
|
|
- m.setModel(model);
|
|
|
- m.setColor(color);
|
|
|
- m.setBrand(brand);
|
|
|
- //通过名称生成助记码
|
|
|
- m.setMnemonic(PinYinUtil.getFirstLettersLo(name));
|
|
|
- //通过类型名查询类型编号
|
|
|
- Long categoryId = materialCategoryService.getCategoryIdByName(categoryName);
|
|
|
- //获取类型编码
|
|
|
- Long serial_no = categoryId == null ? null : materialCategoryService.getMaterialCategory(m.getCategoryId()).getSerialNo();
|
|
|
- //设置系统sku
|
|
|
- m.setSystemSku(serial_no + DateUtils.dateTimeNow());
|
|
|
- if (null != categoryId) {
|
|
|
- m.setCategoryId(categoryId);
|
|
|
- }
|
|
|
- if (StringUtil.isNotEmpty(weight)) {
|
|
|
- //校验基础重量是否是数字(含小数)
|
|
|
- if (!StringUtil.isPositiveBigDecimal(weight)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_WEIGHT_NOT_DECIMAL_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_WEIGHT_NOT_DECIMAL_MSG, i + 1));
|
|
|
- }
|
|
|
- m.setWeight(new BigDecimal(weight));
|
|
|
- }
|
|
|
- String manyUnit = ExcelUtils.getContent(src, i, 8); //副单位
|
|
|
- String ratio = ExcelUtils.getContent(src, i, 9); //比例
|
|
|
- String sku = ExcelUtils.getContent(src, i, 10); //多属性
|
|
|
- String purchaseDecimal = ExcelUtils.getContent(src, i, 11); //采购价
|
|
|
- String commodityDecimal = ExcelUtils.getContent(src, i, 12); //零售价
|
|
|
- String wholesaleDecimal = ExcelUtils.getContent(src, i, 13); //销售价
|
|
|
- String lowDecimal = ExcelUtils.getContent(src, i, 14); //最低售价
|
|
|
- String enabled = ExcelUtils.getContent(src, i, 15); //状态
|
|
|
- String enableSerialNumber = ExcelUtils.getContent(src, i, 16); //序列号
|
|
|
- String enableBatchNumber = ExcelUtils.getContent(src, i, 17); //批号
|
|
|
- String systemSku = ExcelUtils.getContent(src, i, 18); //系统sku
|
|
|
- String productionDate = ExcelUtils.getContent(src, i, 19); //生产日期
|
|
|
- String expiryNum = ExcelUtils.getContent(src, i, 20); //保质期天数
|
|
|
- if (StringUtil.isNotEmpty(expiryNum)) {
|
|
|
- //校验保质期是否是正整数
|
|
|
- if (!StringUtil.isPositiveLong(expiryNum)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_EXPIRY_NUM_NOT_INTEGER_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_EXPIRY_NUM_NOT_INTEGER_MSG, i + 1));
|
|
|
- }
|
|
|
- //m.setExpiryNum(Integer.parseInt(expiryNum));
|
|
|
- }
|
|
|
- String supplier = ExcelUtils.getContent(src, i, 21); //供应商
|
|
|
- String barCode = ExcelUtils.getContent(src, i, 22); //商品条码
|
|
|
- String batchNumber = ExcelUtils.getContent(src, i, 23); //批次号
|
|
|
- String depotName = ExcelUtils.getContent(src, i, 24); //仓库名称
|
|
|
- String position = ExcelUtils.getContent(src, i, 25); //仓位货架
|
|
|
- String otherField1 = ExcelUtils.getContent(src, i, 26); //自定义1
|
|
|
- String otherField2 = ExcelUtils.getContent(src, i, 27); //自定义2
|
|
|
- String otherField3 = ExcelUtils.getContent(src, i, 28); //自定义3
|
|
|
- String remark = ExcelUtils.getContent(src, i, 29); //备注
|
|
|
- // m.setPosition(StringUtil.isNotEmpty(position)?position:null);
|
|
|
- //m.setMfrs(StringUtil.isNotEmpty(mfrs)?mfrs:null);
|
|
|
- m.setOtherField1(StringUtil.isNotEmpty(otherField1) ? otherField1 : null);
|
|
|
- m.setOtherField2(StringUtil.isNotEmpty(otherField2) ? otherField2 : null);
|
|
|
- m.setOtherField3(StringUtil.isNotEmpty(otherField3) ? otherField3 : null);
|
|
|
- m.setRemark(remark);
|
|
|
- //状态格式错误
|
|
|
- if (!"1".equals(enabled) && !"0".equals(enabled)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_ENABLED_ERROR_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_ENABLED_ERROR_MSG, i + 1));
|
|
|
- }
|
|
|
- //基本条码为空
|
|
|
- if (StringUtil.isEmpty(barCode)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_EMPTY_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_BARCODE_EMPTY_MSG, i + 1));
|
|
|
- }
|
|
|
- //校验基本条码长度为4到40位
|
|
|
- if (!StringUtil.checkBarCodeLength(barCode)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_LENGTH_ERROR_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_BARCODE_LENGTH_ERROR_MSG, barCode));
|
|
|
- }
|
|
|
- //批量校验excel中有无重复商品,是指名称、规格、型号、颜色、单位、多属性
|
|
|
- batchCheckExistMaterialListByParam(mList, name, standard, model, color, unit, sku);
|
|
|
- //批量校验excel中有无重复条码(1-文档自身校验,2-和数据库里面的商品校验)
|
|
|
- //batchCheckExistBarCodeByParam(mList, barCode, manyBarCode);
|
|
|
- //设置商品拓展属性
|
|
|
- JSONObject materialExObj = new JSONObject();
|
|
|
- JSONObject basicObj = new JSONObject();
|
|
|
- basicObj.put("barCode", barCode);
|
|
|
- basicObj.put("commodityUnit", unit);
|
|
|
- basicObj.put("sku", sku);
|
|
|
- basicObj.put("purchaseDecimal", purchaseDecimal);
|
|
|
- basicObj.put("commodityDecimal", commodityDecimal);
|
|
|
- basicObj.put("wholesaleDecimal", wholesaleDecimal);
|
|
|
- basicObj.put("lowDecimal", lowDecimal);
|
|
|
- materialExObj.put("basic", basicObj);
|
|
|
- if (StringUtil.isNotEmpty(manyUnit) && StringUtil.isNotEmpty(ratio)) { //多单位
|
|
|
- //校验比例是否是数字(含小数)
|
|
|
- if (!StringUtil.isPositiveBigDecimal(ratio.trim())) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_RATIO_NOT_INTEGER_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_RATIO_NOT_INTEGER_MSG, i + 1));
|
|
|
- }
|
|
|
- Long unitId = unitService.getUnitIdByParam(unit, manyUnit, new BigDecimal(ratio.trim()));
|
|
|
- if (unitId != null) {
|
|
|
- m.setUnitId(unitId);
|
|
|
- m.setUnit("");
|
|
|
- }
|
|
|
-// else {
|
|
|
-// throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_UNIT_MATE_CODE,
|
|
|
-// String.format(ExceptionConstants.MATERIAL_UNIT_MATE_MSG, manyBarCode));
|
|
|
-// }
|
|
|
- JSONObject otherObj = new JSONObject();
|
|
|
- //otherObj.put("barCode", manyBarCode);
|
|
|
- otherObj.put("commodityUnit", manyUnit);
|
|
|
- otherObj.put("purchaseDecimal", parsePrice(purchaseDecimal, ratio));
|
|
|
- otherObj.put("commodityDecimal", parsePrice(commodityDecimal, ratio));
|
|
|
- otherObj.put("wholesaleDecimal", parsePrice(wholesaleDecimal, ratio));
|
|
|
- otherObj.put("lowDecimal", parsePrice(lowDecimal, ratio));
|
|
|
- materialExObj.put("other", otherObj);
|
|
|
- } else {
|
|
|
- m.setUnit(unit);
|
|
|
- m.setUnitId(null);
|
|
|
- }
|
|
|
- m.setMaterialExObj(materialExObj);
|
|
|
- m.setEnabled("1".equals(enabled));
|
|
|
- if (StringUtil.isNotEmpty(enableSerialNumber) && "1".equals(enableSerialNumber)) {
|
|
|
- m.setEnableSerialNumber("1");
|
|
|
- } else {
|
|
|
- m.setEnableSerialNumber("0");
|
|
|
- }
|
|
|
- if (StringUtil.isNotEmpty(enableBatchNumber) && "1".equals(enableBatchNumber)) {
|
|
|
- m.setEnableBatchNumber("1");
|
|
|
- } else {
|
|
|
- m.setEnableBatchNumber("0");
|
|
|
- }
|
|
|
- if ("1".equals(enableSerialNumber) && "1".equals(enableBatchNumber)) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_ENABLE_MUST_ONE_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_ENABLE_MUST_ONE_MSG, barCode));
|
|
|
- }
|
|
|
- m.setStockMap(getStockMapCache(src, depotCount, depotMap, i));
|
|
|
- mList.add(m);
|
|
|
- }
|
|
|
- List<Long> deleteInitialStockMaterialIdList = new ArrayList<>();
|
|
|
- List<Long> deleteCurrentStockMaterialIdList = new ArrayList<>();
|
|
|
- List<MaterialInitialStock> insertInitialStockMaterialList = new ArrayList<>();
|
|
|
- List<MaterialCurrentStock> insertCurrentStockMaterialList = new ArrayList<>();
|
|
|
- //防止初始库存和当前库存出现重复
|
|
|
- Map<String, String> materialDepotInitialMap = new HashMap<>();
|
|
|
- Map<String, String> materialDepotCurrentMap = new HashMap<>();
|
|
|
- for (MaterialWithInitStock m : mList) {
|
|
|
- Long mId = 0L;
|
|
|
- //判断该商品是否存在,如果不存在就新增,如果存在就更新
|
|
|
- String basicBarCode = getBasicBarCode(m);
|
|
|
- //根据条件返回产品列表
|
|
|
- List<Material> materials = getMaterialListByParam(m.getName(), m.getStandard(), m.getModel(), m.getColor(), m.getUnit(), m.getUnitId(), basicBarCode);
|
|
|
- if (materials.size() == 0) { //产品列表为0,新增商品
|
|
|
- materialMapperEx.insertSelectiveEx(m);
|
|
|
- mId = m.getId();
|
|
|
- } else { //产品列表不为0,商品存在,修改商品属性
|
|
|
- mId = materials.get(0).getId();
|
|
|
- String materialJson = JSON.toJSONString(m);
|
|
|
- Material material = JSONObject.parseObject(materialJson, Material.class);
|
|
|
- material.setId(mId);
|
|
|
- materialMapper.updateByPrimaryKeySelective(material);
|
|
|
- //更新多单位
|
|
|
- if (material.getUnitId() == null) {
|
|
|
- materialMapperEx.setUnitIdToNull(material.getId());
|
|
|
- }
|
|
|
- //如果之前有保质期,则更新保质期
|
|
|
-// if(materials.get(0).getExpiryNum()!=null && material.getExpiryNum() == null) {
|
|
|
-// materialMapperEx.setExpiryNumToNull(material.getId());
|
|
|
-// }
|
|
|
- }
|
|
|
- //给商品新增或更新条码与价格相关信息
|
|
|
- JSONObject materialExObj = m.getMaterialExObj();
|
|
|
- insertOrUpdateMaterialExtend(materialExObj, "basic", "1", mId, user);
|
|
|
- insertOrUpdateMaterialExtend(materialExObj, "other", "0", mId, user);
|
|
|
- //给商品更新库存
|
|
|
- Map<Long, BigDecimal> stockMap = m.getStockMap();
|
|
|
- for (Depot depot : depotList) {
|
|
|
- Long depotId = depot.getId();
|
|
|
- String materialDepotKey = mId + "_" + depotId;
|
|
|
- //获取初始库存
|
|
|
- BigDecimal initStock = getInitStock(mId, depotId);
|
|
|
- //excel里面的当前库存
|
|
|
- BigDecimal stock = stockMap.get(depot.getId());
|
|
|
- //新增或更新初始库存
|
|
|
- if (stock != null && stock.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
- String basicStr = materialExObj.getString("basic");
|
|
|
- MaterialExtend materialExtend = JSONObject.parseObject(basicStr, MaterialExtend.class);
|
|
|
- if (StringUtil.isNotEmpty(materialExtend.getSku())) {
|
|
|
- throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_SKU_BEGIN_STOCK_FAILED_CODE,
|
|
|
- String.format(ExceptionConstants.MATERIAL_SKU_BEGIN_STOCK_FAILED_MSG, materialExtend.getBarCode()));
|
|
|
- }
|
|
|
- buildChangeInitialStock(deleteInitialStockMaterialIdList, insertInitialStockMaterialList, materialDepotInitialMap, mId, depotId, materialDepotKey, stock);
|
|
|
- } else {
|
|
|
- if (initStock.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
- buildChangeInitialStock(deleteInitialStockMaterialIdList, insertInitialStockMaterialList, materialDepotInitialMap, mId, depotId, materialDepotKey, stock);
|
|
|
- }
|
|
|
- }
|
|
|
- //新增或更新当前库存
|
|
|
- Long billCount = depotItemService.getCountByMaterialAndDepot(mId, depotId);
|
|
|
- if (billCount == 0) {
|
|
|
- if (stock != null && stock.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
- buildChangeCurrentStock(deleteCurrentStockMaterialIdList, insertCurrentStockMaterialList, materialDepotCurrentMap, mId, depotId, materialDepotKey, stock);
|
|
|
- } else {
|
|
|
- if (initStock.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
- buildChangeCurrentStock(deleteCurrentStockMaterialIdList, insertCurrentStockMaterialList, materialDepotCurrentMap, mId, depotId, materialDepotKey, stock);
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- BigDecimal currentNumber = getCurrentStockByMaterialIdAndDepotId(mId, depotId);
|
|
|
- //当前库存的更新:减去初始库存,再加上导入的新初始库存
|
|
|
- if (currentNumber != null && initStock != null && stock != null) {
|
|
|
- currentNumber = currentNumber.subtract(initStock).add(stock);
|
|
|
- }
|
|
|
- buildChangeCurrentStock(deleteCurrentStockMaterialIdList, insertCurrentStockMaterialList, materialDepotCurrentMap, mId, depotId, materialDepotKey, currentNumber);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //批量更新库存,先删除后新增
|
|
|
- if (insertInitialStockMaterialList.size() > 0) {
|
|
|
- batchDeleteInitialStockByMaterialList(deleteInitialStockMaterialIdList);
|
|
|
- materialInitialStockMapperEx.batchInsert(insertInitialStockMaterialList);
|
|
|
- }
|
|
|
- if (insertCurrentStockMaterialList.size() > 0) {
|
|
|
- batchDeleteCurrentStockByMaterialList(deleteCurrentStockMaterialIdList);
|
|
|
- materialCurrentStockMapperEx.batchInsert(insertCurrentStockMaterialList);
|
|
|
- }
|
|
|
- //添加日志
|
|
|
- logService.insertLog("商品",
|
|
|
- new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_IMPORT).append(mList.size()).append(BusinessConstants.LOG_DATA_UNIT).toString(),
|
|
|
- ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
|
|
|
- Long endTime = System.currentTimeMillis();
|
|
|
- logger.info("导入耗时:{}", endTime - beginTime);
|
|
|
- info.code = 200;
|
|
|
- info.data = "导入成功";
|
|
|
- } catch (BusinessRunTimeException e) {
|
|
|
- info.code = e.getCode();
|
|
|
- info.data = e.getData().get("message");
|
|
|
- } catch (Exception e) {
|
|
|
- logger.error(e.getMessage(), e);
|
|
|
- info.code = 500;
|
|
|
- info.data = "导入失败";
|
|
|
- }
|
|
|
- return info;
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public List<MaterialVo4Unit> getMaterialBySystemSku(List<String> systemSkuList) {
|
|
|
if (CollectionUtil.isEmpty(systemSkuList)){
|