Kaynağa Gözat

Merge branch 'master_huangjunjie' of http://121.40.253.172:3000/pengyue/jsh_erp into master_liaozeyong

# Conflicts:
#	src/main/java/com/jsh/erp/service/MaterialExtendService.java
廖泽勇 4 gün önce
ebeveyn
işleme
095a218e47

+ 1 - 0
src/main/java/com/jsh/erp/controller/DepotItemController.java

@@ -280,6 +280,7 @@ public class DepotItemController {
                     item.put("inventory",diEx.getInventory());
                     item.put("supplierName",diEx.getSupplierName());
                     item.put("unitId",diEx.getUnitId());
+                    item.put("unitList",diEx.getUnitId() == null ? null : unitService.getUnitListByID(diEx.getUnitId()));
                     item.put("actualQuantityInStorage",diEx.getActualQuantityInStorage());
                     item.put("warehousingVariance",diEx.getWarehousingVariance());
                     item.put("reasonOfDifference",diEx.getReasonOfDifference());

+ 0 - 2
src/main/java/com/jsh/erp/controller/MaterialController.java

@@ -356,8 +356,6 @@ public class MaterialController extends BaseController {
                     item.put("sku", material.getSku());
                     item.put("enableSerialNumber", material.getEnableSerialNumber());
                     item.put("enableBatchNumber", material.getEnableBatchNumber());
-//                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-//                    String date = material.getProductionDate() == null ? null : sdf.format(material.getProductionDate());
                     item.put("productionDate",material.getProductionDate());
                     item.put("expiryNum",material.getExpiryNum());
                     item.put("batchNumber",material.getBatchNumber());

+ 1 - 1
src/main/java/com/jsh/erp/controller/MaterialExtendController.java

@@ -112,7 +112,7 @@ public class MaterialExtendController {
                     item.put("expiryNum",md.getExpiryNum());
                     item.put("supplierId",md.getSupplierId());
                     item.put("barCode",md.getBarCode());
-                    item.put("batchNumber",md.getBrandName());
+                    item.put("batchNumber",md.getBatchNumber());
                     item.put("inventory",md.getInventory());
                     item.put("depotId",md.getDepotId());
                     item.put("position",md.getPosition());

+ 1 - 1
src/main/java/com/jsh/erp/controller/SystemConfigController.java

@@ -201,7 +201,7 @@ public class SystemConfigController extends BaseController {
                 }
                 if(StringUtil.isNotEmpty(savePath)){
                     res.code = 200;
-                    res.data = savePath;
+                    res.data = "http://192.168.2.112:8085/image/" + savePath;
                 }else {
                     res.code = 500;
                     res.data = "上传失败!";

+ 17 - 0
src/main/java/com/jsh/erp/controller/UnitController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.jsh.erp.base.BaseController;
 import com.jsh.erp.base.TableDataInfo;
 import com.jsh.erp.datasource.entities.Unit;
+import com.jsh.erp.datasource.vo.UnitListVo;
 import com.jsh.erp.service.UnitService;
 import com.jsh.erp.utils.*;
 import io.swagger.annotations.Api;
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -147,4 +150,18 @@ public class UnitController extends BaseController {
             return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
         }
     }
+
+    /**
+     * 根据单位id获取单位集合
+     */
+    @GetMapping(value = "/getUnitListByID")
+    @ApiOperation(value = "根据单位id获取单位集合")
+    public BaseResponseInfo getUnitListByID(Long id) throws Exception {
+        BaseResponseInfo res = new BaseResponseInfo();
+        res.code = 200;
+        res.data = unitService.getUnitListByID(id);
+        return res;
+    }
+
+
 }

+ 8 - 0
src/main/java/com/jsh/erp/datasource/entities/MaterialCurrentStock.java

@@ -1,7 +1,15 @@
 package com.jsh.erp.datasource.entities;
 
+import lombok.Data;
+import lombok.experimental.Accessors;
+
 import java.math.BigDecimal;
 
+/**
+ * 产品当前库存表实体类
+ */
+@Data
+@Accessors(chain = true)
 public class MaterialCurrentStock {
     private Long id;
 

+ 18 - 0
src/main/java/com/jsh/erp/datasource/entities/MaterialInitialStock.java

@@ -1,22 +1,40 @@
 package com.jsh.erp.datasource.entities;
 
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
 import java.math.BigDecimal;
 
+/**
+ * 产品初始库存表实体类
+ */
+@Data
+@Accessors(chain = true)
 public class MaterialInitialStock {
+
+    @ApiModelProperty("主键id")
     private Long id;
 
+    @ApiModelProperty("产品id")
     private Long materialId;
 
+    @ApiModelProperty("仓库id")
     private Long depotId;
 
+    @ApiModelProperty("初始库存数量")
     private BigDecimal number;
 
+    @ApiModelProperty("最低库存数量")
     private BigDecimal lowSafeStock;
 
+    @ApiModelProperty("最高库存数量")
     private BigDecimal highSafeStock;
 
+    @ApiModelProperty("租户id")
     private Long tenantId;
 
+    @ApiModelProperty("删除标记,0未删除,1删除")
     private String deleteFlag;
 
     public Long getId() {

+ 7 - 0
src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java

@@ -1,13 +1,17 @@
 package com.jsh.erp.datasource.entities;
 
+import com.jsh.erp.datasource.vo.UnitListVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.List;
 
 @Data
+@Accessors(chain = true)
 public class MaterialVo4Unit extends Material{
 
 
@@ -112,6 +116,9 @@ public class MaterialVo4Unit extends Material{
     @ApiModelProperty("出入库时间")
     private Date warehousingTime;
 
+    @ApiModelProperty("多单位集合")
+    private List<UnitListVo> unitList;
+
     public String getUnitName() {
         return unitName;
     }

+ 2 - 1
src/main/java/com/jsh/erp/datasource/mappers/MaterialExtendMapper.java

@@ -1,11 +1,12 @@
 package com.jsh.erp.datasource.mappers;
 
+import com.jsh.erp.datasource.entities.Material;
 import com.jsh.erp.datasource.entities.MaterialExtend;
 import com.jsh.erp.datasource.entities.MaterialExtendExample;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
 
-public interface MaterialExtendMapper {
+public interface MaterialExtendMapper extends BaseMapperX<MaterialExtend>{
     long countByExample(MaterialExtendExample example);
 
     int deleteByExample(MaterialExtendExample example);

+ 5 - 0
src/main/java/com/jsh/erp/service/DepotHeadService.java

@@ -128,6 +128,11 @@ public interface DepotHeadService extends IService<DepotHead> {
 
     List<DepotHead> getBillListByLinkNumber(String linkNumber)throws Exception;
 
+    /**
+     * 新增单据主表及单据子表信息
+     * @param beanJson 主表信息
+     * @param rows  子表信息
+     */
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
     void addDepotHeadAndDetail(String beanJson, String rows,
                                HttpServletRequest request) throws Exception;

+ 6 - 0
src/main/java/com/jsh/erp/service/DepotItemService.java

@@ -75,6 +75,12 @@ public interface DepotItemService extends IService<DepotItem> {
 
     List<InOutPriceVo> inOrOutPriceList(String beginTime, String endTime) throws Exception;
 
+    /**
+     * 保存单据子表信息
+     * @param rows 子表信息
+     * @param headerId  主表id
+     * @param actionType    操作类型
+     */
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
     void saveDetials(String rows, Long headerId, String actionType, HttpServletRequest request) throws Exception;
 

+ 19 - 507
src/main/java/com/jsh/erp/service/MaterialExtendService.java

@@ -1,543 +1,55 @@
 package com.jsh.erp.service;
 
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.jsh.erp.constants.BusinessConstants;
-import com.jsh.erp.constants.ExceptionConstants;
-import com.jsh.erp.datasource.entities.MaterialCurrentStock;
 import com.jsh.erp.datasource.entities.MaterialExtend;
-import com.jsh.erp.datasource.entities.MaterialExtendExample;
-import com.jsh.erp.datasource.entities.User;
-import com.jsh.erp.datasource.mappers.MaterialExtendMapper;
-import com.jsh.erp.datasource.mappers.MaterialExtendMapperEx;
 import com.jsh.erp.datasource.vo.MaterialExtendVo4List;
-import com.jsh.erp.exception.BusinessRunTimeException;
-import com.jsh.erp.exception.JshException;
-import com.jsh.erp.utils.DateUtils;
-import com.jsh.erp.utils.RandomHelper;
-import com.jsh.erp.utils.StringUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
-import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
+public interface MaterialExtendService {
+    MaterialExtend getMaterialExtend(long id)throws Exception;
 
-@Service
-public class MaterialExtendService {
-    private Logger logger = LoggerFactory.getLogger(MaterialExtendService.class);
+    List<MaterialExtendVo4List> getDetailList(Long materialId);
 
-    @Resource
-    private MaterialExtendMapper materialExtendMapper;
-    @Resource
-    private MaterialExtendMapperEx materialExtendMapperEx;
-    @Resource
-    private UserService userService;
-    @Resource
-    private RedisService redisService;
-    
-    public MaterialExtend getMaterialExtend(long id)throws Exception {
-        MaterialExtend result=null;
-        try{
-            result=materialExtendMapper.selectByPrimaryKey(id);
-        }catch(Exception e){
-            JshException.readFail(logger, e);
-        }
-        return result;
-    }
+    List<MaterialExtend> getListByMIds(List<Long> idList);
 
-    /**
-     * 根据产品id查询产品价格拓展信息
-     * @param materialId 产品id
-     */
-    public List<MaterialExtendVo4List> getDetailList(Long materialId) {
-        List<MaterialExtendVo4List> list=null;
-        try{
-            list = materialExtendMapperEx.getDetailList(materialId);
-        }catch(Exception e){
-            JshException.readFail(logger, e);
-        }
-        return list;
-    }
-
-    public List<MaterialExtend> getListByMIds(List<Long> idList) {
-        List<MaterialExtend> meList = null;
-        try{
-            Long [] idArray= StringUtil.listToLongArray(idList);
-            if(idArray!=null && idArray.length>0) {
-                meList = materialExtendMapperEx.getListByMId(idArray);
-            }
-        }catch(Exception e){
-            JshException.readFail(logger, e);
-        }
-        return meList;
-    }
-
-    /**
-     * 保存产品拓展记录
-     * @param obj
-     * @param sortList
-     * @param materialId
-     * @param type
-     * @return
-     * @throws Exception
-     */
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public String saveDetials(JSONObject obj, String sortList, Long materialId, String type) throws Exception {
-        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-        //获取商品拓展行参数集合
-        JSONArray meArr = obj.getJSONArray("meList");
-        //添加商品拓展集合
-        JSONArray insertedJson = new JSONArray();
-        //修改商品拓展集合
-        JSONArray updatedJson = new JSONArray();
-        //移除商品集合
-        JSONArray deletedJson = obj.getJSONArray("meDeleteIdList");
-
-        JSONArray sortJson = JSONArray.parseArray(sortList);
-        //添加/修改行数据处理
-        if (null != meArr) {
-            if("insert".equals(type)){
-                for (int i = 0; i < meArr.size(); i++) {
-                    JSONObject tempJson = meArr.getJSONObject(i);
-                    insertedJson.add(tempJson);
-                }
-            } else if("update".equals(type)){
-                for (int i = 0; i < meArr.size(); i++) {
-                    JSONObject tempJson = meArr.getJSONObject(i);
-                    String tempId = tempJson.getString("id");
-                    if(tempId.length()>19){
-                        //id长度大于19,属于新增数据
-                        insertedJson.add(tempJson);
-                    } else {
-                        updatedJson.add(tempJson);
-                    }
-                }
-            }
-        }
-        //删除行数据处理
-        if (null != deletedJson && deletedJson.size()>0) {
-            StringBuffer bf=new StringBuffer();
-            for (int i = 0; i < deletedJson.size(); i++) {
-                bf.append(deletedJson.getString(i));
-                if(i<(deletedJson.size()-1)){
-                    bf.append(",");
-                }
-            }
-            //删除拓展行
-            this.batchDeleteMaterialExtendByIds(bf.toString(), request);
-        }
-
-        //添加拓展行
-        if (null != insertedJson) {
-            for (int i = 0; i < insertedJson.size(); i++) {
-                //商品拓展
-                MaterialExtend materialExtend = new MaterialExtend();
-                JSONObject tempInsertedJson = JSONObject.parseObject(insertedJson.getString(i));
-                //设置商品id
-                materialExtend.setMaterialId(materialId);
-                //设置条形码
-//                if (StringUtils.isNotEmpty(tempInsertedJson.getString("barCode"))) {
-//                    int exist = checkIsBarCodeExist(0L, tempInsertedJson.getString("barCode"));
-//                    if(exist>0) {
-//                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_EXISTS_CODE,
-//                                String.format(ExceptionConstants.MATERIAL_BARCODE_EXISTS_MSG,tempInsertedJson.getString("barCode")));
-//                    } else {
-//                        materialExtend.setBarCode(tempInsertedJson.getString("barCode"));
-//                    }
-//                }
-                //设置商品单位
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("commodityUnit"))) {
-                    materialExtend.setCommodityUnit(tempInsertedJson.getString("commodityUnit"));
-                }
-                //设置商品属性
-                if (tempInsertedJson.get("sku")!=null) {
-                    materialExtend.setSku(tempInsertedJson.getString("sku"));
-                }
-                //设置采购价格
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("purchaseDecimal"))) {
-                    materialExtend.setPurchaseDecimal(tempInsertedJson.getBigDecimal("purchaseDecimal"));
-                }
-                //设置零售价格
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("commodityDecimal"))) {
-                    materialExtend.setCommodityDecimal(tempInsertedJson.getBigDecimal("commodityDecimal"));
-                }
-                //设置销售价格
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("wholesaleDecimal"))) {
-                    materialExtend.setWholesaleDecimal(tempInsertedJson.getBigDecimal("wholesaleDecimal"));
-                }
-                //设置最低售价
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("lowDecimal"))) {
-                    materialExtend.setLowDecimal(tempInsertedJson.getBigDecimal("lowDecimal"));
-                }
-                //设置生产日期
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("productionDate"))) {
-                    materialExtend.setProductionDate(tempInsertedJson.getDate("productionDate"));
-                }
-                //设置保质期天数
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("expiryNum"))) {
-                    materialExtend.setExpiryNum(tempInsertedJson.getInteger("expiryNum"));
-                }
-                //设置供应商id
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("supplierId"))) {
-                    materialExtend.setSupplierId(tempInsertedJson.getLong("supplierId"));
-                }
-                //设置商品条码
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("barCode"))) {
-                    materialExtend.setBarCode(tempInsertedJson.getString("barCode"));
-                }
-                //设置批次号
-                String batchNumber = DateUtils.dateTimeNow("yyyyMMdd") + RandomHelper.getRandomStr(6);
-                materialExtend.setBatchNumber(batchNumber);
-                //设置库存
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("inventory"))) {
-                    materialExtend.setInventory(tempInsertedJson.getBigDecimal("inventory"));
-                }
-                //设置仓库id
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("depotId"))) {
-                    materialExtend.setDepotId(tempInsertedJson.getLong("depotId"));
-                }
-                //设置仓位货架
-                if (StringUtils.isNotEmpty(tempInsertedJson.getString("position"))) {
-                    materialExtend.setPosition(tempInsertedJson.getString("position"));
-                }
-                //添加数据
-                this.insertMaterialExtend(materialExtend);
-            }
-        }
-        //修改拓展行
-        if (null != updatedJson) {
-            for (int i = 0; i < updatedJson.size(); i++) {
-                JSONObject tempUpdatedJson = JSONObject.parseObject(updatedJson.getString(i));
-                MaterialExtend materialExtend = new MaterialExtend();
-                //设置id
-                materialExtend.setId(tempUpdatedJson.getLong("id"));
-                if (StringUtils.isNotEmpty(tempUpdatedJson.getString("barCode"))) {
-                    int exist = checkIsBarCodeExist(tempUpdatedJson.getLong("id"), tempUpdatedJson.getString("barCode"));
-                    if(exist>0) {
-                        throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_BARCODE_EXISTS_CODE,
-                                String.format(ExceptionConstants.MATERIAL_BARCODE_EXISTS_MSG,tempUpdatedJson.getString("barCode")));
-                    } else {
-                        materialExtend.setBarCode(tempUpdatedJson.getString("barCode"));
-                    }
-                }
-                //Json里的数据赋值到对象
-                this.setMaterialExtend(tempUpdatedJson,materialExtend);
-                //修改商品拓展
-                this.updateMaterialExtend(materialExtend);
-                //如果金额为空,此处单独置空
-                materialExtendMapperEx.specialUpdatePrice(materialExtend);
-            }
-        }
-        //处理条码的排序,基本单位排第一个
-        if (null != sortJson && sortJson.size()>0) {
-            //此处为更新的逻辑
-            for (int i = 0; i < sortJson.size(); i++) {
-                JSONObject tempSortJson = JSONObject.parseObject(sortJson.getString(i));
-                MaterialExtend materialExtend = new MaterialExtend();
-                if(StringUtil.isExist(tempSortJson.get("id"))) {
-                    materialExtend.setId(tempSortJson.getLong("id"));
-                }
-                if(StringUtil.isExist(tempSortJson.get("defaultFlag"))) {
-                    materialExtend.setDefaultFlag(tempSortJson.getString("defaultFlag"));
-                }
-                this.updateMaterialExtend(materialExtend);
-            }
-        } else {
-            //新增的时候将第一条记录设置为默认基本单位
-            MaterialExtendExample example = new MaterialExtendExample();
-            example.createCriteria().andMaterialIdEqualTo(materialId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-            List<MaterialExtend> meList = materialExtendMapper.selectByExample(example);
-            if(meList!=null) {
-                for(int i=0; i<meList.size(); i++) {
-                    MaterialExtend materialExtend = new MaterialExtend();
-                    materialExtend.setId(meList.get(i).getId());
-                    if(i==0) {
-                        materialExtend.setDefaultFlag("1"); //默认
-                    } else {
-                        materialExtend.setDefaultFlag("0"); //非默认
-                    }
-                    this.updateMaterialExtend(materialExtend);
-                }
-            }
-        }
-        return null;
-    }
+    String saveDetials(JSONObject obj, String sortList, Long materialId, String type) throws Exception;
 
