Przeglądaj źródła

优化物品导入功能

java110 3 lat temu
rodzic
commit
cb7e09de32

+ 141 - 0
java110-bean/src/main/java/com/java110/entity/assetImport/ImportResourceStoreDto.java

@@ -0,0 +1,141 @@
+package com.java110.entity.assetImport;
+
+import java.io.Serializable;
+
+public class ImportResourceStoreDto implements Serializable {
+
+    private String communityId;
+
+    private String shId;
+    private String resName;
+
+    private String resCode;
+
+    private String outLowPrice;
+    private String outHighPrice;
+
+    private String warningStock;
+
+    private String isFixed;
+
+    private String unitCode;
+    private String price;
+    private String stock; // 是否有电梯
+    private String remark; // 房屋类型
+    private String amount;
+    private String rstName;
+
+
+    public String getCommunityId() {
+        return communityId;
+    }
+
+    public void setCommunityId(String communityId) {
+        this.communityId = communityId;
+    }
+
+    public String getShId() {
+        return shId;
+    }
+
+    public void setShId(String shId) {
+        this.shId = shId;
+    }
+
+    public String getResName() {
+        return resName;
+    }
+
+    public void setResName(String resName) {
+        this.resName = resName;
+    }
+
+    public String getUnitCode() {
+        return unitCode;
+    }
+
+    public void setUnitCode(String unitCode) {
+        this.unitCode = unitCode;
+    }
+
+    public String getPrice() {
+        return price;
+    }
+
+    public void setPrice(String price) {
+        this.price = price;
+    }
+
+    public String getStock() {
+        return stock;
+    }
+
+    public void setStock(String stock) {
+        this.stock = stock;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getAmount() {
+        return amount;
+    }
+
+    public void setAmount(String amount) {
+        this.amount = amount;
+    }
+
+    public String getRstName() {
+        return rstName;
+    }
+
+    public void setRstName(String rstName) {
+        this.rstName = rstName;
+    }
+
+
+    public String getResCode() {
+        return resCode;
+    }
+
+    public void setResCode(String resCode) {
+        this.resCode = resCode;
+    }
+
+    public String getOutLowPrice() {
+        return outLowPrice;
+    }
+
+    public void setOutLowPrice(String outLowPrice) {
+        this.outLowPrice = outLowPrice;
+    }
+
+    public String getOutHighPrice() {
+        return outHighPrice;
+    }
+
+    public void setOutHighPrice(String outHighPrice) {
+        this.outHighPrice = outHighPrice;
+    }
+
+    public String getWarningStock() {
+        return warningStock;
+    }
+
+    public void setWarningStock(String warningStock) {
+        this.warningStock = warningStock;
+    }
+
+    public String getIsFixed() {
+        return isFixed;
+    }
+
+    public void setIsFixed(String isFixed) {
+        this.isFixed = isFixed;
+    }
+}

+ 40 - 0
service-api/src/main/java/com/java110/api/components/assetImport/ImportResourceStoreComponent.java

@@ -0,0 +1,40 @@
+package com.java110.api.components.assetImport;
+
+import com.java110.api.controller.component.CallComponentController;
+import com.java110.api.smo.assetExport.IExportRoomSMO;
+import com.java110.api.smo.assetImport.IImportResourceStoreSMO;
+import com.java110.core.context.IPageData;
+import com.java110.core.log.LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 添加应用组件
+ */
+@Component("importResourceStore")
+public class ImportResourceStoreComponent {
+
+    private final static Logger logger = LoggerFactory.getLogger(CallComponentController.class);
+
+
+    @Autowired
+    private IImportResourceStoreSMO importResourceStoreSMOImpl;
+
+    @Autowired
+    private IExportRoomSMO exportRoomSMOImpl;
+
+    /**
+     * 添加应用数据
+     *
+     * @param pd 页面数据封装
+     * @return ResponseEntity 对象
+     */
+    public ResponseEntity<String> importData(IPageData pd, MultipartFile uploadFile) throws Exception {
+
+        return importResourceStoreSMOImpl.importExcelData(pd, uploadFile);
+    }
+
+}

+ 24 - 0
service-api/src/main/java/com/java110/api/smo/assetImport/IImportResourceStoreSMO.java

@@ -0,0 +1,24 @@
+package com.java110.api.smo.assetImport;
+
+import com.java110.core.context.IPageData;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @ClassName IAssetImportSMO
+ * @Description TODO
+ * @Author wuxw
+ * @Date 2019/9/23 23:13
+ * @Version 1.0
+ * add by wuxw 2019/9/23
+ **/
+public interface IImportResourceStoreSMO {
+
+    /**
+     * 导入excel数据
+     * @param pd 前台数据封装
+     * @param uploadFile excel 文件
+     * @return ResponseEntity
+     */
+    public ResponseEntity<String> importExcelData(IPageData pd,  MultipartFile uploadFile) throws Exception;
+}

+ 213 - 0
service-api/src/main/java/com/java110/api/smo/assetImport/impl/ImportResourceStoreSMOImpl.java

@@ -0,0 +1,213 @@
+package com.java110.api.smo.assetImport.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.smo.DefaultAbstractComponentSMO;
+import com.java110.api.smo.assetImport.IImportResourceStoreSMO;
+import com.java110.core.context.IPageData;
+import com.java110.core.log.LoggerFactory;
+import com.java110.entity.assetImport.ImportOwnerRoomDto;
+import com.java110.entity.assetImport.ImportResourceStoreDto;
+import com.java110.entity.component.ComponentValidateResult;
+import com.java110.intf.community.IImportOwnerRoomInnerServiceSMO;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.ImportExcelUtils;
+import com.java110.utils.util.StringUtil;
+import com.java110.vo.ResultVo;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service("importResourceStoreSMOImpl")
+public class ImportResourceStoreSMOImpl extends DefaultAbstractComponentSMO implements IImportResourceStoreSMO {
+
+    private final static Logger logger = LoggerFactory.getLogger(ImportResourceStoreSMOImpl.class);
+
+    public static final int DEFAULT_ROWS = 500;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IImportOwnerRoomInnerServiceSMO importOwnerRoomInnerServiceSMOImpl;
+
+
+    @Override
+    public ResponseEntity<String> importExcelData(IPageData pd, MultipartFile uploadFile) throws Exception {
+        try {
+            ComponentValidateResult result = this.validateStoreStaffCommunityRelationship(pd, restTemplate);
+            //InputStream is = uploadFile.getInputStream();
+            Workbook workbook = ImportExcelUtils.createWorkbook(uploadFile);  //工作簿
+            List<ImportResourceStoreDto> resourceStoreDtos = new ArrayList<ImportResourceStoreDto>();
+            //封装对象
+            getResourceStores(workbook, resourceStoreDtos, result);
+
+            //数据格式校验
+            validateRoomInfo(resourceStoreDtos);
+
+            // 保存数据
+            return dealExcelData(pd, resourceStoreDtos, result);
+        } catch (Exception e) {
+            logger.error("导入失败 ", e);
+            return new ResponseEntity<String>("非常抱歉,您填写的模板数据有误:" + e.getMessage(), HttpStatus.BAD_REQUEST);
+        }
+    }
+
+
+    /**
+     * 数据格式校验
+     *
+     * @param resourceStoreDtos
+     */
+    private void validateRoomInfo(List<ImportResourceStoreDto> resourceStoreDtos) {
+        ImportOwnerRoomDto importOwnerRoomDto = null;
+        ImportOwnerRoomDto tmpImportOwnerRoomDto = null;
+        boolean hasOwnerType = false;
+
+    }
+
+    /**
+     * 获取业主车辆信息
+     *
+     * @param workbook
+     * @param resourceStoreDtos
+     */
+    private void getResourceStores(Workbook workbook, List<ImportResourceStoreDto> resourceStoreDtos, ComponentValidateResult result) throws ParseException {
+        Sheet sheet = null;
+        sheet = ImportExcelUtils.getSheet(workbook, "物品信息");
+        List<Object[]> oList = ImportExcelUtils.listFromSheet(sheet);
+        ImportResourceStoreDto resourceStoreDto = null;
+        for (int osIndex = 0; osIndex < oList.size(); osIndex++) {
+
+            Object[] os = oList.get(osIndex);
+
+            if (osIndex == 0 || osIndex == 1) { // 第一行是 头部信息 直接跳过
+                continue;
+            }
+            if (os == null || StringUtil.isNullOrNone(os[0])) {
+                continue;
+            }
+            Assert.hasValue(os[1], (osIndex + 1) + "行物品名称不能为空");
+            Assert.hasValue(os[2], (osIndex + 1) + "行物品编号不能为空");
+            Assert.hasValue(os[3], (osIndex + 1) + "行物品单价不能为空");
+            Assert.hasValue(os[4], (osIndex + 1) + "行物品库存不能为空");
+            Assert.hasValue(os[5], (osIndex + 1) + "行物品单位不能为空");
+            Assert.hasValue(os[6], (osIndex + 1) + "行物品对外最低售价不能为空");
+            Assert.hasValue(os[7], (osIndex + 1) + "行物品对外最高售价不能为空");
+            Assert.hasValue(os[8], (osIndex + 1) + "行物品告警库存不能为空");
+            Assert.hasValue(os[9], (osIndex + 1) + "行物品类型不能为空");
+            Assert.hasValue(os[10], (osIndex + 1) + "行是否固定物品不能为空");
+            resourceStoreDto = new ImportResourceStoreDto();
+            resourceStoreDto.setCommunityId(result.getCommunityId());
+            resourceStoreDto.setResName(os[1].toString());
+            resourceStoreDto.setResCode(os[2].toString());
+            resourceStoreDto.setPrice(os[3].toString());
+            resourceStoreDto.setStock(os[4].toString());
+            resourceStoreDto.setUnitCode(os[5].toString());
+            resourceStoreDto.setOutLowPrice(os[6].toString());
+            resourceStoreDto.setOutHighPrice(os[7].toString());
+            resourceStoreDto.setWarningStock(os[8].toString());
+            resourceStoreDto.setRstName(os[9].toString());
+            resourceStoreDto.setIsFixed(os[10].toString());
+
+            if (os.length > 11) {
+                resourceStoreDto.setRemark(os[11].toString());
+            }
+            resourceStoreDtos.add(resourceStoreDto);
+
+        }
+    }
+
+
+    /**
+     * 处理房产信息
+     */
+    private ResponseEntity<String> dealExcelData(IPageData pd, List<ImportResourceStoreDto> resourceStoreDtos, ComponentValidateResult result) {
+        ResponseEntity<String> responseEntity = null;
+
+        List<ImportResourceStoreDto> tmpImportResourceStoreDtos = new ArrayList<>();
+        int flag = 0;
+
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+
+        int successCount = 0;
+        JSONObject data = new JSONObject();
+        data.put("userId", result.getUserId());
+        data.put("userName", result.getUserName());
+        data.put("storeId", result.getStoreId());
+        data.put("communityId", result.getCommunityId());
+        data.put("shId", paramIn.getString("shId"));
+
+        try {
+            for (int roomIndex = 0; roomIndex < resourceStoreDtos.size(); roomIndex++) {
+                tmpImportResourceStoreDtos.add(resourceStoreDtos.get(roomIndex));
+                if (tmpImportResourceStoreDtos.size() > DEFAULT_ROWS) {
+                    flag = saveResourceStore(pd, tmpImportResourceStoreDtos, data);
+                    tmpImportResourceStoreDtos = new ArrayList<>();
+
+                    successCount += flag;
+                }
+            }
+
+            if (tmpImportResourceStoreDtos.size() > 0) {
+                flag = saveResourceStore(pd, tmpImportResourceStoreDtos, data);
+
+                successCount += flag;
+            }
+        } catch (Exception e) {
+            logger.error("导入失败", e);
+            //按批次做撤销功能
+            throw e;
+        }
+
+        return ResultVo.createResponseEntity("总共导入:" + tmpImportResourceStoreDtos.size() + ";成功导入:" + successCount + ";导入失败:" + (tmpImportResourceStoreDtos.size() - successCount));
+    }
+
+    /**
+     * 创建费用
+     *
+     * @param pd
+     * @param tmpImportResourceStoreDtos
+     */
+    private int saveResourceStore(IPageData pd, List<ImportResourceStoreDto> tmpImportResourceStoreDtos, JSONObject data) {
+
+        JSONArray importRoomFees = JSONArray.parseArray(JSONObject.toJSONString(tmpImportResourceStoreDtos));
+        data.put("importResourceStoreDtos", importRoomFees);
+
+        String apiUrl = "resourceStore.importResourceStore";
+
+        ResponseEntity<String> responseEntity = this.callCenterService(restTemplate, pd, data.toJSONString(), apiUrl, HttpMethod.POST);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException(responseEntity.getBody());
+        }
+
+        JSONObject paramOut = JSONObject.parseObject(responseEntity.getBody());
+        if (ResultVo.CODE_OK != paramOut.getInteger("code")) {
+            throw new IllegalArgumentException(paramOut.getString("msg"));
+        }
+
+        return paramOut.getIntValue("data");
+
+    }
+
+    //解析Excel日期格式
+    public static Date DoubleToDate(Double dVal) {
+        Date tDate = new Date();
+        long localOffset = tDate.getTimezoneOffset() * 60000; //系统时区偏移 1900/1/1 到 1970/1/1 的 25569 天
+        tDate.setTime((long) ((dVal - 25569) * 24 * 3600 * 1000 + localOffset));
+        return tDate;
+    }
+}