-    /**
-     * 添加商品拓展
-     * @param materialExtend 商品拓展
-     */
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public int insertMaterialExtend(MaterialExtend materialExtend)throws Exception {
-        User user = userService.getCurrentUser();
-        materialExtend.setDeleteFlag(BusinessConstants.DELETE_FLAG_EXISTS);
-        materialExtend.setCreateTime(new Date());
-        materialExtend.setUpdateTime(new Date().getTime());
-        materialExtend.setCreateSerial(user.getLoginName());
-        materialExtend.setUpdateSerial(user.getLoginName());
-        int result = 0;
-        try{
-            result= materialExtendMapper.insertSelective(materialExtend);
-        }catch(Exception e){
-            JshException.writeFail(logger, e);
-        }
-        return result;
-    }
+    int insertMaterialExtend(MaterialExtend materialExtend)throws Exception;
 
-    /**
-     * 修改商品拓展
-     * @param materialExtend 商品拓展
-     */
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public int updateMaterialExtend(MaterialExtend materialExtend) throws Exception{
-        User user = userService.getCurrentUser();
-        materialExtend.setUpdateTime(System.currentTimeMillis());
-        materialExtend.setUpdateSerial(user.getLoginName());
-        int res =0;
-        try{
-            res= materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
-        }catch(Exception e){
-            JshException.writeFail(logger, e);
-        }
-        return res;
-    }
+    int updateMaterialExtend(MaterialExtend materialExtend) throws Exception;
 