+ 266 - 0
service-store/src/main/java/com/java110/store/cmd/resourceStore/ImportResourceStoreCmd.java

@@ -0,0 +1,266 @@
+/*
+ * Copyright 2017-2020 吴学文 and java110 team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.java110.store.cmd.resourceStore;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.annotation.Java110Cmd;
+import com.java110.core.annotation.Java110Transactional;
+import com.java110.core.context.ICmdDataFlowContext;
+import com.java110.core.event.cmd.Cmd;
+import com.java110.core.event.cmd.CmdEvent;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.dto.Dict.DictDto;
+import com.java110.dto.Dict.DictQueryDto;
+import com.java110.dto.purchaseApply.PurchaseApplyDto;
+import com.java110.dto.resourceStore.ResourceStoreDto;
+import com.java110.dto.resourceStoreType.ResourceStoreTypeDto;
+import com.java110.dto.user.UserDto;
+import com.java110.entity.assetImport.ImportResourceStoreDto;
+import com.java110.intf.common.IFileInnerServiceSMO;
+import com.java110.intf.common.IFileRelInnerServiceSMO;
+import com.java110.intf.community.DictInnerServiceSMO;
+import com.java110.intf.store.*;
+import com.java110.intf.user.IUserV1InnerServiceSMO;
+import com.java110.po.purchase.PurchaseApplyDetailPo;
+import com.java110.po.purchase.PurchaseApplyPo;
+import com.java110.po.purchase.ResourceStorePo;
+import com.java110.po.resourceStoreType.ResourceStoreTypePo;
+import com.java110.utils.exception.CmdException;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
+import com.java110.vo.ResultVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 类表述:保存
+ * 服务编码:resourceStore.saveResourceStore
+ * 请求路劲:/app/resourceStore.SaveResourceStore
+ * add by 吴学文 at 2022-06-30 12:03:19 mail: 928255095@qq.com
+ * open source address: https://gitee.com/wuxw7/MicroCommunity
+ * 官网:http://www.homecommunity.cn
+ * 温馨提示:如果您对此文件进行修改 请不要删除原有作者及注释信息,请补充您的 修改的原因以及联系邮箱如下
+ * // modify by 张三 at 2021-09-12 第10行在某种场景下存在某种bug 需要修复,注释10至20行 加入 20行至30行
+ */
+@Java110Cmd(serviceCode = "resourceStore.importResourceStore")
+public class ImportResourceStoreCmd extends Cmd {
+
+    private static Logger logger = LoggerFactory.getLogger(ImportResourceStoreCmd.class);
+
+    public static final String CODE_PREFIX_ID = "10";
+
+    @Autowired
+    private IResourceStoreV1InnerServiceSMO resourceStoreV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IResourceStoreInnerServiceSMO resourceStoreInnerServiceSMOImpl;
+
+    @Autowired
+    private IFileRelInnerServiceSMO fileRelInnerServiceSMOImpl;
+
+    @Autowired
+    private IFileInnerServiceSMO fileInnerServiceSMOImpl;
+
+    @Autowired
+    private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IPurchaseApplyInnerServiceSMO purchaseApplyInnerServiceSMOImpl;
+
+    @Autowired
+    private DictInnerServiceSMO dictInnerServiceSMOImpl;
+
+    @Autowired
+    private IResourceStoreTypeV1InnerServiceSMO resourceStoreTypeV1InnerServiceSMOImpl;
+
+    @Override
+    public void validate(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) {
+        //Assert.hasKeyAndValue(reqJson, "xxx", "xxx");
+
+
+    }
+
+    @Override
+    @Java110Transactional
+    public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
+        String userId = reqJson.getString("userId");
+        String userName = reqJson.getString("userName");
+        String storeId = reqJson.getString("storeId");
+
+        JSONArray importResourceStoreDtos = reqJson.getJSONArray("importResourceStoreDtos");
+        List<ImportResourceStoreDto> tmpImportResourceStoreDtos = JSONArray.parseArray(importResourceStoreDtos.toJSONString(), ImportResourceStoreDto.class);
+        if (tmpImportResourceStoreDtos == null || tmpImportResourceStoreDtos.size() < 1) {
+            cmdDataFlowContext.setResponseEntity(ResultVo.createResponseEntity(0));
+            return;
+        }
+        DictQueryDto dictDto = new DictQueryDto();
+        dictDto.setName("resource_store");
+        dictDto.setType("unit_code");
+        List<DictDto> dictDtos = dictInnerServiceSMOImpl.queryDict(dictDto);
+
+        List<ResourceStorePo> resourceStorePos = new ArrayList<>();
+        for (ImportResourceStoreDto importResourceStoreDto : tmpImportResourceStoreDtos) {
+            //根据物品编码查询物品资源表
+            ResourceStoreDto resourceStoreDto = new ResourceStoreDto();
+            resourceStoreDto.setResCode(importResourceStoreDto.getResName());
+            resourceStoreDto.setShId(reqJson.getString("shId"));
+            List<ResourceStoreDto> resourceStoreDtos = resourceStoreInnerServiceSMOImpl.queryResourceStores(resourceStoreDto);
+            //判断资源表里是否有该物品编码,避免物品编码重复
+            JSONObject businessResourceStore = new JSONObject();
+            //businessResourceStore.put("stock", "0");
+            businessResourceStore.put("miniStock", "0");
+            businessResourceStore.put("outLowPrice", importResourceStoreDto.getOutLowPrice());
+            businessResourceStore.put("outHighPrice", importResourceStoreDto.getOutHighPrice());
+            businessResourceStore.put("showMobile", "N");
+            businessResourceStore.put("description", importResourceStoreDto.getResName());
+            businessResourceStore.put("isFixed", importResourceStoreDto.getIsFixed());
+            businessResourceStore.put("miniUnitCode", "1");
+            businessResourceStore.put("miniUnitStock", "1");
+            businessResourceStore.put("storeId", storeId);
+            businessResourceStore.put("createTime", new Date());
+            ResourceStorePo resourceStorePo = BeanConvertUtil.covertBean(businessResourceStore, ResourceStorePo.class);
+            resourceStorePo.setShId(reqJson.getString("shId"));
+            resourceStorePo.setStock(importResourceStoreDto.getStock());
+            resourceStorePo.setResName(importResourceStoreDto.getResName());
+            resourceStorePo.setResCode(importResourceStoreDto.getResCode());
+            resourceStorePo.setRstId(getRstId(importResourceStoreDto.getRstName(), storeId));
+            resourceStorePo.setParentRstId(resourceStorePo.getRstId());
+            resourceStorePo.setPrice(importResourceStoreDto.getPrice());
+            resourceStorePo.setUnitCode(getUnitCode(importResourceStoreDto.getUnitCode(), dictDtos));
+            resourceStorePo.setRemark(importResourceStoreDto.getRemark());
+            resourceStorePo.setWarningStock(importResourceStoreDto.getWarningStock());
+            int flag = 0;
+            if (resourceStoreDtos == null || resourceStoreDtos.size() < 1) {
+                resourceStorePo.setResId(GenerateCodeFactory.getResId(GenerateCodeFactory.CODE_PREFIX_resId));
+                flag = resourceStoreV1InnerServiceSMOImpl.saveResourceStore(resourceStorePo);
+            } else {
+                resourceStorePo.setResId(resourceStoreDtos.get(0).getResId());
+                double stock = Double.parseDouble(resourceStoreDtos.get(0).getStock()) + Double.parseDouble(importResourceStoreDto.getStock());
+                resourceStorePo.setStock(stock + "");
+                resourceStorePo.setOutLowPrice("");
+                resourceStorePo.setOutHighPrice("");
+               resourceStorePo.setMiniUnitCode("");
+               resourceStorePo.setMiniStock("");
+
+                flag = resourceStoreV1InnerServiceSMOImpl.updateResourceStore(resourceStorePo);
+
+                resourceStorePo.setStock(importResourceStoreDto.getStock());
+            }
+
+            if (flag < 1) {
+                throw new CmdException("保存数据失败");
+            }
+
+            resourceStorePos.add(resourceStorePo);
+        }
+
+        inStore(reqJson, userId, userName, storeId, resourceStorePos);
+        cmdDataFlowContext.setResponseEntity(ResultVo.createResponseEntity(tmpImportResourceStoreDtos.size()));
+
+    }
+
+    private String getRstId(String rstName, String storeId) {
+
+        ResourceStoreTypeDto resourceStoreTypeDto = new ResourceStoreTypeDto();
+        resourceStoreTypeDto.setStoreId(storeId);
+        resourceStoreTypeDto.setName(rstName);
+        List<ResourceStoreTypeDto> resourceStoreTypeDtos = resourceStoreTypeV1InnerServiceSMOImpl.queryResourceStoreTypes(resourceStoreTypeDto);
+        if (resourceStoreTypeDtos != null && resourceStoreTypeDtos.size() > 0) {
+            return resourceStoreTypeDtos.get(0).getRstId();
+        }
+
+        ResourceStoreTypePo resourceStoreTypePo = new ResourceStoreTypePo();
+        resourceStoreTypePo.setDescription(rstName);
+        resourceStoreTypePo.setName(rstName);
+        resourceStoreTypePo.setStoreId(storeId);
+        resourceStoreTypePo.setRstId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_rstId));
+        resourceStoreTypePo.setParentId("0");
+        resourceStoreTypeV1InnerServiceSMOImpl.saveResourceStoreType(resourceStoreTypePo);
+        return resourceStoreTypePo.getRstId();
+    }
+
+    private String getUnitCode(String unitCode, List<DictDto> dictDtos) {
+        for (DictDto dictDto : dictDtos) {
+            if (unitCode.equals(dictDto.getName())) {
+                return dictDto.getStatusCd();
+            }
+        }
+
+        return "无";
+    }
+
+    /**
+     * 直接入库
+     *
+     * @param reqJson
+     * @param userId
+     * @param userName
+     * @param storeId
+     */
+    private void inStore(JSONObject reqJson, String userId, String userName, String storeId, List<ResourceStorePo> resourceStorePos) {
+
+        UserDto userDto = new UserDto();
+        userDto.setUserId(userId);
+        userDto.setPage(1);
+        userDto.setRow(1);
+        List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
+
+        Assert.listOnlyOne(userDtos, "用户不存在");
+
+        PurchaseApplyPo purchaseApplyPo = new PurchaseApplyPo();
+        purchaseApplyPo.setApplyOrderId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_applyOrderId));
+        purchaseApplyPo.setDescription("入库单(物品导入)");
+        purchaseApplyPo.setUserId(userId);
+        purchaseApplyPo.setUserName(userDtos.get(0).getName());
+        purchaseApplyPo.setEndUserName(userDtos.get(0).getName());
+        purchaseApplyPo.setEndUserTel(userDtos.get(0).getTel());
+        purchaseApplyPo.setStoreId(storeId);
+        purchaseApplyPo.setResOrderType(PurchaseApplyDto.RES_ORDER_TYPE_ENTER);
+        purchaseApplyPo.setState(PurchaseApplyDto.STATE_END);
+        purchaseApplyPo.setCreateTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        purchaseApplyPo.setCreateUserId(userId);
+        purchaseApplyPo.setCreateUserName(userName);
+        purchaseApplyPo.setWarehousingWay(PurchaseApplyDto.WAREHOUSING_TYPE_URGENT);
+        purchaseApplyPo.setCommunityId(reqJson.getString("communityId"));
+        //获取采购物品信息
+        List<PurchaseApplyDetailPo> purchaseApplyDetailPos = new ArrayList<>();
+        for (ResourceStorePo resourceStorePo : resourceStorePos) {
+            PurchaseApplyDetailPo purchaseApplyDetailPo = new PurchaseApplyDetailPo();
+            purchaseApplyDetailPo.setApplyOrderId(purchaseApplyPo.getApplyOrderId());
+            purchaseApplyDetailPo.setId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_applyOrderId));
+            purchaseApplyDetailPo.setPurchaseQuantity(resourceStorePo.getStock());
+            purchaseApplyDetailPo.setPurchaseRemark(resourceStorePo.getRemark());
+            purchaseApplyDetailPo.setOriginalStock(resourceStorePo.getStock());
+            purchaseApplyDetailPo.setQuantity(resourceStorePo.getStock());
+            purchaseApplyDetailPo.setPrice(resourceStorePo.getPrice());
+            purchaseApplyDetailPo.setResId(resourceStorePo.getResId());
+            purchaseApplyDetailPo.setRsId(resourceStorePo.getRssId());
+            purchaseApplyDetailPos.add(purchaseApplyDetailPo);
+            purchaseApplyPo.setPurchaseApplyDetailPos(purchaseApplyDetailPos);
+        }
+        int saveFlag = purchaseApplyInnerServiceSMOImpl.savePurchaseApply(purchaseApplyPo);
+        if (saveFlag < 1) {
+            throw new CmdException("采购申请失败");
+        }
+    }
+}