-    public int checkIsBarCodeExist(Long id, String barCode)throws Exception {
-        MaterialExtendExample example = new MaterialExtendExample();
-        MaterialExtendExample.Criteria criteria = example.createCriteria();
-        criteria.andBarCodeEqualTo(barCode);
-        if (id > 0) {
-            criteria.andIdNotEqualTo(id).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-        } else {
-            criteria.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-        }
-        List<MaterialExtend> list =null;
-        try{
-            list = materialExtendMapper.selectByExample(example);
-        }catch(Exception e){
-            JshException.readFail(logger, e);
-        }
-        return list==null?0:list.size();
-    }
+    int checkIsBarCodeExist(Long id, String barCode)throws Exception;
 
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public int deleteMaterialExtend(Long id, HttpServletRequest request)throws Exception {
-        int result =0;
-        MaterialExtend materialExtend = new MaterialExtend();
-        materialExtend.setId(id);
-        materialExtend.setDeleteFlag(BusinessConstants.DELETE_FLAG_DELETED);
-        Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
-        User user = userService.getUser(userId);
-        materialExtend.setUpdateTime(new Date().getTime());
-        materialExtend.setUpdateSerial(user.getLoginName());
-        try{
-            result= materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
-        }catch(Exception e){
-            JshException.writeFail(logger, e);
-        }
-        return result;
-    }
+    int deleteMaterialExtend(Long id, HttpServletRequest request)throws Exception;
 
-    /**
-     * 删除商品拓展行
-     * @param ids 拓展行id集合
-     */
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public int batchDeleteMaterialExtendByIds(String ids, HttpServletRequest request) throws Exception{
-        String [] idArray=ids.split(",");
-        int result = 0;
-        try{
-            result = materialExtendMapperEx.batchDeleteMaterialExtendByIds(idArray);
-        }catch(Exception e){
-            JshException.writeFail(logger, e);
-        }
-        return result;
-    }
+    int batchDeleteMaterialExtendByIds(String ids, HttpServletRequest request) throws Exception;
 
-    public int insertMaterialExtend(JSONObject obj, HttpServletRequest request) throws Exception{
-        MaterialExtend materialExtend = JSONObject.parseObject(obj.toJSONString(), MaterialExtend.class);
-        int result=0;
-        try{
-            result = materialExtendMapper.insertSelective(materialExtend);
-        }catch(Exception e){
-            JshException.writeFail(logger, e);
-        }
-        return result;
-    }
+    int insertMaterialExtend(JSONObject obj, HttpServletRequest request) throws Exception;
 
-    public int updateMaterialExtend(JSONObject obj, HttpServletRequest request)throws Exception {
-        MaterialExtend materialExtend = JSONObject.parseObject(obj.toJSONString(), MaterialExtend.class);
-        int result=0;
-        try{
-            result = materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
-        }catch(Exception e){
-            JshException.writeFail(logger, e);
-        }
-        return result;
-    }
+    int updateMaterialExtend(JSONObject obj, HttpServletRequest request)throws Exception;
 
-    public List<MaterialExtend> getMaterialExtendByTenantAndTime(Long tenantId, Long lastTime, Long syncNum)throws Exception {
-        List<MaterialExtend> list=new ArrayList<MaterialExtend>();
-        try{
-            //先获取最大的时间戳,再查两个时间戳之间的数据,这样同步能够防止丢失数据(应为时间戳有重复)
-            Long maxTime = materialExtendMapperEx.getMaxTimeByTenantAndTime(tenantId, lastTime, syncNum);
-            if(tenantId!=null && lastTime!=null && maxTime!=null) {
-                MaterialExtendExample example = new MaterialExtendExample();
-                example.createCriteria().andTenantIdEqualTo(tenantId)
-                        .andUpdateTimeGreaterThan(lastTime)
-                        .andUpdateTimeLessThanOrEqualTo(maxTime);
-                list=materialExtendMapper.selectByExample(example);
-            }
-        }catch(Exception e){
-            JshException.readFail(logger, e);
-        }
-        return list;
-    }
+    List<MaterialExtend> getMaterialExtendByTenantAndTime(Long tenantId, Long lastTime, Long syncNum)throws Exception;
 
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public Long selectIdByMaterialIdAndDefaultFlag(Long materialId, String defaultFlag) {
-        Long id = 0L;
-        MaterialExtendExample example = new MaterialExtendExample();
-        example.createCriteria().andMaterialIdEqualTo(materialId).andDefaultFlagEqualTo(defaultFlag)
-                                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
-        if(list!=null && list.size()>0) {
-            id = list.get(0).getId();
-        }
-        return id;
-    }
+    Long selectIdByMaterialIdAndDefaultFlag(Long materialId, String defaultFlag);
 
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public Long selectIdByMaterialIdAndBarCode(Long materialId, String barCode) {
-        Long id = 0L;
-        MaterialExtendExample example = new MaterialExtendExample();
-        example.createCriteria().andMaterialIdEqualTo(materialId).andBarCodeEqualTo(barCode)
-                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
-        if(list!=null && list.size()>0) {
-            id = list.get(0).getId();
-        }
-        return id;
-    }
+    Long selectIdByMaterialIdAndBarCode(Long materialId, String barCode);
 
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
-    public List<MaterialExtend> getListByMaterialIdAndDefaultFlagAndBarCode(Long materialId, String defaultFlag, String barCode) {
-        MaterialExtendExample example = new MaterialExtendExample();
-        example.createCriteria().andMaterialIdEqualTo(materialId).andDefaultFlagEqualTo(defaultFlag).andBarCodeNotEqualTo(barCode)
-                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-        return materialExtendMapper.selectByExample(example);
-    }
-
-    public MaterialExtend getInfoByBarCode(String barCode)throws Exception {
-        MaterialExtendExample example = new MaterialExtendExample();
-        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
-        if(list!=null && list.size()>0) {
-            return list.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 商品的副条码和数据库里面的商品条码存在重复(除自身商品之外)
-     * @param manyBarCode
-     * @param barCode
-     * @return
-     */
-    public int getCountByManyBarCodeWithoutUs(String manyBarCode, String barCode) {
-        MaterialExtendExample example = new MaterialExtendExample();
-        example.createCriteria().andBarCodeEqualTo(manyBarCode).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
-        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
-        if(list!=null && list.size()>0) {
-            for(MaterialExtend me: list) {
-                List<MaterialExtend> basicMeList = materialExtendMapperEx.getBasicInfoByMid(me.getMaterialId());
-                for(MaterialExtend basicMe: basicMeList) {
-                    if(basicMe!=null && !barCode.equals(basicMe.getBarCode())) {
-                        return 1;
-                    }
-                }
-            }
-        }
-        return 0;
-    }
-
-    public MaterialExtend getInfoByBatchNumber(String batchNumber)throws Exception {
-        MaterialExtend example = materialExtendMapper.selectByBatchNumber(batchNumber);
-       return example;
-    }
+    List<MaterialExtend> getListByMaterialIdAndDefaultFlagAndBarCode(Long materialId, String defaultFlag, String barCode);
 
-    /**
-     * 将Json对象的数据赋值到商品拓展对象中
-     * @param tempJson
-     * @param materialExtend
-     */
-    private void setMaterialExtend(JSONObject tempJson, MaterialExtend materialExtend){
-        //设置商品单位
-        if (StringUtils.isNotEmpty(tempJson.getString("commodityUnit"))) {
-            materialExtend.setCommodityUnit(tempJson.getString("commodityUnit"));
-        }
-        //设置商品属性
-        if (tempJson.get("sku")!=null) {
-            materialExtend.setSku(tempJson.getString("sku"));
-        }
-        //设置采购价格
-        if (StringUtils.isNotEmpty(tempJson.getString("purchaseDecimal"))) {
-            materialExtend.setPurchaseDecimal(tempJson.getBigDecimal("purchaseDecimal"));
-        }
-        //设置零售价格
-        if (StringUtils.isNotEmpty(tempJson.getString("commodityDecimal"))) {
-            materialExtend.setCommodityDecimal(tempJson.getBigDecimal("commodityDecimal"));
-        }
-        //设置销售价格
-        if (StringUtils.isNotEmpty(tempJson.getString("wholesaleDecimal"))) {
-            materialExtend.setWholesaleDecimal(tempJson.getBigDecimal("wholesaleDecimal"));
-        }
-        //设置最低售价
-        if (StringUtils.isNotEmpty(tempJson.getString("lowDecimal"))) {
-            materialExtend.setLowDecimal(tempJson.getBigDecimal("lowDecimal"));
-        }
-        //设置生产日期
-        if (StringUtils.isNotEmpty(tempJson.getString("productionDate"))) {
-            materialExtend.setProductionDate(tempJson.getDate("productionDate"));
-        }
-        //设置保质期天数
-        if (StringUtils.isNotEmpty(tempJson.getString("expiryNum"))) {
-            materialExtend.setExpiryNum(tempJson.getInteger("expiryNum"));
-        }
-        //设置供应商id
-        if (StringUtils.isNotEmpty(tempJson.getString("supplierId"))) {
-            materialExtend.setSupplierId(tempJson.getLong("supplierId"));
-        }
-        //设置商品条码
-        if (StringUtils.isNotEmpty(tempJson.getString("barCode"))) {
-            materialExtend.setBarCode(tempJson.getString("barCode"));
-        }
-        //设置批次号
-        String batchNumber = DateUtils.dateTimeNow("yyyyMMdd") + RandomHelper.getRandomStr(6);
-        materialExtend.setBatchNumber(batchNumber);
-        //设置库存
-        if (StringUtils.isNotEmpty(tempJson.getString("inventory"))) {
-            materialExtend.setInventory(tempJson.getBigDecimal("inventory"));
-        }
-        //设置仓库id
-        if (StringUtils.isNotEmpty(tempJson.getString("depotId"))) {
-            materialExtend.setDepotId(tempJson.getLong("depotId"));
-        }
-        //设置仓位货架
-        if (StringUtils.isNotEmpty(tempJson.getString("position"))) {
-            materialExtend.setPosition(tempJson.getString("position"));
-        }
-    }
+    MaterialExtend getInfoByBarCode(String barCode)throws Exception;
 
+    int getCountByManyBarCodeWithoutUs(String manyBarCode, String barCode);
 
+    MaterialExtend getInfoByBatchNumber(String batchNumber)throws Exception;
 }

+ 25 - 0
src/main/java/com/jsh/erp/service/UnitService.java

@@ -10,6 +10,7 @@ import com.jsh.erp.datasource.entities.User;
 import com.jsh.erp.datasource.mappers.MaterialMapperEx;
 import com.jsh.erp.datasource.mappers.UnitMapper;
 import com.jsh.erp.datasource.mappers.UnitMapperEx;
+import com.jsh.erp.datasource.vo.UnitListVo;
 import com.jsh.erp.exception.BusinessRunTimeException;
 import com.jsh.erp.exception.JshException;
 import com.jsh.erp.utils.PageUtils;
@@ -297,4 +298,28 @@ public class UnitService {
         }
         return result;
     }