+ 36 - 0
springboot/src/main/java/com/java110/boot/components/assetImport/ImportResourceStoreComponent.java

@@ -0,0 +1,36 @@
+package com.java110.boot.components.assetImport;
+
+
+import com.java110.boot.smo.assetImport.IImportResourceStoreSMO;
+import com.java110.core.context.IPageData;
+import com.java110.core.log.LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 添加应用组件
+ */
+@Component("importResourceStore")
+public class ImportResourceStoreComponent {
+
+
+
+    @Autowired
+    private IImportResourceStoreSMO importResourceStoreSMOImpl;
+
+
+    /**
+     * 添加应用数据
+     *
+     * @param pd 页面数据封装
+     * @return ResponseEntity 对象
+     */
+    public ResponseEntity<String> importData(IPageData pd, MultipartFile uploadFile) throws Exception {
+
+        return importResourceStoreSMOImpl.importExcelData(pd, uploadFile);
+    }
+
+}

+ 24 - 0
springboot/src/main/java/com/java110/boot/smo/assetImport/IImportResourceStoreSMO.java

@@ -0,0 +1,24 @@
+package com.java110.boot.smo.assetImport;
+
+import com.java110.core.context.IPageData;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @ClassName IAssetImportSMO
+ * @Description TODO
+ * @Author wuxw
+ * @Date 2019/9/23 23:13
+ * @Version 1.0
+ * add by wuxw 2019/9/23
+ **/
+public interface IImportResourceStoreSMO {
+
+    /**
+     * 导入excel数据
+     * @param pd 前台数据封装
+     * @param uploadFile excel 文件
+     * @return ResponseEntity
+     */
+    public ResponseEntity<String> importExcelData(IPageData pd,  MultipartFile uploadFile) throws Exception;
+}

+ 213 - 0
springboot/src/main/java/com/java110/boot/smo/assetImport/impl/ImportResourceStoreSMOImpl.java

@@ -0,0 +1,213 @@
+package com.java110.boot.smo.assetImport.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.boot.smo.DefaultAbstractComponentSMO;
+import com.java110.boot.smo.assetImport.IImportResourceStoreSMO;
+import com.java110.core.context.IPageData;
+import com.java110.core.log.LoggerFactory;
+import com.java110.entity.assetImport.ImportOwnerRoomDto;
+import com.java110.entity.assetImport.ImportResourceStoreDto;
+import com.java110.entity.component.ComponentValidateResult;
+import com.java110.intf.community.IImportOwnerRoomInnerServiceSMO;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.ImportExcelUtils;
+import com.java110.utils.util.StringUtil;
+import com.java110.vo.ResultVo;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service("importResourceStoreSMOImpl")
+public class ImportResourceStoreSMOImpl extends DefaultAbstractComponentSMO implements IImportResourceStoreSMO {
+
+    private final static Logger logger = LoggerFactory.getLogger(ImportResourceStoreSMOImpl.class);
+
+    public static final int DEFAULT_ROWS = 500;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IImportOwnerRoomInnerServiceSMO importOwnerRoomInnerServiceSMOImpl;
+
+
+    @Override
+    public ResponseEntity<String> importExcelData(IPageData pd, MultipartFile uploadFile) throws Exception {
+        try {
+            ComponentValidateResult result = this.validateStoreStaffCommunityRelationship(pd, restTemplate);
+            //InputStream is = uploadFile.getInputStream();
+            Workbook workbook = ImportExcelUtils.createWorkbook(uploadFile);  //工作簿
+            List<ImportResourceStoreDto> resourceStoreDtos = new ArrayList<ImportResourceStoreDto>();
+            //封装对象
+            getResourceStores(workbook, resourceStoreDtos, result);
+
+            //数据格式校验
+            validateRoomInfo(resourceStoreDtos);
+
+            // 保存数据
+            return dealExcelData(pd, resourceStoreDtos, result);
+        } catch (Exception e) {
+            logger.error("导入失败 ", e);
+            return new ResponseEntity<String>("非常抱歉,您填写的模板数据有误:" + e.getMessage(), HttpStatus.BAD_REQUEST);
+        }
+    }
+
+
+    /**
+     * 数据格式校验
+     *
+     * @param resourceStoreDtos
+     */
+    private void validateRoomInfo(List<ImportResourceStoreDto> resourceStoreDtos) {
+        ImportOwnerRoomDto importOwnerRoomDto = null;
+        ImportOwnerRoomDto tmpImportOwnerRoomDto = null;
+        boolean hasOwnerType = false;
+
+    }
+
+    /**
+     * 获取业主车辆信息
+     *
+     * @param workbook
+     * @param resourceStoreDtos
+     */
+    private void getResourceStores(Workbook workbook, List<ImportResourceStoreDto> resourceStoreDtos, ComponentValidateResult result) throws ParseException {
+        Sheet sheet = null;
+        sheet = ImportExcelUtils.getSheet(workbook, "物品信息");
+        List<Object[]> oList = ImportExcelUtils.listFromSheet(sheet);
+        ImportResourceStoreDto resourceStoreDto = null;
+        for (int osIndex = 0; osIndex < oList.size(); osIndex++) {
+
+            Object[] os = oList.get(osIndex);
+
+            if (osIndex == 0 || osIndex == 1) { // 第一行是 头部信息 直接跳过
+                continue;
+            }
+            if (os == null || StringUtil.isNullOrNone(os[0])) {
+                continue;
+            }
+            Assert.hasValue(os[1], (osIndex + 1) + "行物品名称不能为空");
+            Assert.hasValue(os[2], (osIndex + 1) + "行物品编号不能为空");
+            Assert.hasValue(os[3], (osIndex + 1) + "行物品单价不能为空");
+            Assert.hasValue(os[4], (osIndex + 1) + "行物品库存不能为空");
+            Assert.hasValue(os[5], (osIndex + 1) + "行物品单位不能为空");
+            Assert.hasValue(os[6], (osIndex + 1) + "行物品对外最低售价不能为空");
+            Assert.hasValue(os[7], (osIndex + 1) + "行物品对外最高售价不能为空");
+            Assert.hasValue(os[8], (osIndex + 1) + "行物品告警库存不能为空");
+            Assert.hasValue(os[9], (osIndex + 1) + "行物品类型不能为空");
+            Assert.hasValue(os[10], (osIndex + 1) + "行是否固定物品不能为空");
+            resourceStoreDto = new ImportResourceStoreDto();
+            resourceStoreDto.setCommunityId(result.getCommunityId());
+            resourceStoreDto.setResName(os[1].toString());
+            resourceStoreDto.setResCode(os[2].toString());
+            resourceStoreDto.setPrice(os[3].toString());
+            resourceStoreDto.setStock(os[4].toString());
+            resourceStoreDto.setUnitCode(os[5].toString());
+            resourceStoreDto.setOutLowPrice(os[6].toString());
+            resourceStoreDto.setOutHighPrice(os[7].toString());
+            resourceStoreDto.setWarningStock(os[8].toString());
+            resourceStoreDto.setRstName(os[9].toString());
+            resourceStoreDto.setIsFixed(os[10].toString());
+
+            if (os.length > 11) {
+                resourceStoreDto.setRemark(os[11].toString());
+            }
+            resourceStoreDtos.add(resourceStoreDto);
+
+        }
+    }
+
+
+    /**
+     * 处理房产信息
+     */
+    private ResponseEntity<String> dealExcelData(IPageData pd, List<ImportResourceStoreDto> resourceStoreDtos, ComponentValidateResult result) {
+        ResponseEntity<String> responseEntity = null;
+
+        List<ImportResourceStoreDto> tmpImportResourceStoreDtos = new ArrayList<>();
+        int flag = 0;
+
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+
+        int successCount = 0;
+        JSONObject data = new JSONObject();
+        data.put("userId", result.getUserId());
+        data.put("userName", result.getUserName());
+        data.put("storeId", result.getStoreId());
+        data.put("communityId", result.getCommunityId());
+        data.put("shId", paramIn.getString("shId"));
+
+        try {
+            for (int roomIndex = 0; roomIndex < resourceStoreDtos.size(); roomIndex++) {
+                tmpImportResourceStoreDtos.add(resourceStoreDtos.get(roomIndex));
+                if (tmpImportResourceStoreDtos.size() > DEFAULT_ROWS) {
+                    flag = saveResourceStore(pd, tmpImportResourceStoreDtos, data);
+                    tmpImportResourceStoreDtos = new ArrayList<>();
+
+                    successCount += flag;
+                }
+            }
+
+            if (tmpImportResourceStoreDtos.size() > 0) {
+                flag = saveResourceStore(pd, tmpImportResourceStoreDtos, data);
+
+                successCount += flag;
+            }
+        } catch (Exception e) {
+            logger.error("导入失败", e);
+            //按批次做撤销功能
+            throw e;
+        }
+
+        return ResultVo.createResponseEntity("总共导入:" + tmpImportResourceStoreDtos.size() + ";成功导入:" + successCount + ";导入失败:" + (tmpImportResourceStoreDtos.size() - successCount));
+    }
+
+    /**
+     * 创建费用
+     *
+     * @param pd
+     * @param tmpImportResourceStoreDtos
+     */
+    private int saveResourceStore(IPageData pd, List<ImportResourceStoreDto> tmpImportResourceStoreDtos, JSONObject data) {
+
+        JSONArray importRoomFees = JSONArray.parseArray(JSONObject.toJSONString(tmpImportResourceStoreDtos));
+        data.put("importResourceStoreDtos", importRoomFees);
+
+        String apiUrl = "resourceStore.importResourceStore";
+
+        ResponseEntity<String> responseEntity = this.callCenterService(restTemplate, pd, data.toJSONString(), apiUrl, HttpMethod.POST);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException(responseEntity.getBody());
+        }
+
+        JSONObject paramOut = JSONObject.parseObject(responseEntity.getBody());
+        if (ResultVo.CODE_OK != paramOut.getInteger("code")) {
+            throw new IllegalArgumentException(paramOut.getString("msg"));
+        }
+
+        return paramOut.getIntValue("data");
+
+    }
+
+    //解析Excel日期格式
+    public static Date DoubleToDate(Double dVal) {
+        Date tDate = new Date();
+        long localOffset = tDate.getTimezoneOffset() * 60000; //系统时区偏移 1900/1/1 到 1970/1/1 的 25569 天
+        tDate.setTime((long) ((dVal - 25569) * 24 * 3600 * 1000 + localOffset));
+        return tDate;
+    }
+}