+
+    /**
+     * 根据单位id获取单位值集合
+     * @param id 单位id
+     */
+    public List getUnitListByID(Long id){
+        Unit unit = unitMapper.selectByPrimaryKey(id);
+        List<UnitListVo> list = new ArrayList();
+        UnitListVo unitListVo = new UnitListVo().setName(unit.getBasicUnit()).setRatio(new BigDecimal("1"));
+        list.add(unitListVo);
+        if (unit.getOtherUnit() != null){
+            UnitListVo vo = new UnitListVo().setName(unit.getOtherUnit()).setRatio(unit.getRatio());
+            list.add(vo);
+        }
+        if (unit.getOtherUnitTwo() != null){
+            UnitListVo vo = new UnitListVo().setName(unit.getOtherUnitTwo()).setRatio(unit.getRatioTwo());
+            list.add(vo);
+        }
+        if (unit.getOtherUnitThree() != null){
+            UnitListVo vo = new UnitListVo().setName(unit.getOtherUnitThree()).setRatio(unit.getRatioThree());
+            list.add(vo);
+        }
+        return list;
+    }
 }

+ 16 - 1
src/main/java/com/jsh/erp/service/impl/DepotItemServiceImpl.java

@@ -214,6 +214,10 @@ public class DepotItemServiceImpl extends ServiceImpl<DepotItemMapper, DepotItem
         return result;
     }
 
+    /**
+     * 插入单据子表
+     * @param depotItem 单据子表
+     */
     @Override
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
     public int insertDepotItemWithObj(DepotItem depotItem)throws Exception {
@@ -536,7 +540,9 @@ public class DepotItemServiceImpl extends ServiceImpl<DepotItemMapper, DepotItem
                 //以下进行单位换算
                 Unit unitInfo = materialService.findUnit(materialExtend.getMaterialId()); //查询多单位信息
                 if (StringUtil.isExist(rowObj.get("operNumber"))) {
+                    //获取子表单商品数量
                     depotItem.setOperNumber(rowObj.getBigDecimal("operNumber"));
+                    //获取子表单商品单位
                     String unit = rowObj.get("unit") == null ? "" :rowObj.get("unit").toString();
                     BigDecimal oNumber = rowObj.getBigDecimal("operNumber");
                     if (StringUtil.isNotEmpty(unitInfo.getName())) {
@@ -841,6 +847,11 @@ public class DepotItemServiceImpl extends ServiceImpl<DepotItemMapper, DepotItem
         }
     }
 
+    /**
+     * 根据主表id删除单明细
+     * @param headerId
+     * @throws Exception
+     */
     @Override
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
     public void deleteDepotItemHeadId(Long headerId)throws Exception {
@@ -1097,7 +1108,7 @@ public class DepotItemServiceImpl extends ServiceImpl<DepotItemMapper, DepotItem
 
     /**
      * 根据单据明细来批量更新当前库存
-     * @param depotItem
+     * @param depotItem 单据子表明细
      */
     @Override
     @Transactional(value = "transactionManager", rollbackFor = Exception.class)
@@ -1185,6 +1196,7 @@ public class DepotItemServiceImpl extends ServiceImpl<DepotItemMapper, DepotItem
     public void updateCurrentStockFun(Long mId, Long dId) throws Exception {
         if(mId!=null && dId!=null) {
             MaterialCurrentStockExample example = new MaterialCurrentStockExample();
+            //条件添加商品id,仓库id ,已删除状态
             example.createCriteria().andMaterialIdEqualTo(mId).andDepotIdEqualTo(dId)
                     .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
             //获取商品当前库存信息
@@ -1192,12 +1204,15 @@ public class DepotItemServiceImpl extends ServiceImpl<DepotItemMapper, DepotItem
             MaterialCurrentStock materialCurrentStock = new MaterialCurrentStock();
             materialCurrentStock.setMaterialId(mId);
             materialCurrentStock.setDepotId(dId);
+            //设置当前库存数量
             materialCurrentStock.setCurrentNumber(getStockByParam(dId,mId,null,null));
             if(list!=null && list.size()>0) {
+                //当前库存信息存在,修改当前库存信息
                 Long mcsId = list.get(0).getId();
                 materialCurrentStock.setId(mcsId);
                 materialCurrentStockMapper.updateByPrimaryKeySelective(materialCurrentStock);
             } else {
+                //当前库存信息不存在,新增当前库存信息
                 materialCurrentStockMapper.insertSelective(materialCurrentStock);
             }
         }

+ 545 - 0
src/main/java/com/jsh/erp/service/impl/MaterialExtendServiceImpl.java

@@ -0,0 +1,545 @@
+package com.jsh.erp.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jsh.erp.constants.BusinessConstants;
+import com.jsh.erp.constants.ExceptionConstants;
+import com.jsh.erp.datasource.entities.MaterialExtend;
+import com.jsh.erp.datasource.entities.MaterialExtendExample;
+import com.jsh.erp.datasource.entities.User;
+import com.jsh.erp.datasource.mappers.MaterialExtendMapper;
+import com.jsh.erp.datasource.mappers.MaterialExtendMapperEx;
+import com.jsh.erp.datasource.vo.MaterialExtendVo4List;
+import com.jsh.erp.exception.BusinessRunTimeException;
+import com.jsh.erp.exception.JshException;
+import com.jsh.erp.service.MaterialExtendService;
+import com.jsh.erp.service.RedisService;
+import com.jsh.erp.service.UserService;
+import com.jsh.erp.utils.DateUtils;
+import com.jsh.erp.utils.RandomHelper;
+import com.jsh.erp.utils.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class MaterialExtendServiceImpl extends ServiceImpl<MaterialExtendMapper, MaterialExtend> implements MaterialExtendService {
+    private Logger logger = LoggerFactory.getLogger(MaterialExtendServiceImpl.class);
+
+    @Resource
+    private MaterialExtendMapper materialExtendMapper;
+    @Resource
+    private MaterialExtendMapperEx materialExtendMapperEx;
+    @Resource
+    private UserService userService;
+    @Resource
+    private RedisService redisService;
+
+    @Override
+    public MaterialExtend getMaterialExtend(long id)throws Exception {
+        MaterialExtend result=null;
+        try{
+            result=materialExtendMapper.selectByPrimaryKey(id);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 根据产品id查询产品价格拓展信息
+     * @param materialId 产品id
+     */
+    @Override
+    public List<MaterialExtendVo4List> getDetailList(Long materialId) {
+        List<MaterialExtendVo4List> list=null;
+        try{
+            list = materialExtendMapperEx.getDetailList(materialId);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Override
+    public List<MaterialExtend> getListByMIds(List<Long> idList) {
+        List<MaterialExtend> meList = null;
+        try{
+            Long [] idArray= StringUtil.listToLongArray(idList);
+            if(idArray!=null && idArray.length>0) {
+                meList = materialExtendMapperEx.getListByMId(idArray);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return meList;
+    }
+
+    /**
+     * 保存产品拓展记录
+     * @param obj
+     * @param sortList
+     * @param materialId
+     * @param type
+     * @return
+     * @throws Exception
+     */
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public String saveDetials(JSONObject obj, String sortList, Long materialId, String type) throws Exception {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        //获取商品拓展行参数集合
+        JSONArray meArr = obj.getJSONArray("meList");
+        //添加商品拓展集合
+        JSONArray insertedJson = new JSONArray();
+        //修改商品拓展集合
+        JSONArray updatedJson = new JSONArray();
+        //移除商品集合
+        JSONArray deletedJson = obj.getJSONArray("meDeleteIdList");
+        JSONArray sortJson = JSONArray.parseArray(sortList);
+        //添加/修改行数据处理
+        if (null != meArr) {
+            if("insert".equals(type)){
+                for (int i = 0; i < meArr.size(); i++) {
+                    JSONObject tempJson = meArr.getJSONObject(i);
+                    insertedJson.add(tempJson);
+                }
+            } else if("update".equals(type)){
+                for (int i = 0; i < meArr.size(); i++) {
+                    JSONObject tempJson = meArr.getJSONObject(i);
+                    String tempId = tempJson.getString("id");
+                    if(tempId.length()>19){
+                        //id长度大于19,属于新增数据
+                        insertedJson.add(tempJson);
+                    } else {
+                        updatedJson.add(tempJson);
+                    }
+                }
+            }
+        }
+        //删除行数据处理
+        if (null != deletedJson) {
+            StringBuffer bf=new StringBuffer();
+            for (int i = 0; i < deletedJson.size(); i++) {
+                bf.append(deletedJson.getString(i));
+                if(i<(deletedJson.size()-1)){
+                    bf.append(",");
+                }
+            }
+            //删除拓展行
+            this.batchDeleteMaterialExtendByIds(bf.toString(), request);
+        }
+
+        //添加产品拓展行
+        if (null != insertedJson) {
+            for (int i = 0; i < insertedJson.size(); i++) {
+                //商品拓展
+                MaterialExtend materialExtend = new MaterialExtend();
+                JSONObject tempInsertedJson = JSONObject.parseObject(insertedJson.getString(i));
+                //设置商品id
+                materialExtend.setMaterialId(materialId);
+                //设置商品单位
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("commodityUnit"))) {
+                    materialExtend.setCommodityUnit(tempInsertedJson.getString("commodityUnit"));
+                }
+                //设置商品属性
+                if (tempInsertedJson.get("sku")!=null) {
+                    materialExtend.setSku(tempInsertedJson.getString("sku"));
+                }
+                //设置采购价格
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("purchaseDecimal"))) {
+                    materialExtend.setPurchaseDecimal(tempInsertedJson.getBigDecimal("purchaseDecimal"));
+                }
+                //设置零售价格
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("commodityDecimal"))) {
+                    materialExtend.setCommodityDecimal(tempInsertedJson.getBigDecimal("commodityDecimal"));
+                }
+                //设置销售价格
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("wholesaleDecimal"))) {
+                    materialExtend.setWholesaleDecimal(tempInsertedJson.getBigDecimal("wholesaleDecimal"));
+                }
+                //设置最低售价
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("lowDecimal"))) {
+                    materialExtend.setLowDecimal(tempInsertedJson.getBigDecimal("lowDecimal"));
+                }
+                //设置生产日期
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("productionDate"))) {
+                    materialExtend.setProductionDate(tempInsertedJson.getDate("productionDate"));
+                }
+                //设置保质期天数
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("expiryNum"))) {
+                    materialExtend.setExpiryNum(tempInsertedJson.getInteger("expiryNum"));
+                }
+                //设置供应商id
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("supplierId"))) {
+                    materialExtend.setSupplierId(tempInsertedJson.getLong("supplierId"));
+                }
+                //设置商品条码
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("barCode"))) {
+                    materialExtend.setBarCode(tempInsertedJson.getString("barCode"));
+                }
+                //设置批次号
+                String batchNumber = DateUtils.dateTimeNow("yyyyMMdd") + RandomHelper.getRandomStr(6);
+                materialExtend.setBatchNumber(batchNumber);
+                //设置库存
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("inventory"))) {
+                    materialExtend.setInventory(tempInsertedJson.getBigDecimal("inventory"));
+                }
+                //设置仓库id
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("depotId"))) {
+                    materialExtend.setDepotId(tempInsertedJson.getLong("depotId"));
+                }
+                //设置仓位货架
+                if (StringUtils.isNotEmpty(tempInsertedJson.getString("position"))) {
+                    materialExtend.setPosition(tempInsertedJson.getString("position"));
+                }
+                //添加数据
+                this.insertMaterialExtend(materialExtend);
+            }
+        }
+        //修改拓展行
+        if (null != updatedJson) {
+            for (int i = 0; i < updatedJson.size(); i++) {
+                JSONObject tempUpdatedJson = JSONObject.parseObject(updatedJson.getString(i));
+                MaterialExtend materialExtend = new MaterialExtend();
+                //设置id
+                materialExtend.setId(tempUpdatedJson.getLong("id"));
+                materialExtend.setBarCode(tempUpdatedJson.getString("barCode"));
+                //Json里的数据赋值到对象
+                this.setMaterialExtend(tempUpdatedJson,materialExtend);
+                //修改商品拓展
+                this.updateMaterialExtend(materialExtend);
+                //如果金额为空,此处单独置空
+                materialExtendMapperEx.specialUpdatePrice(materialExtend);
+            }
+        }
+        //处理条码的排序,基本单位排第一个
+        if (null != sortJson && sortJson.size()>0) {
+            //此处为更新的逻辑
+            for (int i = 0; i < sortJson.size(); i++) {
+                JSONObject tempSortJson = JSONObject.parseObject(sortJson.getString(i));
+                MaterialExtend materialExtend = new MaterialExtend();
+                if(StringUtil.isExist(tempSortJson.get("id"))) {
+                    materialExtend.setId(tempSortJson.getLong("id"));
+                }
+                if(StringUtil.isExist(tempSortJson.get("defaultFlag"))) {
+                    materialExtend.setDefaultFlag(tempSortJson.getString("defaultFlag"));
+                }
+                this.updateMaterialExtend(materialExtend);
+            }
+        } else {
+            //新增的时候将第一条记录设置为默认基本单位
+            MaterialExtendExample example = new MaterialExtendExample();
+            example.createCriteria().andMaterialIdEqualTo(materialId).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+            List<MaterialExtend> meList = materialExtendMapper.selectByExample(example);
+            if(meList!=null) {
+                for(int i=0; i<meList.size(); i++) {
+                    MaterialExtend materialExtend = new MaterialExtend();
+                    materialExtend.setId(meList.get(i).getId());
+                    if(i==0) {
+                        materialExtend.setDefaultFlag("1"); //默认
+                    } else {
+                        materialExtend.setDefaultFlag("0"); //非默认
+                    }
+                    this.updateMaterialExtend(materialExtend);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 添加商品拓展
+     * @param materialExtend 商品拓展
+     */
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int insertMaterialExtend(MaterialExtend materialExtend)throws Exception {
+        User user = userService.getCurrentUser();
+        materialExtend.setDeleteFlag(BusinessConstants.DELETE_FLAG_EXISTS);
+        materialExtend.setCreateTime(new Date());
+        materialExtend.setUpdateTime(new Date().getTime());
+        materialExtend.setCreateSerial(user.getLoginName());
+        materialExtend.setUpdateSerial(user.getLoginName());
+        int result = 0;
+        try{
+            result= materialExtendMapper.insertSelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 修改商品拓展
+     * @param materialExtend 商品拓展
+     */
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int updateMaterialExtend(MaterialExtend materialExtend) throws Exception{
+        User user = userService.getCurrentUser();
+        materialExtend.setUpdateTime(System.currentTimeMillis());
+        materialExtend.setUpdateSerial(user.getLoginName());
+        int res =0;
+        try{
+            res= materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return res;
+    }
+
+    @Override
+    public int checkIsBarCodeExist(Long id, String barCode)throws Exception {
+        MaterialExtendExample example = new MaterialExtendExample();
+        MaterialExtendExample.Criteria criteria = example.createCriteria();
+        criteria.andBarCodeEqualTo(barCode);
+        if (id > 0) {
+            criteria.andIdNotEqualTo(id).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        } else {
+            criteria.andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        }
+        List<MaterialExtend> list =null;
+        try{
+            list = materialExtendMapper.selectByExample(example);
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list==null?0:list.size();
+    }
+
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int deleteMaterialExtend(Long id, HttpServletRequest request)throws Exception {
+        int result =0;
+        MaterialExtend materialExtend = new MaterialExtend();
+        materialExtend.setId(id);
+        materialExtend.setDeleteFlag(BusinessConstants.DELETE_FLAG_DELETED);
+        Long userId = Long.parseLong(redisService.getObjectFromSessionByKey(request,"userId").toString());
+        User user = userService.getUser(userId);
+        materialExtend.setUpdateTime(new Date().getTime());
+        materialExtend.setUpdateSerial(user.getLoginName());
+        try{
+            result= materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    /**
+     * 删除商品拓展行
+     * @param ids 拓展行id集合
+     */
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public int batchDeleteMaterialExtendByIds(String ids, HttpServletRequest request) throws Exception{
+        String [] idArray=ids.split(",");
+        int result = 0;
+        try{
+            result = materialExtendMapperEx.batchDeleteMaterialExtendByIds(idArray);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Override
+    public int insertMaterialExtend(JSONObject obj, HttpServletRequest request) throws Exception{
+        MaterialExtend materialExtend = JSONObject.parseObject(obj.toJSONString(), MaterialExtend.class);
+        int result=0;
+        try{
+            result = materialExtendMapper.insertSelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Override
+    public int updateMaterialExtend(JSONObject obj, HttpServletRequest request)throws Exception {
+        MaterialExtend materialExtend = JSONObject.parseObject(obj.toJSONString(), MaterialExtend.class);
+        int result=0;
+        try{
+            result = materialExtendMapper.updateByPrimaryKeySelective(materialExtend);
+        }catch(Exception e){
+            JshException.writeFail(logger, e);
+        }
+        return result;
+    }
+
+    @Override
+    public List<MaterialExtend> getMaterialExtendByTenantAndTime(Long tenantId, Long lastTime, Long syncNum)throws Exception {
+        List<MaterialExtend> list=new ArrayList<MaterialExtend>();
+        try{
+            //先获取最大的时间戳,再查两个时间戳之间的数据,这样同步能够防止丢失数据(应为时间戳有重复)
+            Long maxTime = materialExtendMapperEx.getMaxTimeByTenantAndTime(tenantId, lastTime, syncNum);
+            if(tenantId!=null && lastTime!=null && maxTime!=null) {
+                MaterialExtendExample example = new MaterialExtendExample();
+                example.createCriteria().andTenantIdEqualTo(tenantId)
+                        .andUpdateTimeGreaterThan(lastTime)
+                        .andUpdateTimeLessThanOrEqualTo(maxTime);
+                list=materialExtendMapper.selectByExample(example);
+            }
+        }catch(Exception e){
+            JshException.readFail(logger, e);
+        }
+        return list;
+    }
+
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public Long selectIdByMaterialIdAndDefaultFlag(Long materialId, String defaultFlag) {
+        Long id = 0L;
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andDefaultFlagEqualTo(defaultFlag)
+                                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            id = list.get(0).getId();
+        }
+        return id;
+    }
+
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public Long selectIdByMaterialIdAndBarCode(Long materialId, String barCode) {
+        Long id = 0L;
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andBarCodeEqualTo(barCode)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            id = list.get(0).getId();
+        }
+        return id;
+    }
+
+    @Override
+    @Transactional(value = "transactionManager", rollbackFor = Exception.class)
+    public List<MaterialExtend> getListByMaterialIdAndDefaultFlagAndBarCode(Long materialId, String defaultFlag, String barCode) {
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andMaterialIdEqualTo(materialId).andDefaultFlagEqualTo(defaultFlag).andBarCodeNotEqualTo(barCode)
+                .andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        return materialExtendMapper.selectByExample(example);
+    }
+
+    @Override
+    public MaterialExtend getInfoByBarCode(String barCode)throws Exception {
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            return list.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 商品的副条码和数据库里面的商品条码存在重复(除自身商品之外)
+     * @param manyBarCode
+     * @param barCode
+     * @return
+     */
+    @Override
+    public int getCountByManyBarCodeWithoutUs(String manyBarCode, String barCode) {
+        MaterialExtendExample example = new MaterialExtendExample();
+        example.createCriteria().andBarCodeEqualTo(manyBarCode).andDeleteFlagNotEqualTo(BusinessConstants.DELETE_FLAG_DELETED);
+        List<MaterialExtend> list = materialExtendMapper.selectByExample(example);
+        if(list!=null && list.size()>0) {
+            for(MaterialExtend me: list) {
+                List<MaterialExtend> basicMeList = materialExtendMapperEx.getBasicInfoByMid(me.getMaterialId());
+                for(MaterialExtend basicMe: basicMeList) {
+                    if(basicMe!=null && !barCode.equals(basicMe.getBarCode())) {
+                        return 1;
+                    }
+                }
+            }
+        }
+        return 0;
+    }
+
+    @Override
+    public MaterialExtend getInfoByBatchNumber(String batchNumber)throws Exception {
+        MaterialExtend example = materialExtendMapper.selectByBatchNumber(batchNumber);
+       return example;
+    }
+
+    /**
+     * 将Json对象的数据赋值到商品拓展对象中
+     * @param tempJson
+     * @param materialExtend
+     */
+    private void setMaterialExtend(JSONObject tempJson, MaterialExtend materialExtend){
+        //设置商品单位
+        if (StringUtils.isNotEmpty(tempJson.getString("commodityUnit"))) {
+            materialExtend.setCommodityUnit(tempJson.getString("commodityUnit"));
+        }
+        //设置商品属性
+        if (tempJson.get("sku")!=null) {
+            materialExtend.setSku(tempJson.getString("sku"));
+        }
+        //设置采购价格
+        if (StringUtils.isNotEmpty(tempJson.getString("purchaseDecimal"))) {
+            materialExtend.setPurchaseDecimal(tempJson.getBigDecimal("purchaseDecimal"));
+        }
+        //设置零售价格
+        if (StringUtils.isNotEmpty(tempJson.getString("commodityDecimal"))) {
+            materialExtend.setCommodityDecimal(tempJson.getBigDecimal("commodityDecimal"));
+        }
+        //设置销售价格
+        if (StringUtils.isNotEmpty(tempJson.getString("wholesaleDecimal"))) {
+            materialExtend.setWholesaleDecimal(tempJson.getBigDecimal("wholesaleDecimal"));
+        }
+        //设置最低售价
+        if (StringUtils.isNotEmpty(tempJson.getString("lowDecimal"))) {
+            materialExtend.setLowDecimal(tempJson.getBigDecimal("lowDecimal"));
+        }
+        //设置生产日期
+        if (StringUtils.isNotEmpty(tempJson.getString("productionDate"))) {
+            materialExtend.setProductionDate(tempJson.getDate("productionDate"));
+        }
+        //设置保质期天数
+        if (StringUtils.isNotEmpty(tempJson.getString("expiryNum"))) {
+            materialExtend.setExpiryNum(tempJson.getInteger("expiryNum"));
+        }
+        //设置供应商id
+        if (StringUtils.isNotEmpty(tempJson.getString("supplierId"))) {
+            materialExtend.setSupplierId(tempJson.getLong("supplierId"));
+        }
+        //设置商品条码
+        if (StringUtils.isNotEmpty(tempJson.getString("barCode"))) {
+            materialExtend.setBarCode(tempJson.getString("barCode"));
+        }
+        //设置批次号
+        String batchNumber = DateUtils.dateTimeNow("yyyyMMdd") + RandomHelper.getRandomStr(6);
+        materialExtend.setBatchNumber(batchNumber);
+        //设置库存
+        if (StringUtils.isNotEmpty(tempJson.getString("inventory"))) {
+            materialExtend.setInventory(tempJson.getBigDecimal("inventory"));
+        }
+        //设置仓库id
+        if (StringUtils.isNotEmpty(tempJson.getString("depotId"))) {
+            materialExtend.setDepotId(tempJson.getLong("depotId"));
+        }
+        //设置仓位货架
+        if (StringUtils.isNotEmpty(tempJson.getString("position"))) {
+            materialExtend.setPosition(tempJson.getString("position"));
+        }
+    }
+
+
+}

+ 5 - 2
src/main/java/com/jsh/erp/service/impl/MaterialServiceImpl.java

@@ -171,7 +171,6 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
         String sku = serial_no + DateUtils.dateTimeNow();
         //设置系统sku
         m.setSystemSku(sku);
-
         try{
             //添加商品
             materialMapperEx.insertSelectiveEx(m);
@@ -1591,7 +1590,11 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
     @Override
     public List<MaterialVo4Unit> getMaterialByBatchNumber(String batchNumber) {
         String [] batchNumberArray=batchNumber.split(",");
-        return materialMapperEx.getMaterialByBatchNumber(batchNumberArray);
+        List<MaterialVo4Unit> list =  materialMapperEx.getMaterialByBatchNumber(batchNumberArray);
+        list.forEach(v -> {
+            v.setUnitList(v.getUnitId() == null ? null : unitService.getUnitListByID(v.getUnitId()));
+        });
+        return list;
     }
 
     /**

+ 1 - 1
src/main/resources/mapper_xml/MaterialExtendMapperEx.xml

@@ -5,7 +5,7 @@
 
     </resultMap>
 
-    <select id="getDetailList" parameterType="com.jsh.erp.datasource.entities.MaterialExtendExample" resultMap="ResultMapList">
+    <select id="getDetailList" parameterType="com.jsh.erp.datasource.entities.MaterialExtendExample" resultType="com.jsh.erp.datasource.vo.MaterialExtendVo4List">
         select distinct d.id,d.commodity_unit,d.sku,d.commodity_decimal,d.purchase_decimal,d.wholesale_decimal,
                         d.low_decimal,d.default_flag,d.production_date,d.expiry_num,d.supplier_id,d.bar_code,d.batch_number,d.inventory,d.depot_id,d.position
         from jsh_material_extend d

+ 6 - 10
src/main/resources/mapper_xml/MaterialMapperEx.xml

@@ -57,8 +57,8 @@
         where 1=1
         <if test="materialParam != null and materialParam !=''">
             <bind name="bindKey" value="'%'+materialParam+'%'"/>
-            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
-            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} or m.mfrs like #{bindKey})
+            and (me.bar_code like #{bindKey} or me.batch_number like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
+            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey})
         </if>
         <if test="standard != null and standard !=''">
             <bind name="bindStandard" value="'%'+standard+'%'"/>
@@ -76,10 +76,6 @@
             <bind name="bindBrand" value="'%'+brand+'%'"/>
             and m.brand like #{bindBrand}
         </if>
-        <if test="mfrs != null and mfrs !=''">
-            <bind name="bindMfrs" value="'%'+mfrs+'%'"/>
-            and m.mfrs like #{bindMfrs}
-        </if>
         <if test="materialOther != null and materialOther !=''">
             <bind name="bindOther" value="'%'+materialOther+'%'"/>
             and (m.other_field1 like #{bindOther} or m.other_field2 like #{bindOther} or m.other_field3 like #{bindOther})
@@ -319,8 +315,8 @@
         where m.enabled=1 and me.id is not null
         <if test="q != null and q !=''">
             <bind name="bindKey" value="'%'+q+'%'"/>
-            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
-            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} or m.mfrs like #{bindKey})
+            and (me.bar_code like #{bindKey} or me.batch_number like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
+            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} )
         </if>
         <if test="standardOrModel != null and standardOrModel !=''">
             <bind name="bindStandardOrModel" value="'%'+standardOrModel+'%'"/>
@@ -367,8 +363,8 @@
         where m.enabled=1 and me.id is not null
         <if test="q != null and q !=''">
             <bind name="bindKey" value="'%'+q+'%'"/>
-            and (me.bar_code like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
-            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey} or m.mfrs like #{bindKey})
+            and (me.bar_code like #{bindKey} or me.batch_number like #{bindKey} or m.name like #{bindKey} or m.mnemonic like #{bindKey} or m.standard like #{bindKey}
+            or m.model like #{bindKey} or m.color like #{bindKey} or m.brand like #{bindKey})
         </if>
         <if test="standardOrModel != null and standardOrModel !=''">
             <bind name="bindStandardOrModel" value="'%'+standardOrModel+'%'"/>