20240511修改:
分发单优化,
分类,物品,分发单明细,采购单明细数据导入
8个文件已添加
19个文件已修改
2031 ■■■■ 已修改文件
admin-web/public/static/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/departmentitem/itemdis/distribution/index.vue 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/foundation/classification/index.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/stock/procure/purchaseOrder/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/controller/BaseCategoryController.java 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/controller/BaseGoodsTemplateController.java 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/controller/FinSysTenantController.java 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/controller/LWhFormProcureController.java 374 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/controller/LWhFormTransferController.java 434 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/listener/EasyExcelListener.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/pojo/LWhFormProcureGoodsInfoParam.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/pojo/excel/ImportClassificationTemplate.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/pojo/excel/ImportGoodsInfoTemplate.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/pojo/excel/ImportProcureOrderTemplate.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/pojo/excel/LWhFormTransferTemplate.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/service/BaseCategoryService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/service/FinSysTenantDepartmentService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/service/impl/BaseCategoryServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/service/impl/FinSysTenantDepartmentServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/util/DateUtil.java 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/分发导入.xls 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/物品信息.xls 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/物品信息old.xls 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/物品分类.xls 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/采购导入.xls 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/采购导入old.xls 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/public/static/config.js
@@ -9,8 +9,8 @@
  // æŽ¥å£è¯·æ±‚地址
  ftpUrl: 'http://172.16.60.172:8083/lowConsum',//开发
  apiBaseURL: 'http://172.16.60.172:8083/lowConsum',//开发
  ftpUrl: 'http://172.16.20.9:8083/lowConsum',//开发
  apiBaseURL: 'http://172.16.20.9:8083/lowConsum',//开发
  // apiBaseURL: 'http://172.16.60.110:8083/lowConsum',//开发
admin-web/src/views/departmentitem/itemdis/distribution/index.vue
@@ -11,6 +11,7 @@
            <!--列表-->
            <div class="table-tool-bar" style="margin-bottom: 15px">
              <my-button name="新增" @click="handleAdd" site="tools" size="medium"/>
              <my-button name="导入" @click="openImport()" site="tools" size="medium" />
            </div>
            <div :style="{ 'overflow-y': 'auto', height: `calc(100vh - 320px)` }" v-loading="loading">
              <el-row v-if="list.length" class="card" :gutter="5">
@@ -22,19 +23,19 @@
                          <span>分发单号:</span>
                          <span class="value">{{ item.businessFormCode }}</span>
                          <span style="padding-left: 30px">分发状态:</span>
                          <span style="color: red" v-if="item.states === 0"  class="value">未分发</span>
                          <span v-if="item.states === 2"  class="value">已分发</span>
<!--                          <span style="padding-left: 30px">分发状态:</span>-->
<!--                          <span style="color: red" v-if="item.states === 0"  class="value">未分发</span>-->
<!--                          <span v-if="item.states === 2"  class="value">已分发</span>-->
                        </div>
                        <div class="card-header-right">
                          <!-- å¯¼å‡ºå•子 -->
                          <el-button v-if="item.states === 0" name="下载" site="form" type="primary" size="mini" @click="handleDetail(item)">
                            ä¸‹è½½
                          </el-button>
<!--                          <el-button v-if="item.states === 0" name="下载" site="form" type="primary" size="mini" @click="handleDetail(item)">-->
<!--                            ä¸‹è½½-->
<!--                          </el-button>-->
                          <el-button v-if="item.states === 0" name="上传" site="form" type="primary" size="mini" @click="handleUploadPage(item)">
                            ä¸Šä¼ 
                          </el-button>
<!--                          <el-button v-if="item.states === 0" name="上传" site="form" type="primary" size="mini" @click="handleUploadPage(item)">-->
<!--                            ä¸Šä¼ -->
<!--                          </el-button>-->
                          <el-button name="查看详情" site="form" type="primary" size="mini" @click="handleDetail(item)">
                            æŸ¥çœ‹è¯¦æƒ…
@@ -45,7 +46,7 @@
                        <div class="box"><span class="span-two">部门:</span>{{ item.inWarehouseName }}</div>
                        <div class="box"><span class="span-two">分发人:</span>{{ item.outOperatorName }}</div>
                        <div class="box">
                          <span class="span-two">分发时间:</span>{{ item.inTime | formatTime }}
                          <span class="span-two">分发时间:</span>{{ item.createTime | formatTime }}
                        </div>
                      </div>
                      <div class="card-end">
@@ -104,6 +105,13 @@
        @close="detailSetting.show = false"
        ref="detailRef"
    ></detail>
    <my-import
      :import-setting="importSetting"
      :dialog-show="importSetting.dialogShow"
      :dialog-title="importSetting.dialogTitle"
    />
  </div>
</template>
@@ -117,6 +125,7 @@
import uploadPage from './uploadPage';
import listPage from '@/views/mixins/listPage';
import {getUserDetail} from "@/utils/auth";
import {getBaseUrl} from '@/utils/base';
export default {
  name: 'index',
@@ -127,6 +136,26 @@
      loading: false,
      adddialog: false,
      list: [],
      // å¯¼å…¥
      importSetting: {
        dialogTitle: '导入',
        dialogShow: false,
        fileSettings: {
          data: {},
          uploadUrl: getBaseUrl() + '/pc/l/wh/form/transfer/import2', // ä¸Šä¼ åœ°å€
          accept: '.xls', // æ ¼å¼
          type: 'text', // å›žæ˜¾å½¢å¼
          loading: true, // å¯¼å…¥æ•ˆæžœ
        },
        /* æ¨¡æ¿ä¸‹è½½ */
        templateSettings: {
          templateName: '导入模板.xls', // åç§°
          templateUrl: SettingIplatform.apiBaseURL + '/pc/fin/sys/tenant/getImportTemplate?type=distribute', // ä¸‹è½½åœ°å€
        },
        onSuccess: null,
      },
      // æœç´¢æ¡†
      items: [
        {
@@ -203,7 +232,23 @@
        this.total = res.totalRows;
        this.loading = false;
      });
    }
    },
    openImport(){
      this.importOrg();
    },
    //导入
    importOrg() {
      this.importSetting.dialogShow = true;
      this.importSetting.onSuccess = (response, callBack) => {
        if (response.code === 1) {
          this.$message.success(response.msg);
          this.search(1);
        } else {
          this.$message.warning(response.msg);
        }
        callBack();
      };
    },
  },
};
</script>
admin-web/src/views/foundation/classification/index.vue
@@ -69,15 +69,15 @@
        dialogShow: false,
        fileSettings: {
          data: {},
          uploadUrl: getBaseUrl() + '/pc/fin/sys/tenant/import', // ä¸Šä¼ åœ°å€
          uploadUrl: getBaseUrl() + '/pc/base/category/import', // ä¸Šä¼ åœ°å€
          accept: '.xls', // æ ¼å¼
          type: 'text', // å›žæ˜¾å½¢å¼
          loading: false, // å¯¼å…¥æ•ˆæžœ
          loading: true, // å¯¼å…¥æ•ˆæžœ
        },
        /* æ¨¡æ¿ä¸‹è½½ */
        templateSettings: {
          templateName: '导入模板.xls', // åç§°
          templateUrl: SettingIplatform.apiBaseURL + '/pc/fin/sys/tenant/getImportTemplate', // ä¸‹è½½åœ°å€
          templateUrl: SettingIplatform.apiBaseURL + '/pc/fin/sys/tenant/getImportTemplate?type=classification', // ä¸‹è½½åœ°å€
        },
        onSuccess: null,
      },
@@ -108,6 +108,12 @@
              name: '新增',
              click: () => {
                this.showAdd(null);
              },
            },
            {
              name: '导入',
              click: () => {
                this.openImport(null);
              },
            },
          ],
@@ -288,6 +294,10 @@
      this.filterFrom = Object.assign(this.filterFrom, params);
      this.search(1);
    },
    openImport(){
      this.importOrg();
    },
  },
};
</script>
admin-web/src/views/stock/procure/purchaseOrder/index.vue
@@ -12,7 +12,7 @@
            <div class="table-tool-bar" style="margin-bottom: 15px">
<!--              <my-button name="新增"  check-permission="procure:order:add" @click="handleAdd" site="tools" size="medium" />-->
              <my-button name="新增" @click="handleAdd" site="tools" size="medium" />
              <my-button name="导入" @click="importSetting.dialogShow = true" site="tools" size="medium" />
              <my-button name="导入" @click="openImport()" site="tools" size="medium" />
            </div>
            <div v-loading="loading" style="margin-bottom: 15px">
              <div :style="{ 'overflow-y': 'auto', height: 'calc(100vh - 352px)' }">
@@ -226,7 +226,7 @@
          uploadUrl: getBaseUrl() + '/pc/whForm/procure/import', // ä¸Šä¼ åœ°å€
          accept: '.xls', // æ ¼å¼
          type: 'text', // å›žæ˜¾å½¢å¼
          loading: false, // å¯¼å…¥æ•ˆæžœ
          loading: true, // å¯¼å…¥æ•ˆæžœ
        },
        /* æ¨¡æ¿ä¸‹è½½ */
        templateSettings: {
@@ -300,6 +300,10 @@
          .catch(() => {});
      });
    },
    openImport(){
      this.importOrg();
    }
  },
};
</script>
consum-base/pom.xml
@@ -145,6 +145,10 @@
            <artifactId>hutool-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
</project>
consum-base/src/main/java/com/consum/base/controller/BaseCategoryController.java
@@ -1,7 +1,19 @@
package com.consum.base.controller;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.consum.base.pojo.*;
import com.consum.base.pojo.excel.ImportClassificationTemplate;
import com.consum.model.po.*;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -9,20 +21,16 @@
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.consum.base.BaseController;
import com.consum.base.core.utils.CommonUtil;
import com.consum.base.pojo.BaseCategoryParam;
import com.consum.base.pojo.ProjectTreeResult;
import com.consum.base.service.BaseCategoryService;
import com.consum.base.service.BaseGoodsTemplateService;
import com.consum.model.po.BaseCategory;
import com.iplatform.model.po.S_user_core;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.web.ResponseValue;
import io.swagger.annotations.Api;
import org.springframework.web.multipart.MultipartFile;
/**
 * @Description ç‰©å“åˆ†ç±»
@@ -70,7 +78,7 @@
        }
        // åˆ¤æ–­åŒä¸€çˆ¶ç±»id下分类名称是否重复
        BaseCategory category = this.baseCategoryService.getByCategoryNameAndFatherCategoryId(param.getCategoryName(),
            param.getFatherCategoryId());
                param.getFatherCategoryId());
        if (category != null) {
            return ResponseValue.error("分类名称已存在");
        }
@@ -214,4 +222,184 @@
        return ResponseValue.success(baseCategories);
    }
    /**
     * å¯¼å…¥ç‰©å“åˆ†ç±»
     *
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/import")
    public ResponseValue importData(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
//        if (!".xls".endsWith(originalFilename)) {
//            return ResponseValue.error("文件格式有误!");
//        }
        FinSysTenantUser sysInfo = this.getSysInfo();
        if (sysInfo == null) {
            return ResponseValue.error("当前登录用户为空");
        }
        // å½“前登录用户
        S_user_core currentUser = this.getCurrentUser();
        try {
            EasyExcelFactory.read(file.getInputStream(), ImportClassificationTemplate.class,
                    new AnalysisEventListener<ImportClassificationTemplate>() {
                        /**
                         * æ¯æ¡å­˜å‚¨çš„list
                         */
                        final List<ImportClassificationTemplate> importData = Lists.newArrayList();
                        /**
                         * è¯»å–的行号
                         */
                        Integer rowIndex = 0;
                        /**
                         * è¡¨å¤´ä¿¡æ¯
                         * @param headMap
                         * @param context
                         */
                        @Override
                        public void invokeHeadMap(Map headMap, AnalysisContext context) {
                            // éªŒè¯è¡¨å¤´æ•°é‡
                            logger.info("解析分发单的表头长度: {}", headMap.size());
                            if (headMap.size() != 4) {
                                throw new ExcelAnalysisException("上传的文件不符!");
                            }
                        }
                        /**
                         * æ•°æ®å¤„理
                         * @param data
                         * @param analysisContext
                         */
                        @Override
                        public void invoke(ImportClassificationTemplate data, AnalysisContext analysisContext) {
                            rowIndex++;
                            // è·³è¿‡
                            if (data.getCategoryOne().contains("说明:")) {
                                return;
                            }
                            if (StrUtil.isEmpty(data.getCategoryOne())) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,一级分类不能为空:" + data.getCategoryOne());
                            }
                            if (StrUtil.isEmpty(data.getCategoryTwo())) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,二级分类不能为空:" + data.getCategoryTwo());
                            }
                            if (StrUtil.isEmpty(data.getCategoryThree())) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,品类名称不能为空:" + data.getCategoryThree());
                            }
                            if (StrUtil.isEmpty(data.getType())) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,管理分类不能为空:" + data.getType());
                            }
                            importData.add(data);
                        }
                        /**
                         * æ•°æ®å¤„理导入主方法
                         * @param analysisContext
                         */
                        @Override
                        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                            for (ImportClassificationTemplate data : importData) {
                                String h1 = data.getCategoryOne();
                                String h2 = data.getCategoryTwo();
                                String h3 = data.getCategoryThree();
                                String type = data.getType();
                                BaseCategoryParam baseCategoryParam1 = new BaseCategoryParam();
                                baseCategoryParam1.setFatherCategoryId(0L);
                                baseCategoryParam1.setCategoryName(h1);
                                GenericPager<BaseCategory> baseCategoryGenericPager = baseCategoryService.queryBaseCategoryList2(baseCategoryParam1);
                                List<BaseCategory> datas = baseCategoryGenericPager.getDatas();
                                // ä¸€çº§åˆ†ç±»
                                BaseCategory D1 = null;
                                if (!CollectionUtil.isEmpty(datas)) {
                                    D1 = datas.get(0);
                                } else {
                                    // æ–°å¢žçˆ¶çº§
                                    BaseCategoryParam param = new BaseCategoryParam();
                                    param.setCategoryName(h1);
                                    param.setStates(1);
                                    int getIndex = baseCategoryService.selIndexByPid(0L);
                                    param.setOrderNumber(getIndex + 1);
                                    baseCategoryService.add(param, currentUser);
                                    GenericPager<BaseCategory> baseCategoryGenericPager2 = baseCategoryService.queryBaseCategoryList2(baseCategoryParam1);
                                    List<BaseCategory> datas2 = baseCategoryGenericPager2.getDatas();
                                    D1 = datas2.get(0);
                                }
                                // 2、二级分类 æŸ¥è¯¢ç¬¬äºŒå±‚数据
                                BaseCategoryParam baseCategoryParam2 = new BaseCategoryParam();
                                baseCategoryParam2.setCategoryName(h2);
                                baseCategoryParam2.setFatherCategoryId(D1.getId());
                                GenericPager<BaseCategory> baseCategoryGenericPager2 = baseCategoryService.queryBaseCategoryList2(baseCategoryParam2);
                                List<BaseCategory> datas2 = baseCategoryGenericPager2.getDatas();
                                BaseCategory D2 = null;
                                if (!CollectionUtil.isEmpty(datas2)) {
                                    D2 = datas2.get(0);
                                } else {
                                    // æ–°å¢žçˆ¶2级
                                    BaseCategoryParam param = new BaseCategoryParam();
                                    param.setCategoryName(h2);
                                    param.setStates(1);
                                    param.setFatherCategoryId(D1.getId());
                                    int getIndex = baseCategoryService.selIndexByPid(D1.getId());
                                    param.setOrderNumber(getIndex + 1);
                                    baseCategoryService.add(param, currentUser);
                                    GenericPager<BaseCategory> baseCategoryGenericPager4 = baseCategoryService.queryBaseCategoryList2(baseCategoryParam2);
                                    List<BaseCategory> datas4 = baseCategoryGenericPager4.getDatas();
                                    D2 = datas4.get(0);
                                }
                                // 3、三级分类(如果已经存在,那么不处理,不存在新增)
                                BaseCategoryParam baseCategoryParam3 = new BaseCategoryParam();
                                baseCategoryParam3.setCategoryName(h3);
                                baseCategoryParam3.setClassification(type);
                                baseCategoryParam3.setFatherCategoryId(D2.getId());
                                GenericPager<BaseCategory> baseCategoryGenericPager3 = baseCategoryService.queryBaseCategoryList2(baseCategoryParam3);
                                List<BaseCategory> datas3 = baseCategoryGenericPager3.getDatas();
                                if (!CollectionUtil.isEmpty(datas3)) {
                                } else {
                                    // æ–°å¢žçˆ¶2级
                                    BaseCategoryParam param = new BaseCategoryParam();
                                    param.setCategoryName(h3);
                                    param.setStates(1);
                                    param.setFatherCategoryId(D2.getId());
                                    int getIndex = baseCategoryService.selIndexByPid(D2.getId());
                                    param.setOrderNumber(getIndex + 1);
                                    param.setClassification(type);
                                    baseCategoryService.add(param, currentUser);
                                    //GenericPager<BaseCategory> baseCategoryGenericPager4 = baseCategoryService.queryBaseCategoryList2(baseCategoryParam3);
                                    //List<BaseCategory> datas4 = baseCategoryGenericPager4.getDatas();
                                    //D3 = datas4.get(0);
                                }
                            }
                        }
                        @Override
                        public void onException(Exception exception, AnalysisContext analysisContext) throws Exception {
                            if (exception instanceof ExcelDataConvertException) {
                                ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
                                Integer row = excelDataConvertException.getRowIndex() + 1;
                                Integer column = excelDataConvertException.getColumnIndex() + 1;
                                throw new ExcelAnalysisException("第" + row + "行,第" + column + "列解析异常,请正确填写");
                            } else {
                                throw new ExcelAnalysisException(exception.getMessage());
                            }
                        }
                    }).sheet(0).doRead();
        } catch (ExcelAnalysisException e) {
            return ResponseValue.error(e.getMessage());
        }catch (RuntimeException e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        }catch (Exception e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        }
        return ResponseValue.success("导入成功!");
    }
}
consum-base/src/main/java/com/consum/base/controller/BaseGoodsTemplateController.java
@@ -7,7 +7,9 @@
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.consum.base.service.*;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
@@ -17,7 +19,6 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
@@ -30,11 +31,6 @@
import com.consum.base.pojo.BaseGoodsTemplateParam;
import com.consum.base.pojo.excel.ImportGoodsInfoTemplate;
import com.consum.base.pojo.response.GoodsTemplateVO;
import com.consum.base.service.BaseCategoryService;
import com.consum.base.service.BaseGoodsTemplateService;
import com.consum.base.service.BaseWarehouseService;
import com.consum.base.service.FinSysTenantService;
import com.consum.base.service.LWhGoodsService;
import com.consum.model.po.BaseCategory;
import com.consum.model.po.BaseGoodsModels;
import com.consum.model.po.BaseGoodsTemplate;
@@ -77,6 +73,9 @@
    @Autowired
    private BaseCategoryService baseCategoryService;
    @Autowired
    private BaseGoodsModelsService baseGoodsModelsService;
    /**
     * @Description æ–°å¢žç‰©å“æ¨¡æ¿
     * @Author å¢åº†é˜³
@@ -101,7 +100,7 @@
        }
        // åˆ¤æ–­åŒä¸€åˆ†ç±»ä¸‹çš„物品名称是否重复
        BaseGoodsTemplate goodsTemplate =
            this.baseGoodsTemplateService.getByGoodsNameAndCategoryId(param.getGoodsName(), param.getCategoryId());
                this.baseGoodsTemplateService.getByGoodsNameAndCategoryId(param.getGoodsName(), param.getCategoryId());
        if (goodsTemplate != null) {
            return ResponseValue.error("物品名称已存在");
        }
@@ -181,9 +180,9 @@
     *
     * @author å¢åº†é˜³
     * @date 2023/10/25
     *       <p>
     *       ç‰©å“çš„禁用或删除,不影响已经采购入过库的物品信息。
     *       <p>
     * <p>
     * ç‰©å“çš„禁用或删除,不影响已经采购入过库的物品信息。
     * <p>
     */
    @PostMapping("/updStatus")
    public ResponseValue updateStatus() {
@@ -204,9 +203,9 @@
     * @Description æ ¹æ®ç‰©å“id删除物品
     * @Author å¢åº†é˜³
     * @Date 2023/10/25
     *       <p>
     *       ç‰©å“çš„禁用或删除,不影响已经采购入过库的物品信息。
     *       <p/>
     * <p>
     * ç‰©å“çš„禁用或删除,不影响已经采购入过库的物品信息。
     * <p/>
     */
    @DeleteMapping("/del")
    public ResponseValue updateById() {
@@ -249,7 +248,7 @@
    public ResponseValue queryGoodsTemplateByCategoryId(Long agencyId, Long categoryId) {
        // ä¸é™åˆ¶æœºæž„
        List<BaseGoodsTemplate> list = baseGoodsTemplateService.queryGoodsTemplateByCategoryId(null, categoryId,
            StatesType.NORMAL.getValue(), null);
                StatesType.NORMAL.getValue(), null);
        if (list == null) {
            return ResponseValue.error("查询失败!");
        }
@@ -258,10 +257,10 @@
    @ApiOperation(value = "调拨查询机构下所有仓库下的分类模板信息", notes = "调拨查询机构下所有仓库下的分类模板信息")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "agencyId", value = "父级机构id", required = true, dataType = "java.lang.Long",
            paramType = "query"),
        @ApiImplicitParam(name = "categoryId", value = "分类id", required = true, dataType = "Long",
            paramType = "query")})
            @ApiImplicitParam(name = "agencyId", value = "父级机构id", required = true, dataType = "java.lang.Long",
                    paramType = "query"),
            @ApiImplicitParam(name = "categoryId", value = "分类id", required = true, dataType = "Long",
                    paramType = "query")})
    @GetMapping("/query/warehouse/goods")
    public ResponseValue queryWarehouseGoods(Long agencyId, Long categoryId) {
@@ -270,7 +269,7 @@
        map.put("categoryId", categoryId);
        List<BaseWarehouse> baseWarehouseList =
            baseWarehouseService.getBaseWareHouseList(agencyId, StatesType.NORMAL.getValue());
                baseWarehouseService.getBaseWareHouseList(agencyId, StatesType.NORMAL.getValue());
        if (CollectionUtils.isEmpty(baseWarehouseList)) {
            return ResponseValue.error("机构无仓库!");
@@ -279,11 +278,11 @@
        map.put("warehouseIdList", warehouseIdList);
        String sql =
            "SELECT DISTINCT bgt.id,bgt.GOODS_NAME, CLASSIFICATION type FROM l_wh_goods g LEFT JOIN base_goods_template bgt ON g.BASE_GOODS_TEMPLATE_ID = bgt.id "
                + "WHERE WAREHOUSE_TYPE = 0 " + "AND WAREHOUSE_ID in (:warehouseIdList) "
                + "AND CATEGORY_ID = :categoryId "
                // 1:集采,2:自采
                + "AND BUY_TYPE =1";
                "SELECT DISTINCT bgt.id,bgt.GOODS_NAME, CLASSIFICATION type FROM l_wh_goods g LEFT JOIN base_goods_template bgt ON g.BASE_GOODS_TEMPLATE_ID = bgt.id "
                        + "WHERE WAREHOUSE_TYPE = 0 " + "AND WAREHOUSE_ID in (:warehouseIdList) "
                        + "AND CATEGORY_ID = :categoryId "
                        // 1:集采,2:自采
                        + "AND BUY_TYPE =1";
        List<GoodsTemplateVO> resultList = Lists.newArrayList();
        List<Map<String, Object>> goodsTemplateList = lWhGoodsService.select(sql, map, new MapperUtil());
@@ -294,82 +293,174 @@
        return ResponseValue.success("查询成功!", resultList);
    }
    /**
     * å¯¼å…¥ç‰©å“æ•°æ®
     * @param file
     * @return
     */
    @PostMapping("/import")
    public ResponseValue upload(MultipartFile file) throws IOException {
    public ResponseValue importData(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        if (!".xls".endsWith(originalFilename)) {
            return ResponseValue.error("文件格式有误!");
        }
//        if (!".xls".endsWith(originalFilename)) {
//            return ResponseValue.error("文件格式有误!");
//        }
        FinSysTenantUser sysInfo = this.getSysInfo();
        if (sysInfo == null) {
            return ResponseValue.error("当前登录用户为空");
        }
        EasyExcelFactory.read(file.getInputStream(), ImportGoodsInfoTemplate.class,
            new AnalysisEventListener<ImportGoodsInfoTemplate>() {
                List<BaseGoodsTemplateParam> list = Lists.newArrayList();
        try {
            EasyExcelFactory.read(file.getInputStream(), ImportGoodsInfoTemplate.class,
                    new AnalysisEventListener<ImportGoodsInfoTemplate>() {
                        /**
                         * ä¸»æ•°æ®
                         */
                        final List<BaseGoodsTemplateParam> list = Lists.newArrayList();
                @Override
                public void invoke(ImportGoodsInfoTemplate data, AnalysisContext analysisContext) {
                    String categoryOne = data.getCategoryOne();
                    String categoryTwo = data.getCategoryTwo();
                    String categoryThree = data.getCategoryThree();
                    String goodsName = data.getGoodsName();
                    String goodModelName = data.getGoodModelName();
                    String unit = data.getUnit();
                    String type = data.getType();
                    String agencyName = data.getAgencyName();
                        /**
                         * æ¨¡å—数据
                         */
                        final List<BaseGoodsModels> baseGoodsModelsArrayList = Lists.newArrayList();
                    BaseCategory baseCategory = baseCategoryService.getByCategoryByName(categoryThree);
                    Long categoryId = baseCategory.getId();
                        /**
                         * è¯»å–的行号
                         */
                        Integer rowIndex = 0;
                    Optional<BaseGoodsTemplateParam> optional =
                        list.stream().filter(item -> item.getCategoryId().equals(categoryId)).findFirst();
                        /**
                         * è¡¨å¤´ä¿¡æ¯
                         * @param headMap
                         * @param context
                         */
                        @Override
                        public void invokeHeadMap(Map headMap, AnalysisContext context) {
                            // éªŒè¯è¡¨å¤´æ•°é‡
                            logger.info("解析分发单的表头长度: {}", headMap.size());
                            if (headMap.size() != 7) {
                                throw new ExcelAnalysisException("上传的文件不符!");
                            }
                        }
                    if (optional.isPresent()) {
                        BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                        baseGoodsModels.setModelName(goodModelName);
                        baseGoodsModels.setUnit(unit);
                        optional.get().getModels().add(baseGoodsModels);
                    } else {
                        BaseGoodsTemplateParam baseGoodsTemplate = new BaseGoodsTemplateParam();
                        baseGoodsTemplate.setCategoryId(categoryId);
                        baseGoodsTemplate.setGoodsName(goodsName);
                        baseGoodsTemplate.setStates(1);
                        FinSysTenant finSysTenant = finSysTenantService.selectByName(agencyName);
                        baseGoodsTemplate.setAgencyId(finSysTenant.getId());
                        baseGoodsTemplate.setAgencyName(agencyName);
                        /**
                         * æ•°æ®å¤„理
                         * @param data
                         * @param analysisContext
                         */
                        @Override
                        public void invoke(ImportGoodsInfoTemplate data, AnalysisContext analysisContext) {
                            rowIndex++;
                            String categoryOne = data.getCategoryOne();
                            String categoryTwo = data.getCategoryTwo();
                            String categoryThree = data.getCategoryThree();
                            if (StrUtil.isEmpty(categoryThree)) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,品类名称不能为空:" + categoryThree);
                            }
                            String goodsName = data.getGoodsName();
                            if (StrUtil.isEmpty(goodsName)) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,品名不能为空:" + goodsName);
                            }
                            String goodModelName = data.getGoodModelName();
                            if (StrUtil.isEmpty(goodModelName)) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,规格型号不能为空:" + goodModelName);
                            }
                            String unit = data.getUnit();
                            if (StrUtil.isEmpty(unit)) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,单位不能为空:" + unit);
                            }
                            //String type = data.getType();
                            String agencyName = data.getAgencyName();
                            if (StrUtil.isEmpty(agencyName)) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,创建机构不能为空:" + agencyName);
                            }
                            BaseCategory baseCategory = baseCategoryService.getByCategoryByName(categoryThree);
                            if (baseCategory == null) {
                                throw new ExcelAnalysisException("第" + rowIndex + "条数据,未查询到此品类名称:" + categoryThree);
                            }
                            Long categoryId = baseCategory.getId();
                            // åˆ¤æ–­åŒä¸€åˆ†ç±»ä¸‹çš„物品名称是否重复
                            BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId);
                            if (goodsTemplate != null) {
                                // æŸ¥çœ‹æ­¤æ‰¹æ¬¡å’Œæ•°é‡
                                BaseGoodsModels baseGoodsModelsAdd = new BaseGoodsModels();
                                baseGoodsModelsAdd.setGoodsTemplatesId(goodsTemplate.getId());
                                baseGoodsModelsAdd.setStates(1);
                                baseGoodsModelsAdd.setModelName(goodModelName);
                                baseGoodsModelsAdd.setUnit(unit);
                                // åˆ¤æ–­åŒä¸€ç‰©å“æ¨¡æ¿id下的 è§„格型号名称是否重复
                                BaseGoodsModels baseGoodsModels = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(baseGoodsModelsAdd);
                                if (baseGoodsModels == null) {
                                    baseGoodsModelsArrayList.add(baseGoodsModelsAdd);
                                    return;
                                } else {
                                    throw new ExcelAnalysisException("第" + rowIndex + "条数据" + "物品名称:" + goodsName + "已存在,规格:" + goodModelName + ",单位:" + unit);
                                }
                            }
                            Optional<BaseGoodsTemplateParam> optional =
                                    list.stream().filter(item -> item.getCategoryId().equals(categoryId)).findFirst();
                            Optional<BaseGoodsTemplateParam> optional2 =
                                    list.stream().filter(item -> item.getGoodsName().equals(goodsName)).findFirst();
                            if (optional.isPresent() && optional2.isPresent()) {
                                BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                                baseGoodsModels.setModelName(goodModelName);
                                baseGoodsModels.setUnit(unit);
                                optional.get().getModels().add(baseGoodsModels);
                            } else {
                                BaseGoodsTemplateParam baseGoodsTemplate = new BaseGoodsTemplateParam();
                                baseGoodsTemplate.setCategoryId(categoryId);
                                baseGoodsTemplate.setGoodsName(goodsName);
                                baseGoodsTemplate.setStates(1);
                                FinSysTenant finSysTenant = finSysTenantService.selectByName(agencyName);
                                if (finSysTenant == null) {
                                    throw new ExcelAnalysisException("第" + rowIndex + "条数据,未查询到此机构:" + agencyName);
                                }
                                baseGoodsTemplate.setAgencyId(finSysTenant.getId());
                                baseGoodsTemplate.setAgencyName(agencyName);
                                List<BaseGoodsModels> models = new ArrayList<>();
                                BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                                baseGoodsModels.setModelName(goodModelName);
                                baseGoodsModels.setUnit(unit);
                                models.add(baseGoodsModels);
                                baseGoodsTemplate.setModels(models);
                                list.add(baseGoodsTemplate);
                            }
                        }
                        List<BaseGoodsModels> models = new ArrayList<>();
                        BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                        baseGoodsModels.setModelName(goodModelName);
                        baseGoodsModels.setUnit(unit);
                        models.add(baseGoodsModels);
                        baseGoodsTemplate.setModels(models);
                        /**
                         * å¤„理后导入数据
                         * @param analysisContext
                         */
                        @Override
                        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                            // ä¸»æ•°æ®å­˜å‚¨
                            for (BaseGoodsTemplateParam baseGoodsTemplate : list) {
                                baseGoodsTemplateService.add(baseGoodsTemplate, null);
                            }
                            // æ¨¡å—数据存储
                            for (BaseGoodsModels baseGoodsModels : baseGoodsModelsArrayList) {
                                baseGoodsModelsService.add(baseGoodsModels);
                            }
                        }
                        list.add(baseGoodsTemplate);
                    }
                }
                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                    for (BaseGoodsTemplateParam baseGoodsTemplate : list) {
                        baseGoodsTemplateService.add(baseGoodsTemplate, null);
                    }
                }
                @Override
                public void onException(Exception exception, AnalysisContext analysisContext) throws Exception {
                    if (exception instanceof ExcelDataConvertException) {
                        ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
                        Integer row = excelDataConvertException.getRowIndex() + 1;
                        Integer column = excelDataConvertException.getColumnIndex() + 1;
                        throw new RuntimeException("第" + row + "行,第" + column + "列解析异常,请正确填写");
                    } else {
                        throw new RuntimeException(exception.getMessage());
                    }
                }
            }).sheet(0).doRead();
                        @Override
                        public void onException(Exception exception, AnalysisContext analysisContext) throws Exception {
                            if (exception instanceof ExcelDataConvertException) {
                                ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
                                Integer row = excelDataConvertException.getRowIndex() + 1;
                                Integer column = excelDataConvertException.getColumnIndex() + 1;
                                throw new ExcelAnalysisException("第" + row + "行,第" + column + "列解析异常,请正确填写");
                            } else {
                                throw new ExcelAnalysisException(exception.getMessage());
                            }
                        }
                    }).sheet(0).doRead();
        } catch (ExcelAnalysisException e) {
            return ResponseValue.error(e.getMessage());
        } catch (RuntimeException e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        }catch (Exception e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        }
        return ResponseValue.success("导入成功!");
    }
}
consum-base/src/main/java/com/consum/base/controller/FinSysTenantController.java
@@ -187,12 +187,12 @@
        // çœè¿›å…¥ æŸ¥è¯¢ çœå’Œåœ°å¸‚ ï¼›åœ°å¸‚进入 æŸ¥è¯¢è‡ªå·±åœ°å¸‚
        // TODO Long.valueOf(getSysInfo().getTenantId())
        FinSysTenant finSysTenant =
            this.finSysTenantService.get(new FinSysTenant(Long.valueOf(getSysInfo().getTenantId())));
                this.finSysTenantService.get(new FinSysTenant(Long.valueOf(getSysInfo().getTenantId())));
        if (finSysTenant.getLv() == 3) {
            return ResponseValue.error("县区级别无法查看");
        }
        List<FinSysTenant> finSysTenantList =
            this.finSysTenantService.queryTreeById(finSysTenant.getId(), finSysTenant.getLv());
                this.finSysTenantService.queryTreeById(finSysTenant.getId(), finSysTenant.getLv());
        List<TreeNode> treeNodeList = new ArrayList<>();
        // çœæŸ¥æœ¬èº«åŠä»¥ä¸‹ å¸‚查本级 åŽ¿æ— æƒæŸ¥çœ‹
        if (finSysTenant.getLv() == 1) {
@@ -204,7 +204,7 @@
            }
        } else {
            TreeNode treeNode = new TreeNode(finSysTenantList.get(0).getId(), finSysTenantList.get(0).getName(),
                new ArrayList<>(), finSysTenantList.get(0).getParentId(), finSysTenantList.get(0).getCode());
                    new ArrayList<>(), finSysTenantList.get(0).getParentId(), finSysTenantList.get(0).getCode());
            treeNodeList.add(treeNode);
        }
        return ResponseValue.success(treeNodeList);
@@ -219,12 +219,12 @@
        // çœè¿›å…¥ æŸ¥è¯¢ çœå’Œåœ°å¸‚ ï¼›åœ°å¸‚进入 æŸ¥è¯¢è‡ªå·±åœ°å¸‚
        // TODO Long.valueOf(getSysInfo().getTenantId())
        FinSysTenant finSysTenant =
            this.finSysTenantService.get(new FinSysTenant(Long.valueOf(getSysInfo().getTenantId())));
                this.finSysTenantService.get(new FinSysTenant(Long.valueOf(getSysInfo().getTenantId())));
        if (finSysTenant.getLv() == 3) {
            return ResponseValue.error("县区级别无法查看");
        }
        Map<Long, List<FinSysTenant>> finSysTenantList =
            this.finSysTenantService.queryCountyByCityCode(finSysTenant.getId(), finSysTenant.getLv());
                this.finSysTenantService.queryCountyByCityCode(finSysTenant.getId(), finSysTenant.getLv());
        return ResponseValue.success(finSysTenantList);
    }
@@ -236,7 +236,7 @@
            while (var3.hasNext()) {
                Object obj = var3.next();
                node = this.toTreeNode((FinSysTenant)obj);
                node = this.toTreeNode((FinSysTenant) obj);
                if (node.getId() == this.defaultParentId) {
                    this.rootMap.put(node.getId(), node);
@@ -256,7 +256,7 @@
                    var3 = this.rootMap.values().iterator();
                    while (var3.hasNext()) {
                        TreeNode n = (TreeNode)var3.next();
                        TreeNode n = (TreeNode) var3.next();
                        n.setParentId(this.defaultParentId);
                        this.dummyRoot.addChild(n);
                    }
@@ -271,16 +271,16 @@
        Iterator i = childMap.values().iterator();
        while (i.hasNext()) {
            _node = (TreeNode)i.next();
            _node = (TreeNode) i.next();
            this.mountMiddleNode(_node, childMap);
        }
    }
    private void mountMiddleNode(TreeNode currentNode, Map<Long, TreeNode> childMap) {
        TreeNode _parentNode = (TreeNode)this.rootMap.get(currentNode.getParentId());
        TreeNode _parentNode = (TreeNode) this.rootMap.get(currentNode.getParentId());
        if (_parentNode == null) {
            _parentNode = (TreeNode)childMap.get(currentNode.getId());
            _parentNode = (TreeNode) childMap.get(currentNode.getId());
            if (_parentNode == null) {
                throw new NullPointerException("parent node not found, current: " + currentNode);
            }
@@ -295,7 +295,7 @@
    protected TreeNode toTreeNode(FinSysTenant entity) {
        TreeNode treeNode =
            new TreeNode(entity.getId(), entity.getName(), (List)null, entity.getParentId(), entity.getCode());
                new TreeNode(entity.getId(), entity.getName(), (List) null, entity.getParentId(), entity.getCode());
        return treeNode;
    }
@@ -307,7 +307,7 @@
            Iterator var2 = this.rootMap.values().iterator();
            while (var2.hasNext()) {
                TreeNode node = (TreeNode)var2.next();
                TreeNode node = (TreeNode) var2.next();
                list.add(node);
            }
            return list;
@@ -330,7 +330,7 @@
            whStr.append(" and name is not null and(");
            String upperCase = param.getFirstZmS().toUpperCase();
            whStr.append(
                "instr(:upperFirstZmS,F_PINYIN( SUBSTR(name, 1, 1)))>0 or instr(:upperFirstZmS2,SUBSTR(name, 1, 1))>0");
                    "instr(:upperFirstZmS,F_PINYIN( SUBSTR(name, 1, 1)))>0 or instr(:upperFirstZmS2,SUBSTR(name, 1, 1))>0");
            parameter.put("upperFirstZmS", upperCase);
            parameter.put("upperFirstZmS2", upperCase);
            whStr.append(")");
@@ -408,6 +408,10 @@
            fileName = "物品信息.xls";
        } else if ("procure".equals(type)) {
            fileName = "采购导入.xls";
        } else if ("distribute".equals(type)) {
            fileName = "分发导入.xls";
        } else if ("classification".equals(type)) {
            fileName = "物品分类.xls";
        }
        Resource resource = new ClassPathResource("import/" + fileName);
        // èŽ·å–æ–‡ä»¶è¾“å…¥æµ
@@ -440,61 +444,61 @@
        }
        EasyExcelFactory
            .read(file.getInputStream(), ImportTenantTemplate.class, new AnalysisEventListener<ImportTenantTemplate>() {
                LinkedList<FinSysTenantParam> finSysTenantParams = new LinkedList<>();
                .read(file.getInputStream(), ImportTenantTemplate.class, new AnalysisEventListener<ImportTenantTemplate>() {
                    LinkedList<FinSysTenantParam> finSysTenantParams = new LinkedList<>();
                @Override
                public void invoke(ImportTenantTemplate finSysTenantParam, AnalysisContext analysisContext) {
                    String code = finSysTenantParam.getCode();
                    String tenantName = finSysTenantParam.getTenantName();
                    ReadSheetHolder readSheetHolder = analysisContext.readSheetHolder();
                    Integer rowIndex = readSheetHolder.getRowIndex() + 1;
                    if (StringUtils.isEmpty(code) || code.length() > 20) {
                        IllegalStateException exception =
                            new IllegalStateException("第" + rowIndex + "行,机构编号不能为空或长度大于20");
                        throw exception;
                    }
                    if (null != finSysTenantService.queryOneByCode(code)) {
                        throw new IllegalStateException("第" + rowIndex + "行,机构编号已存在");
                    }
                    if (StringUtils.isEmpty(tenantName) || tenantName.length() > 100) {
                        IllegalStateException exception =
                            new IllegalStateException("第" + rowIndex + "行,机构名称不能为空或长度大于100");
                        throw exception;
                    }
                    FinSysTenantParam tenantParam = new FinSysTenantParam();
                    tenantParam.setParentId(pid);
                    tenantParam.setStatus(1);
                    tenantParam.setSummary("系统导入");
                    tenantParam.setCode(code);
                    tenantParam.setName(tenantName);
                    finSysTenantParams.add(tenantParam);
                }
                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                    finSysTenantService.insertFinSysTenantBatch(finSysTenantParams, sysInfo, lv);
                }
                @Override
                public void onException(Exception exception, AnalysisContext context) {
                    // å¦‚果是某一个单元格的转换异常 èƒ½èŽ·å–åˆ°å…·ä½“è¡Œå·
                    if (exception instanceof ExcelDataConvertException) {
                        ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
                        Integer rowIndex = excelDataConvertException.getRowIndex() + 1;
                        Integer columnIndex = excelDataConvertException.getColumnIndex();
                        String stringValue = excelDataConvertException.getCellData().getStringValue();
                        logger.error("第{}行,第{}列解析异常,数据为:{}", rowIndex, columnIndex, stringValue);
                        throw new IllegalStateException(
                            "第" + rowIndex + "行,第" + columnIndex + "列解析异常,异常数据为:[ " + stringValue + " ]");
                    }
                    if (exception instanceof IllegalStateException) {
                        throw (IllegalStateException)exception;
                    @Override
                    public void invoke(ImportTenantTemplate finSysTenantParam, AnalysisContext analysisContext) {
                        String code = finSysTenantParam.getCode();
                        String tenantName = finSysTenantParam.getTenantName();
                        ReadSheetHolder readSheetHolder = analysisContext.readSheetHolder();
                        Integer rowIndex = readSheetHolder.getRowIndex() + 1;
                        if (StringUtils.isEmpty(code) || code.length() > 20) {
                            IllegalStateException exception =
                                    new IllegalStateException("第" + rowIndex + "行,机构编号不能为空或长度大于20");
                            throw exception;
                        }
                        if (null != finSysTenantService.queryOneByCode(code)) {
                            throw new IllegalStateException("第" + rowIndex + "行,机构编号已存在");
                        }
                        if (StringUtils.isEmpty(tenantName) || tenantName.length() > 100) {
                            IllegalStateException exception =
                                    new IllegalStateException("第" + rowIndex + "行,机构名称不能为空或长度大于100");
                            throw exception;
                        }
                        FinSysTenantParam tenantParam = new FinSysTenantParam();
                        tenantParam.setParentId(pid);
                        tenantParam.setStatus(1);
                        tenantParam.setSummary("系统导入");
                        tenantParam.setCode(code);
                        tenantParam.setName(tenantName);
                        finSysTenantParams.add(tenantParam);
                    }
                }
                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        finSysTenantService.insertFinSysTenantBatch(finSysTenantParams, sysInfo, lv);
                    }
            }).doReadAll();
                    @Override
                    public void onException(Exception exception, AnalysisContext context) {
                        // å¦‚果是某一个单元格的转换异常 èƒ½èŽ·å–åˆ°å…·ä½“è¡Œå·
                        if (exception instanceof ExcelDataConvertException) {
                            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
                            Integer rowIndex = excelDataConvertException.getRowIndex() + 1;
                            Integer columnIndex = excelDataConvertException.getColumnIndex();
                            String stringValue = excelDataConvertException.getCellData().getStringValue();
                            logger.error("第{}行,第{}列解析异常,数据为:{}", rowIndex, columnIndex, stringValue);
                            throw new IllegalStateException(
                                    "第" + rowIndex + "行,第" + columnIndex + "列解析异常,异常数据为:[ " + stringValue + " ]");
                        }
                        if (exception instanceof IllegalStateException) {
                            throw (IllegalStateException) exception;
                        }
                    }
                }).doReadAll();
        return ResponseValue.success("导入成功!", 1);
    }
@@ -520,7 +524,7 @@
        if (sysInfo == null) {
            return ResponseValue.error("登录用户信息不存在");
        }
        int num = this.finSysTenantService.updateFinSysTenant(param, this.getSysInfo());
        return num > 0 ? ResponseValue.success(1) : ResponseValue.error("编辑失败!");
    }
@@ -586,7 +590,7 @@
            // çœ
            FinSysTenant finSysTenant1 = this.finSysTenantService.get(new FinSysTenant(finSysTenant.getParentId()));
            List<FinSysTenantUser> finSysTenantUserList =
                this.finSysTenantUserService.getByOrgId(finSysTenant1.getId());
                    this.finSysTenantUserService.getByOrgId(finSysTenant1.getId());
            if (!StringUtils.isEmptyList(finSysTenantUserList)) {
                FinSysTenantUserResult finSysTenantUserResult = new FinSysTenantUserResult();
                finSysTenantUserResult.setOrgId(finSysTenant1.getId());
@@ -608,7 +612,7 @@
            // å¸‚
            FinSysTenant finSysTenant2 = this.finSysTenantService.get(new FinSysTenant(finSysTenant.getParentId()));
            List<FinSysTenantUser> finSysTenantUserList2 =
                this.finSysTenantUserService.getByOrgId(finSysTenant2.getId());
                    this.finSysTenantUserService.getByOrgId(finSysTenant2.getId());
            if (!StringUtils.isEmptyList(finSysTenantUserList2)) {
                FinSysTenantUserResult finSysTenantUserResult = new FinSysTenantUserResult();
                finSysTenantUserResult.setOrgId(finSysTenant2.getId());
@@ -619,7 +623,7 @@
            // çœ
            FinSysTenant finSysTenant1 = this.finSysTenantService.get(new FinSysTenant(finSysTenant2.getParentId()));
            List<FinSysTenantUser> finSysTenantUserList =
                this.finSysTenantUserService.getByOrgId(finSysTenant1.getId());
                    this.finSysTenantUserService.getByOrgId(finSysTenant1.getId());
            if (!StringUtils.isEmptyList(finSysTenantUserList)) {
                FinSysTenantUserResult finSysTenantUserResult = new FinSysTenantUserResult();
                finSysTenantUserResult.setOrgId(finSysTenant1.getId());
@@ -633,7 +637,7 @@
    @ApiOperation(value = "获取父级机构", notes = "获取父级机构")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "Authorization", value = "token", dataType = "String", paramType = "header"),})
            @ApiImplicitParam(name = "Authorization", value = "token", dataType = "String", paramType = "header"),})
    @GetMapping("/get/parent/tenant")
    public ResponseValue getParentTenant() {
        FinSysTenantUser sysInfo = getSysInfo();
consum-base/src/main/java/com/consum/base/controller/LWhFormProcureController.java
@@ -2,25 +2,34 @@
import java.io.IOException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.fastjson.JSONObject;
import com.consum.base.core.utils.IdUtil;
import com.consum.base.pojo.*;
import com.consum.base.service.*;
import com.consum.base.util.DateUtil;
import com.consum.model.po.*;
import org.apache.commons.compress.utils.Lists;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
@@ -28,8 +37,6 @@
import com.consum.base.BaseController;
import com.consum.base.core.utils.CommonUtil;
import com.consum.base.core.utils.PageUtil;
import com.consum.base.pojo.LWhFormProcureGoodsInfoParam;
import com.consum.base.pojo.LWhFormProcureParam;
import com.consum.base.pojo.dto.GoodModelInfoDTO;
import com.consum.base.pojo.excel.ImportProcureOrderTemplate;
import com.consum.base.pojo.excel.ProcureExcelTemplate;
@@ -39,21 +46,12 @@
import com.consum.base.pojo.response.GoodsTemplateCountVO;
import com.consum.base.pojo.response.GoodsTemplateInfoVO;
import com.consum.base.pojo.response.LWhFormProcureExtendVO;
import com.consum.base.service.BaseCategoryService;
import com.consum.base.service.LWhFormProcureGoodsService;
import com.consum.base.service.LWhFormProcureService;
import com.consum.base.service.LWhProcureModelService;
import com.consum.base.service.core.LWhFormProcureCoreService;
import com.consum.model.po.BaseCategory;
import com.consum.model.po.FinSysTenantUser;
import com.consum.model.po.LWhFormProcure;
import com.consum.model.po.LWhFormProcureGoods;
import com.iplatform.model.po.S_user_core;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.utils.CollectionUtils;
import com.walker.infrastructure.utils.DateUtils;
import com.walker.web.ResponseValue;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.util.ReflectUtil;
@@ -83,6 +81,24 @@
    private LWhProcureModelService lWhProcureModelService;
    @Resource
    private BaseCategoryService baseCategoryService;
    /**
     * ä»“库服务
     */
    @Autowired
    private BaseWarehouseService baseWarehouseService;
    /**
     * å…¥åº“id
     */
    @Autowired
    private BaseGoodsTemplateService baseGoodsTemplateService;
    /**
     * ç‰©å“model服务
     */
    @Autowired
    private BaseGoodsModelsService baseGoodsModelsService;
    /**
     * @Description æ–°å¢ž
@@ -116,7 +132,7 @@
     */
    @ApiOperation(value = "采购单列表查询", notes = "采购单列表查询")
    @ApiImplicitParams({@ApiImplicitParam(name = "param", value = "采购查询条件", required = true,
        dataType = "FormProcureQryDto", paramType = "query")})
            dataType = "FormProcureQryDto", paramType = "query")})
    @GetMapping("/list")
    public ResponseValue queryFormProcureList() {
        FormProcureQry param = CommonUtil.getObjFromReq(FormProcureQry.class);
@@ -143,7 +159,7 @@
                // æŸ¥è¯¢åž‹å·æ•°é‡
                List<GoodsTemplateCountVO> procureCount =
                    lWhProcureModelService.getProcureCountByBusinessId(item.getId());
                        lWhProcureModelService.getProcureCountByBusinessId(item.getId());
                fromProcureVO.setFromProcureTemplateInfoList(procureCount);
                result.add(fromProcureVO);
@@ -238,7 +254,7 @@
            BeanUtils.copyProperties(formProcureGood, goodsTemplateInfoVO);
            List<GoodModelInfoDTO> goodsModelInfoList =
                lWhProcureModelService.getGoodsModelListByBusinessId(null, formProcureGood.getId());
                    lWhProcureModelService.getGoodsModelListByBusinessId(null, formProcureGood.getId());
            if (CollectionUtils.isEmpty(goodsModelInfoList)) {
                continue;
            }
@@ -268,7 +284,7 @@
        goodsModelVO.setUnit(goodModelInfo.getUnit());
        goodsModelVO.setCounts(goodModelInfo.getCounts());
        goodsModelVO.setTotalAmount(
            goodModelInfo.getTotalAmount() != null ? goodModelInfo.getTotalAmount().doubleValue() : null);
                goodModelInfo.getTotalAmount() != null ? goodModelInfo.getTotalAmount().doubleValue() : null);
        goodsModelVO.setWorehouseCount(goodModelInfo.getWorehouseCount());
        goodsModelVO.setPrice(goodModelInfo.getPrice());
        goodsModelVO.setBaseGoodsModelsId(goodModelInfo.getBaseGoodsModelsId());
@@ -277,7 +293,7 @@
    @ApiOperation(value = "采购单明细查询", notes = "采购单明细查询")
    @ApiImplicitParams({@ApiImplicitParam(name = "param", value = "采购单明细查询", required = true,
        dataType = "FormProcureQryDto", paramType = "query")})
            dataType = "FormProcureQryDto", paramType = "query")})
    @GetMapping("detail/list")
    public ResponseValue queryFormProcureDetailList() {
        FormProcureQry formProcureQry = CommonUtil.getObjFromReq(FormProcureQry.class);
@@ -296,7 +312,7 @@
    @ApiOperation(value = "采购单导出", notes = "采购单导出")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "采购单id", required = true, dataType = "Long", paramType = "query")})
            @ApiImplicitParam(name = "id", value = "采购单id", required = true, dataType = "Long", paramType = "query")})
    @GetMapping("/list/export")
    public ResponseValue<String> export(Long id, HttpServletResponse response) throws Exception {
        TemplateExportParams params = new TemplateExportParams("import/采购入库单.xls");
@@ -312,9 +328,9 @@
        }
        int countNum =
            exportList.stream().filter(item -> item.getNum() != null).mapToInt(ProcureExcelTemplate::getNum).sum();
                exportList.stream().filter(item -> item.getNum() != null).mapToInt(ProcureExcelTemplate::getNum).sum();
        double totalAmount = exportList.stream().filter(export -> export.getTotalAmount() != null)
            .mapToDouble(ProcureExcelTemplate::getAmount).sum();
                .mapToDouble(ProcureExcelTemplate::getAmount).sum();
        Optional<ProcureExcelTemplate> first = exportList.stream().findFirst();
        ProcureExcelTemplate templateExcelExport = first.get();
        String businessFormCode = templateExcelExport.getBusinessFormCode();
@@ -334,87 +350,267 @@
    }
    /**
     * é‡‡è´­å•导入
     *
     * @param file
     * @return
     */
    @ApiOperation(value = "采购单导入", notes = "采购单导入")
    @PostMapping("/import")
    public ResponseValue upload(MultipartFile file) throws IOException {
    public ResponseValue upload(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        if (!".xls".endsWith(originalFilename)) {
            return ResponseValue.error("文件格式有误!");
        }
        // æ–‡ä»¶æ ¼å¼æ ¡éªŒ
//        if (!".xls".endsWith(originalFilename)) {
//            return ResponseValue.error("文件格式有误!");
//        }
        FinSysTenantUser sysInfo = this.getSysInfo();
        if (sysInfo == null) {
            return ResponseValue.error("当前登录用户为空");
        }
        EasyExcelFactory.read(file.getInputStream(), ImportProcureOrderTemplate.class,
            new AnalysisEventListener<ImportProcureOrderTemplate>() {
                List<LWhFormProcureParam> list = Lists.newArrayList();
        try {
            EasyExcelFactory.read(file.getInputStream(), ImportProcureOrderTemplate.class,
                    new AnalysisEventListener<ImportProcureOrderTemplate>() {
                        /**
                         * è‡ªé‡‡é‡‡è´­å•的内层数据
                         */
                        final List<LWhFormProcureGoodsInfoParam> zcList = Lists.newArrayList();
                @Override
                public void invoke(ImportProcureOrderTemplate data, AnalysisContext analysisContext) {
                    String categoryOne = data.getCategoryOne();
                    String categoryTwo = data.getCategoryTwo();
                    String categoryThree = data.getCategoryThree();
                    String goodsName = data.getGoodsName();
                    String goodModelName = data.getGoodModelName();
                    String unit = data.getUnit();
                    String type = data.getType();
                    String agencyName = data.getAgencyName();
                    String warehouseName = data.getWarehouseName();
                    String supplierName = data.getSupplierName();
                    String price = data.getPrice();
                    String num = data.getNum();
                        /**
                         * é›†é‡‡é‡‡è´­å•的内层数据
                         */
                        final List<LWhFormProcureGoodsInfoParam> jcList = Lists.newArrayList();
                    BaseCategory baseCategory = baseCategoryService.getByCategoryByName(categoryThree);
                    Long categoryId = baseCategory.getId();
                        /**
                         * é‡‡è´­å•的主数据
                         */
                        final LWhFormProcureParam lWhFormProcureParam = new LWhFormProcureParam();
                    // Optional<BaseGoodsTemplateParam> optional =
                    // list.stream().filter(item -> item.getCategoryId().equals(categoryId)).findFirst();
                    //
                    // if (optional.isPresent()) {
                    // BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                    // baseGoodsModels.setModelName(goodModelName);
                    // baseGoodsModels.setUnit(unit);
                    // optional.get().getModels().add(baseGoodsModels);
                    // } else {
                    // BaseGoodsTemplateParam baseGoodsTemplate = new BaseGoodsTemplateParam();
                    // baseGoodsTemplate.setCategoryId(categoryId);
                    // baseGoodsTemplate.setGoodsName(goodsName);
                    // baseGoodsTemplate.setStates(1);
                    // FinSysTenant finSysTenant = finSysTenantService.selectByName(agencyName);
                    // baseGoodsTemplate.setAgencyId(finSysTenant.getId());
                    // baseGoodsTemplate.setAgencyName(agencyName);
                    //
                    // List<BaseGoodsModels> models = new ArrayList<>();
                    // BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                    // baseGoodsModels.setModelName(goodModelName);
                    // baseGoodsModels.setUnit(unit);
                    // models.add(baseGoodsModels);
                    // baseGoodsTemplate.setModels(models);
                    //
                    // list.add(baseGoodsTemplate);
                    // }
                }
                        /**
                         * ç¬¬å‡ æ¡æ•°æ®
                         */
                        Integer index = 0;
                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                    for (LWhFormProcureParam procureParam : list) {
                        // lWhFormProcureService.add(procureParam, null);
                    }
                }
                        /**
                         * è¡¨å¤´ä¿¡æ¯
                         * @param headMap
                         * @param context
                         */
                        @Override
                        public void invokeHeadMap(Map headMap, AnalysisContext context) {
                            // éªŒè¯è¡¨å¤´æ•°é‡
                            logger.info("解析分发单的表头长度: {}", headMap.size());
                            if (headMap.size() != 12) {
                                throw new ExcelAnalysisException("上传的文件不符!");
                            }
                        }
                @Override
                public void onException(Exception exception, AnalysisContext analysisContext) throws Exception {
                    if (exception instanceof ExcelDataConvertException) {
                        ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
                        Integer row = excelDataConvertException.getRowIndex() + 1;
                        Integer column = excelDataConvertException.getColumnIndex() + 1;
                        throw new RuntimeException("第" + row + "行,第" + column + "列解析异常,请正确填写");
                    } else {
                        throw new RuntimeException(exception.getMessage());
                    }
                }
            }).sheet(0).doRead();
                        /**
                         * æ•°æ®å¤„理
                         * @param data
                         * @param analysisContext
                         */
                        @Override
                        public void invoke(ImportProcureOrderTemplate data, AnalysisContext analysisContext) {
                            index++;
                            String categoryOne = data.getCategoryOne();
                            String categoryTwo = data.getCategoryTwo();
                            String categoryThree = data.getCategoryThree();
                            if (StrUtil.isEmpty(categoryThree)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,品类名称不能为空:" + categoryThree);
                            }
                            String goodsName = data.getGoodsName();
                            if (StrUtil.isEmpty(goodsName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,品名不能为空:" + goodsName);
                            }
                            String goodModelName = data.getGoodModelName();
                            if (StrUtil.isEmpty(goodModelName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,规格型号不能为空:" + goodModelName);
                            }
                            String unit = data.getUnit();
                            if (StrUtil.isEmpty(unit)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,单位不能为空:" + unit);
                            }
                            String type = data.getType();
                            //String agencyName = data.getAgencyName();
                            String warehouseName = data.getWarehouseName();
                            if (StrUtil.isEmpty(warehouseName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,所在仓库不能为空:" + warehouseName);
                            }
                            String supplierName = data.getSupplierName();
                            if (StrUtil.isEmpty(supplierName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,供货商不能为空:" + supplierName);
                            }
                            String price = data.getPrice();
                            if (StrUtil.isEmpty(price)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,单价(元)不能为空:" + price);
                            }
                            String num = data.getNum();
                            if (StrUtil.isEmpty(num)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,库存数量不能为空:" + num);
                            }
                            // ç‰©å“ç±»åž‹(自采集采)
                            String goodsType = data.getGoodsType();
                            if (StrUtil.isEmpty(goodsType)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,物品类型不能为空:" + goodsType);
                            }
                            // ç¬¬ä¸€æ¬¡è¿›æ¥æŠŠå¤–层的值设置一下
                            if (lWhFormProcureParam.getAgencyId() == null) {
                                // [通过仓库名,查找对应的仓库id]
                                FinSysTenantUser currentUser = getSysInfo();
                                BaseWarehouseParam baseWarehouseParam = new BaseWarehouseParam();
                                baseWarehouseParam.setStates(1);
                                baseWarehouseParam.setWarehouseName(warehouseName);
                                GenericPager<BaseWarehouse> pager = baseWarehouseService.queryList(baseWarehouseParam, currentUser);
                                List<BaseWarehouse> datas = pager.getDatas();
                                Long ckId = null;
                                if (!CollectionUtil.isEmpty(datas)) {
                                    BaseWarehouse baseWarehouse = datas.get(0);
                                    ckId = baseWarehouse.getId();
                                } else {
                                    // æŠ¥é”™ ä»“库不存在
                                    throw new ExcelAnalysisException("第" + index + "条数据,仓库不存在:" + warehouseName);
                                }
                                lWhFormProcureParam.setProcureDoc("");
                                lWhFormProcureParam.setWarehouseId(ckId);
                                lWhFormProcureParam.setProcureTime(DateUtil.getNowDate() + "");
                                lWhFormProcureParam.setBuyType(2);
                            }
                            // æŸ¥è¯¢åˆ†ç±»id
                            BaseCategory baseCategory = baseCategoryService.getByCategoryByName(categoryThree);
                            if (baseCategory == null) {
                                throw new ExcelAnalysisException("第" + index + "条数据,此分类不存在:" + categoryThree);
                            }
                            Long categoryId = baseCategory.getId();
                            // ä¸åŒé‡‡é›†ç±»åž‹ï¼Œä¸åŒç­›é€‰
                            Optional<LWhFormProcureGoodsInfoParam> optional = null;
                            if ("自采".equals(goodsType)) {
                                optional = zcList.stream().filter(item -> item.getCategoryId().equals(categoryId)).findFirst();
                            } else if ("集采".equals(goodsType)) {
                                optional = jcList.stream().filter(item -> item.getCategoryId().equals(categoryId)).findFirst();
                            }
                            Optional<LWhFormProcureGoodsInfoParam> optional1 = null;
                            if ("自采".equals(goodsType)) {
                                optional1 = zcList.stream().filter(item -> item.getGoodsTemplateName().equals(goodsName)).findFirst();
                            } else if ("集采".equals(goodsType)) {
                                optional1 = jcList.stream().filter(item -> item.getGoodsTemplateName().equals(goodsName)).findFirst();
                            }
                            // å“ç±» å’Œ å•†å“åå®Œå…¨ä¸€æ ·æ‰åŠ å…¥
                            if (optional.isPresent() && optional1.isPresent()) {
                                LWhProcureModelParam lWhProcureModelParam = new LWhProcureModelParam();
                                lWhProcureModelParam.setCounts(StrUtil.isEmpty(num) ? 0 : Integer.valueOf(num));
                                lWhProcureModelParam.setPrice(new BigDecimal(price).multiply(new BigDecimal("100")).longValue());
                                lWhProcureModelParam.setBaseUnit(unit);
                                // æ•°æ®ç¬¬äºŒå±‚-物品的id
                                BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId);
                                if (goodsTemplate == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据,此物品不存在:" + goodsName);
                                }
                                BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                                baseGoodsModels.setModelName(goodModelName);
                                baseGoodsModels.setGoodsTemplatesId(goodsTemplate.getId());
                                BaseGoodsModels byModelNameAndGoodsTemplatesId = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(baseGoodsModels);
                                if (byModelNameAndGoodsTemplatesId == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据" + "品名:" + goodsName + ",规格型号:" + goodModelName + "未找到");
                                }
                                lWhProcureModelParam.setBaseGoodsModelsId(byModelNameAndGoodsTemplatesId.getId());
                                optional.get().getModels().add(lWhProcureModelParam);
                            } else {
                                LWhFormProcureGoodsInfoParam lWhFormProcureGoodsInfoParam = new LWhFormProcureGoodsInfoParam();
                                // æ•°æ®ç¬¬äºŒå±‚-物品三级分类第三级的id
                                lWhFormProcureGoodsInfoParam.setCategoryId(categoryId);
                                // æ•°æ®ç¬¬äºŒå±‚-物品的id
                                BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId);
                                if (goodsTemplate == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据,此物品不存在:" + goodsName);
                                }
                                lWhFormProcureGoodsInfoParam.setBaseGoodsTemplateId(goodsTemplate.getId());
                                // æ•°æ®ç¬¬äºŒå±‚-供应商
                                lWhFormProcureGoodsInfoParam.setSupplier(supplierName);
                                // æ•°æ®ç¬¬äºŒå±‚-物品名
                                lWhFormProcureGoodsInfoParam.setGoodsTemplateName(goodsName);
                                // æ•°æ®ç¬¬ä¸‰å±‚数据
                                List<LWhProcureModelParam> lWhProcureModelParams = new ArrayList<>();
                                LWhProcureModelParam lWhProcureModelParam = new LWhProcureModelParam();
                                lWhProcureModelParam.setCounts(StrUtil.isEmpty(num) ? 0 : Integer.valueOf(num));
                                BigDecimal multiply = new BigDecimal(price).multiply(new BigDecimal("100"));
                                lWhProcureModelParam.setPrice(multiply.longValue());
                                lWhProcureModelParam.setBaseUnit(unit);
                                BaseGoodsModels baseGoodsModels = new BaseGoodsModels();
                                baseGoodsModels.setModelName(goodModelName);
                                baseGoodsModels.setGoodsTemplatesId(goodsTemplate.getId());
                                BaseGoodsModels byModelNameAndGoodsTemplatesId = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(baseGoodsModels);
                                if (byModelNameAndGoodsTemplatesId == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据" + "品名:" + goodsName + ",规格型号:" + goodModelName + "未找到");
                                }
                                lWhProcureModelParam.setBaseGoodsModelsId(byModelNameAndGoodsTemplatesId.getId());
                                lWhProcureModelParams.add(lWhProcureModelParam);
                                lWhFormProcureGoodsInfoParam.setModels(lWhProcureModelParams);
                                // ä¸åŒé‡‡é›†ç±»åž‹åˆ°ä¸åŒlist
                                if ("自采".equals(goodsType)) {
                                    zcList.add(lWhFormProcureGoodsInfoParam);
                                } else if ("集采".equals(goodsType)) {
                                    jcList.add(lWhFormProcureGoodsInfoParam);
                                }
                            }
                        }
                        /**
                         * å¤„理后的数据导入
                         * @param analysisContext
                         */
                        @Override
                        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                            lWhFormProcureParam.setProcureGoods(zcList);
                            // é‡‡è´­å•-自采
                            long zcId = IdUtil.generateId();
                            lWhFormProcureParam.setId(zcId);
                            String zcJsonString = JSONObject.toJSONString(lWhFormProcureParam);
                            logger.info("导入采购单(自采)json数据 --------------------");
                            logger.info(zcJsonString);
                            add(lWhFormProcureParam);
                            // é‡‡è´­å•-集采
                            long jcId = IdUtil.generateId();
                            lWhFormProcureParam.setId(jcId);
                            lWhFormProcureParam.setBuyType(1);
                            lWhFormProcureParam.setProcureGoods(jcList);
                            String jcJsonString = JSONObject.toJSONString(lWhFormProcureParam);
                            logger.info("导入采购单(集采)json数据 --------------------");
                            logger.info(jcJsonString);
                            add(lWhFormProcureParam);
                            // è‡ªé‡‡å’Œé›†é‡‡å…¥åº“
                            income(zcId);
                            income(jcId);
                        }
                        @Override
                        public void onException(Exception exception, AnalysisContext analysisContext) throws Exception {
                            if (exception instanceof ExcelDataConvertException) {
                                ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
                                Integer row = excelDataConvertException.getRowIndex() + 1;
                                Integer column = excelDataConvertException.getColumnIndex() + 1;
                                throw new ExcelAnalysisException("第" + row + "行,第" + column + "列解析异常,请正确填写");
                            } else {
                                throw new ExcelAnalysisException(exception.getMessage());
                            }
                        }
                    }).sheet(0).doRead();
        }catch (ExcelAnalysisException e) {
            return ResponseValue.error(e.getMessage());
        }catch (RuntimeException e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        }
        return ResponseValue.success("导入成功!");
    }
consum-base/src/main/java/com/consum/base/controller/LWhFormTransferController.java
@@ -1,6 +1,7 @@
package com.consum.base.controller;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
@@ -10,10 +11,24 @@
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.fastjson.JSONObject;
import com.consum.base.pojo.*;
import com.consum.base.pojo.excel.ImportProcureOrderTemplate;
import com.consum.base.pojo.excel.LWhFormTransferTemplate;
import com.consum.base.pojo.query.WarehouseQry;
import com.consum.base.service.*;
import com.consum.base.util.DateUtil;
import com.consum.base.util.ExcelStyleUtil;
import com.consum.model.po.*;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.ss.usermodel.Workbook;
@@ -27,10 +42,6 @@
import com.consum.base.core.type.TransferStatesType;
import com.consum.base.core.utils.CommonUtil;
import com.consum.base.core.utils.IdUtil;
import com.consum.base.pojo.GoodsUseRecordVO;
import com.consum.base.pojo.LWhFormTransferGoodsInfoParam;
import com.consum.base.pojo.RecordUserInfoVO;
import com.consum.base.pojo.UseRecordSkuVO;
import com.consum.base.pojo.dto.GoodsInfoDTO;
import com.consum.base.pojo.dto.UseRecordDTO;
import com.consum.base.pojo.excel.TransferExcelTemplate;
@@ -42,20 +53,7 @@
import com.consum.base.pojo.response.GoodsTemplateCountVO;
import com.consum.base.pojo.response.LWHFromTransferExtendVO;
import com.consum.base.pojo.response.TransferInfoVO;
import com.consum.base.service.BaseWarehouseService;
import com.consum.base.service.LGoodsUserRecordCoreService;
import com.consum.base.service.LWhFormTransferService;
import com.consum.base.service.LWhGoodsService;
import com.consum.base.service.LWhProcureModelService;
import com.consum.base.service.LWhProcureModelUserRecordService;
import com.consum.base.service.LWhProcureModelUserService;
import com.consum.base.service.core.LWhFormTransferCoreService;
import com.consum.model.po.BaseWarehouse;
import com.consum.model.po.FinSysTenantUser;
import com.consum.model.po.LWhFormTransfer;
import com.consum.model.po.LWhProcureModel;
import com.consum.model.po.LWhProcureModelUser;
import com.consum.model.po.LWhProcureModelUserRecord;
import com.iplatform.model.po.S_user_core;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.utils.CollectionUtils;
@@ -68,6 +66,7 @@
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.multipart.MultipartFile;
/**
 * @Description è°ƒæ‹¨ç®¡ç†
@@ -95,6 +94,14 @@
    private LWhGoodsService lWhGoodsService;
    @Autowired
    private BaseWarehouseService baseWarehouseService;
    @Autowired
    private FinSysTenantDepartmentService departmentService;
    @Autowired
    private BaseCategoryService baseCategoryService;
    @Autowired
    private BaseGoodsTemplateService baseGoodsTemplateService;
    @Autowired
    private BaseGoodsModelsService baseGoodsModelsService;
    /**
     * @Description æ–°å¢ž
@@ -118,10 +125,69 @@
            return ResponseValue.error("调拨单不能为空");
        }
        long id = this.lWhFormTransferService.add(param, this.getSysInfo(), StrUtil.isEmpty(param.getProcureDoc()));
        if(id == -1L){
        if (id == -1L) {
            return ResponseValue.error("您不是库管员");
        }
        if(id == -2L){
        if (id == -2L) {
            return ResponseValue.error("仓库不存在");
        }
        Integer transferBusinessType = param.getTransferBusinessType();
        // éƒ¨é—¨åˆ†å‘业务需要处理
        // æ‹†åˆ† æ–°é€»è¾‘
        if (transferBusinessType == 1 && !StrUtil.isEmpty(param.getProcureDoc())) {
            // å…ˆå‡ºåº“,再入库
            // å‡ºåº“前 è®¾ç½®å‡ºåº“仓库
            List<LWhProcureModel> modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.BUMENFENFA, id);
            Set<Long> baseModelIds =
                    modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
            FinSysTenantUser sysTenantUser = this.getSysInfo();
            String agencyId = sysTenantUser.getTenantId();
            List<BaseWarehouse> baseWarehouseList =
                    baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue());
            Set<Long> wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet());
            // é€šè¿‡è°ƒæ‹¨å•中的型号id查询出该型号物品所在的仓库位置
            List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null);
            GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null);
            if (ObjectUtils.isEmpty(goodsInfoDTO)) {
                return ResponseValue.error("该型号没有库存可使用");
            }
            Long wareHouseId = goodsInfoDTO.getWarehouseId();
            String warehouseName = goodsInfoDTO.getWarehouseName();
            LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id);
            lWhFormTransfer.setOutWarehouseId(wareHouseId);
            lWhFormTransfer.setOutWarehouseName(warehouseName);
            lWhFormTransferService.update(lWhFormTransfer);
            Long l = lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
            if (l == -1L) {
                return ResponseValue.error("仓库数量不足");
            }
            lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), param.getOperatorName());
        }
        return ResponseValue.success();
    }
    public ResponseValue add2(LWhFormTransferParam param) throws Exception {
        S_user_core currentUser = this.getCurrentUser();
        if (currentUser == null) {
            return ResponseValue.error("登录用户信息不存在");
        }
        List<LWhFormTransferGoodsInfoParam> transferGoods = param.getTransferGoods();
        if (CollectionUtils.isEmpty(transferGoods)) {
            return ResponseValue.error("调拨单不能为空");
        }
        FinSysTenantUser sysInfo = this.getSysInfo();
        long id = this.lWhFormTransferService.add(param, sysInfo, true);
        if (id == -1L) {
            return ResponseValue.error("您不是库管员");
        }
        if (id == -2L) {
            return ResponseValue.error("仓库不存在");
        }
@@ -154,7 +220,7 @@
            lWhFormTransfer.setOutWarehouseName(warehouseName);
            lWhFormTransferService.update(lWhFormTransfer);
            Long l = lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
            if(l == -1L){
            if (l == -1L) {
                return ResponseValue.error("仓库数量不足");
            }
            lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), param.getOperatorName());
@@ -409,7 +475,7 @@
        if (type == 0) {
            params = new TemplateExportParams("import/调拨入库单.xls");
            fileName = "调拨入库单";
        }else if (type == 1) {
        } else if (type == 1) {
            params = new TemplateExportParams("import/调拨入库单1.xls");
            fileName = "调拨入库单";
        } else {
@@ -614,4 +680,330 @@
        lWhFormTransferService.queryDepartmentTransferOrder();
        return ResponseValue.success(transferInfoVO);
    }
    /**
     * åˆ†å‘单导入
     *
     * @param file
     * @return
     */
    @ApiOperation(value = "分发单导入", notes = "分发单导入")
    @PostMapping("/import2")
    public ResponseValue import2(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        // æ–‡ä»¶æ ¼å¼æ ¡éªŒ
//        if (!".xls".endsWith(originalFilename)) {
//            return ResponseValue.error("文件格式有误!");
//        }
        FinSysTenantUser sysInfo = this.getSysInfo();
        if (sysInfo == null) {
            return ResponseValue.error("当前登录用户为空");
        }
        try {
            EasyExcelFactory.read(file.getInputStream(), LWhFormTransferTemplate.class,
                    new AnalysisEventListener<LWhFormTransferTemplate>() {
                        /**
                         * åˆ†å‘单主数据
                         */
                        final List<LWhFormTransferGoodsInfoParam> list = Lists.newArrayList();
                        /**
                         * åˆ†å‘单的外层的主数据
                         */
                        final LWhFormTransferParam lWhFormTransferParam = new LWhFormTransferParam();
                        /**
                         * è¡Œç´¢å¼•
                         */
                        Integer index = 0;
                        /**
                         * è¡¨å¤´ä¿¡æ¯
                         * @param headMap
                         * @param context
                         */
                        @Override
                        public void invokeHeadMap(Map headMap, AnalysisContext context) {
                            // éªŒè¯è¡¨å¤´æ•°é‡
                            logger.info("解析分发单的表头长度: {}", headMap.size());
                            if (headMap.size() != 15) {
                                throw new ExcelAnalysisException("上传的文件不符!");
                            }
                        }
                        /**
                         * å¯¼å…¥ä¸»(文件数据处理)
                         * @param data
                         * @param analysisContext
                         */
                        @Override
                        public void invoke(LWhFormTransferTemplate data, AnalysisContext analysisContext) {
                            index++;
                            String categoryOne = data.getCategoryOne();
                            String categoryTwo = data.getCategoryTwo();
                            String categoryThree = data.getCategoryThree();
                            if (StrUtil.isEmpty(categoryThree)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,品类名称不能为空:" + categoryThree);
                            }
                            String goodsName = data.getGoodsName();
                            if (StrUtil.isEmpty(goodsName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,品名不能为空:" + goodsName);
                            }
                            String goodModelName = data.getGoodModelName();
                            if (StrUtil.isEmpty(goodModelName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,规格型号不能为空:" + goodModelName);
                            }
                            String unit = data.getUnit();
                            String type = data.getType();
                            if (StrUtil.isEmpty(type)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,管理分类不能为空:" + type);
                            }
                            String agencyName = data.getAgencyName();
                            if (StrUtil.isEmpty(agencyName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,创建机构不能为空:" + agencyName);
                            }
                            //String warehouseName = data.getWarehouseName();
                            String supplierName = data.getSupplierName();
                            //String price = data.getPrice();
                            String num = data.getNum();
                            if (StrUtil.isEmpty(num)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,领用数量不能为空:" + num);
                            }
                            // ç‰©å“ç±»åž‹(自采集采)
                            //String goodsType = data.getGoodsType();
                            // ä½¿ç”¨äººéƒ¨é—¨
                            String userDepartment = data.getUserDepartment();
                            if (StrUtil.isEmpty(userDepartment)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,使用人部门不能为空:" + userDepartment);
                            }
                            // å¡«æŠ¥äºº
                            String reportedBy = data.getReportedBy();
                            if (StrUtil.isEmpty(reportedBy)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,填报人不能为空:" + reportedBy);
                            }
                            // ä½¿ç”¨äºº
                            String user = data.getUser();
                            if (StrUtil.isEmpty(user)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,使用人不能为空:" + user);
                            }
                            // è”系电话
                            String userContactPhone = data.getUserContactPhone();
                            if (StrUtil.isEmpty(userContactPhone)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,联系电话不能为空:" + userContactPhone);
                            }
                            // ç¬¬ä¸€æ¬¡è¿›æ¥æŠŠå¤–层的值设置一下
                            if (StrUtil.isEmpty(lWhFormTransferParam.getDepartmentName())) {
                                // æœºæž„id (根据 æœºæž„名称和部门名称 æŸ¥æ‰¾å¯¹åº”çš„id)
                                FinSysTenantDepartment finSysTenantDepartment = departmentService.queryIdByTenDepName(agencyName, userDepartment);
                                if (finSysTenantDepartment == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据 " + "机构-部门未找到:[" + agencyName + "-" + userDepartment + "]");
                                }
                                lWhFormTransferParam.setTransferBusinessType(1);
                                lWhFormTransferParam.setDepartmentId(finSysTenantDepartment.getId());
                                lWhFormTransferParam.setDepartmentName(userDepartment);
                                lWhFormTransferParam.setOperatorName(reportedBy);
                                lWhFormTransferParam.setTel(0L);
                                lWhFormTransferParam.setCreateTime(DateUtil.getNowDate());
                                lWhFormTransferParam.setProcureDoc("");
                                lWhFormTransferParam.setOutAgencyId(finSysTenantDepartment.getTenantId());
                            }
                            // æŸ¥è¯¢åˆ†ç±»id
                            BaseCategory baseCategory = baseCategoryService.getByCategoryByName(categoryThree);
                            if (baseCategory == null) {
                                throw new ExcelAnalysisException("第" + index + "条数据" + "此分类未找到:" + categoryThree);
                            }
                            Long categoryId = baseCategory.getId();
                            // ä¸åŒé‡‡é›†ç±»åž‹ï¼Œä¸åŒç­›é€‰
                            Optional<LWhFormTransferGoodsInfoParam> optional = null;
                            // ç­›é€‰ç±»åž‹
                            optional = list.stream().filter(item -> item.getBaseCategoryId().equals(categoryId)).findFirst();
                            // ç­›é€‰ç‰©å“å
                            Optional<LWhFormTransferGoodsInfoParam> optional2 =
                                    list.stream().filter(item -> item.getGoodsTemplateName().equals(goodsName)).findFirst();
                            // æ•°æ®ç¬¬äºŒå±‚-物品的id
                            BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId);
                            if (goodsTemplate == null) {
                                throw new ExcelAnalysisException("第" + index + "条数据" + "此物品未找到:" + goodsName);
                            }
                            if (optional.isPresent() && optional2.isPresent()) {
                                // å†…层list(领用人)
                                List<LWhTransferModelParam> models3 = optional.get().getModels();
                                // æ‰¾åž‹å·åå­—一样的
                                Optional<LWhTransferModelParam> optional3 =
                                        models3.stream().filter(item -> item.getBaseGoodsModelsName().equals(goodModelName)).findFirst();
                                int counts = 0;
                                for (LWhTransferModelParam m : models3) {
                                    int addNum = 0;
                                    if (m.getNum() != null) {
                                        addNum = m.getCounts();
                                    }
                                    counts += addNum;
                                }
                                // åŒä¸€ä¸ªåž‹å·çš„
                                if (optional3.isPresent()) {
                                    if ("A".equals(type)) {
                                        LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam();
                                        lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num));
                                        lWhProcureModelUserParam.setNowUserName(user);
                                        lWhProcureModelUserParam.setNowUserPhone(new Long(userContactPhone));
                                        Integer counts1 = optional3.get().getCounts();
                                        Integer num1 = optional3.get().getNum();
                                        optional3.get().setCounts(Integer.valueOf(num) + counts1);
                                        optional3.get().setNum(Integer.valueOf(num) + num1);
                                        optional3.get().getProcureModelUserList().add(lWhProcureModelUserParam);
                                    } else {
                                        Integer counts1 = optional3.get().getCounts();
                                        Integer num1 = optional3.get().getNum();
                                        optional3.get().setCounts(Integer.valueOf(num) + counts1);
                                        optional3.get().setNum(Integer.valueOf(num) + num1);
                                    }
                                } else {
                                    // æ­¤ç‰©å“å¦å¤–的规格型号
                                    LWhTransferModelParam lWhTransferModelParam = new LWhTransferModelParam();
                                    // æ¨¡æ¿çš„id
                                    BaseGoodsModels selBaseGoodsModels = new BaseGoodsModels();
                                    selBaseGoodsModels.setModelName(goodModelName);
                                    selBaseGoodsModels.setGoodsTemplatesId(goodsTemplate.getId());
                                    BaseGoodsModels selByModelNameAndGoodsTemplatesId = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(selBaseGoodsModels);
                                    if (selByModelNameAndGoodsTemplatesId == null) {
                                        throw new ExcelAnalysisException("第" + index + "条数据" + "品名:" + goodsName + ",规格型号:" + goodModelName + "未找到");
                                    }
                                    lWhTransferModelParam.setBaseGoodsModelsId(selByModelNameAndGoodsTemplatesId.getId());
                                    // å†…层list的数量之和
                                    lWhTransferModelParam.setCounts(Integer.valueOf(num));
                                    // æ¨¡æ¿åç§°
                                    lWhTransferModelParam.setBaseGoodsModelsName(goodModelName);
                                    List<LWhProcureModelUserParam> addLWhProcureModelUserParam = new ArrayList<>();
                                    LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam();
                                    lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num));
                                    // æŸ¥è¯¢åº“存数量
                                    Integer nowNum = selectAllNumber(lWhFormTransferParam.getOutAgencyId(), selByModelNameAndGoodsTemplatesId.getId());
                                    if(nowNum<new Integer(num)){
                                        throw new ExcelAnalysisException("第" + index + "条数据" + "品名:[" + goodsName + "] è§„格型号:[" + goodModelName + "] åº“存数量不足:["+nowNum+"]");
                                    }
                                    lWhProcureModelUserParam.setNowUserName(user);
                                    lWhProcureModelUserParam.setNowUserPhone(new Long(userContactPhone));
                                    addLWhProcureModelUserParam.add(lWhProcureModelUserParam);
                                    lWhTransferModelParam.setProcureModelUserList(addLWhProcureModelUserParam);
                                    optional.get().getModels().add(lWhTransferModelParam);
                                }
                            } else {
                                LWhFormTransferGoodsInfoParam lWhFormTransferGoodsInfoParam = new LWhFormTransferGoodsInfoParam();
                                // åˆ†ç±»id
                                lWhFormTransferGoodsInfoParam.setBaseCategoryId(categoryId);
                                // æ•°æ®ç¬¬äºŒå±‚-物品的id
                                //BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId);
                                BaseGoodsModels selBaseGoodsModels = new BaseGoodsModels();
                                selBaseGoodsModels.setModelName(goodModelName);
                                selBaseGoodsModels.setGoodsTemplatesId(goodsTemplate.getId());
                                BaseGoodsModels selByModelNameAndGoodsTemplatesId = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(selBaseGoodsModels);
                                if (selByModelNameAndGoodsTemplatesId == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据 " + "品名:" + goodsName + ",规格型号:" + goodModelName + "未找到");
                                }
                                // ç‰©å“çš„id ï¼šçˆ±çŽ›ç”µåŠ¨è½¦
                                lWhFormTransferGoodsInfoParam.setBaseGoodsTemplateId(goodsTemplate.getId());
                                lWhFormTransferGoodsInfoParam.setGoodsTemplateName(goodsName);
                                // å†…层
                                LWhTransferModelParam lWhTransferModelParam = new LWhTransferModelParam();
                                // è§„æ ¼id
                                lWhTransferModelParam.setBaseGoodsModelsId(selByModelNameAndGoodsTemplatesId.getId());
                                // æ–°å¢žçš„æ—¶å€™é»˜è®¤ä¸€æ¡
                                lWhTransferModelParam.setCounts(new Integer(num));
                                lWhTransferModelParam.setNum(new Integer(num));
                                List<LWhProcureModelUserParam> lWhFormProcureGoodsInfoParam = new ArrayList<>();
                                LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam();
                                lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num));
                                // æŸ¥è¯¢åº“存数量
                                Integer nowNum = selectAllNumber(lWhFormTransferParam.getOutAgencyId(), selByModelNameAndGoodsTemplatesId.getId());
                                if(nowNum<new Integer(num)){
                                    throw new ExcelAnalysisException("第" + index + "条数据 " + "品名:[" + goodsName + "] è§„格型号:[" + goodModelName + "] åº“存数量不足:["+nowNum+"]");
                                }
                                lWhProcureModelUserParam.setNowUserName(user);
                                lWhProcureModelUserParam.setNowUserPhone(new Long(userContactPhone));
                                lWhFormProcureGoodsInfoParam.add(lWhProcureModelUserParam);
                                lWhTransferModelParam.setProcureModelUserList(lWhFormProcureGoodsInfoParam);
                                lWhTransferModelParam.setBaseGoodsModelsName(goodModelName);
                                List<LWhTransferModelParam> lWhTransferModelParams = new ArrayList<>();
                                lWhTransferModelParams.add(lWhTransferModelParam);
                                lWhFormTransferGoodsInfoParam.setModels(lWhTransferModelParams);
                                lWhFormTransferGoodsInfoParam.setType(type);
                                list.add(lWhFormTransferGoodsInfoParam);
                            }
                        }
                        /**
                         * åˆ†å‘单导入主方法
                         * @param analysisContext
                         */
                        @Override
                        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                            lWhFormTransferParam.setTransferGoods(list);
                            long id = IdUtil.generateId();
                            //lWhFormTransferParam.setProcureDoc("[{\"fileType\":\"png\",\"id\":\"883654049218335\",\"name\":\"微信截图_20240426143552.png\",\"url\":\"http://172.16.60.172:8083/lowConsum/file/2024/5/883654049218335.png\",\"path\":\"2024/5/883654049218335.png\",\"attSize\":6772}]");
                            lWhFormTransferParam.setProcureDoc("-");
                            lWhFormTransferParam.setId(id);
                            String jsonString = JSONObject.toJSONString(lWhFormTransferParam);
                            logger.info("导入分发单json数据 --------------------");
                            logger.info(jsonString);
                            // åˆ†å‘单据
                            try {
                                ResponseValue responseValue = add2(lWhFormTransferParam);
                                logger.info(responseValue.toString());
                            } catch (Exception e) {
                                e.printStackTrace();
                                throw new RuntimeException(e);
                            }
                        }
                        @Override
                        public void onException(Exception exception, AnalysisContext analysisContext) throws Exception {
                            if (exception instanceof ExcelDataConvertException) {
                                ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
                                Integer row = excelDataConvertException.getRowIndex() + 1;
                                Integer column = excelDataConvertException.getColumnIndex() + 1;
                                throw new ExcelAnalysisException("第" + row + "行,第" + column + "列解析异常,请正确填写");
                            } else {
                                throw new ExcelAnalysisException(exception.getMessage());
                            }
                        }
                    }).sheet(0).doRead();
        } catch (ExcelAnalysisException e) {
            return ResponseValue.error(e.getMessage());
        } catch (RuntimeException e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        }
        return ResponseValue.success("导入成功!");
    }
    /**
     * æŸ¥è¯¢åº“å­˜Id
     * @param agencyId
     * @param baseGoodsModelsId
     * @return
     */
    public Integer selectAllNumber(Long agencyId,Long baseGoodsModelsId) {
        WarehouseQry warehouseQry = new WarehouseQry();
        warehouseQry.setAgencyId(agencyId);
        warehouseQry.setBaseGoodsModelsId(baseGoodsModelsId);
        List<BaseWarehouse> baseWarehouseList =
                baseWarehouseService.getBaseWareHouseList(agencyId, StatesType.NORMAL.getValue());
        List<Long> warehouseIdList = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toList());
        Integer warehouseType = warehouseQry.getWarehouseType();
        Integer states = warehouseQry.getStates();
        Integer buyType = warehouseQry.getBuyType();
        // è°ƒæ‹¨æ—¶åªæŸ¥æœºæž„类型的集采仓库库存
        // éƒ¨é—¨åˆ†å‘时不分机构和部门,因为调拨进来的物品也算在库存里只是类型为部门,同样检视所有仓库该型号的数量
        int num = lWhGoodsService.queryGoodsModelInWareHouseNum(warehouseType, warehouseIdList, baseGoodsModelsId,
                states, buyType);
        return num;
    }
}
consum-base/src/main/java/com/consum/base/listener/EasyExcelListener.java
New file
@@ -0,0 +1,39 @@
package com.consum.base.listener;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.context.AnalysisContext;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class EasyExcelListener extends AnalysisEventListener<Map<Integer, String>> {
    //表头数据(存储所有的表头数据)
    private List<Map<Integer, String>> headList = new ArrayList<>();
    //数据体
    private List<Map<Integer, String>> dataList = new ArrayList<>();
    @Override//这里会一行行的返回头
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        //存储全部表头数据
        System.out.println("1");
        headList.add(headMap);
    }
    @Override// å¤„理每一行数据
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        dataList.add(data);
    }
    @Override// å…¨éƒ¨å¤„理结束执行
    public void doAfterAllAnalysed(AnalysisContext context) {
    }
    public List<Map<Integer, String>> getHeadList() {
        return headList;
    }
    public List<Map<Integer, String>> getDataList() {
        return dataList;
    }
}
consum-base/src/main/java/com/consum/base/pojo/LWhFormProcureGoodsInfoParam.java
@@ -32,5 +32,8 @@
    private Integer sort = null;
    /**
     * åˆ†ç±»id
     */
    private Long categoryId;
}
consum-base/src/main/java/com/consum/base/pojo/excel/ImportClassificationTemplate.java
New file
@@ -0,0 +1,26 @@
package com.consum.base.pojo.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
 * åŠŸèƒ½æè¿°: åˆ†ç±»æ¨¡æ¿
 *
 * @author lxk
 * @date  2024/5/11 10:43
 * @version 1.0
 **/
@Data
public class ImportClassificationTemplate {
    @ExcelProperty("一级分类")
    private String categoryOne;
    @ExcelProperty("二级分类")
    private String categoryTwo;
    @ExcelProperty("品类名称")
    private String categoryThree;
    @ExcelProperty("管理分类")
    private String type;
}
consum-base/src/main/java/com/consum/base/pojo/excel/ImportGoodsInfoTemplate.java
@@ -1,5 +1,6 @@
package com.consum.base.pojo.excel;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@@ -12,22 +13,20 @@
 */
@Data
public class ImportGoodsInfoTemplate {
    @ExcelProperty("一级分类")
    private String categoryOne;
    @ExcelProperty("二级分类")
    private String categoryTwo;
    @ExcelProperty("三级分类")
    @ExcelProperty("品类名称")
    private String categoryThree;
    @ExcelProperty("物品名称")
    @ExcelProperty("品名")
    private String goodsName;
    @ExcelProperty("规格型号")
    private String goodModelName;
    @ExcelProperty("单位")
    private String unit;
    @ExcelProperty("采购类型")
    private String type;
//    @ExcelProperty("物品类型")
//    private String type;
    @ExcelProperty("所属机构")
    private String agencyName;
}
consum-base/src/main/java/com/consum/base/pojo/excel/ImportProcureOrderTemplate.java
@@ -13,28 +13,33 @@
@Data
public class ImportProcureOrderTemplate {
    @ExcelProperty("入库机构")
    private String agencyName;
    @ExcelProperty("入库仓库")
    private String warehouseName;
    @ExcelProperty("采购类型")
    private String type;
    @ExcelProperty("物品一级分类")
    @ExcelProperty("一级分类")
    private String categoryOne;
    @ExcelProperty("物品二级分类")
    @ExcelProperty("二级分类")
    private String categoryTwo;
    @ExcelProperty("物品三级分类")
    @ExcelProperty("品类名称")
    private String categoryThree;
    @ExcelProperty("物品名称")
    @ExcelProperty("管理分类")
    private String type;
    @ExcelProperty("品名")
    private String goodsName;
    @ExcelProperty("规格型号")
    private String goodModelName;
    @ExcelProperty("单位")
    private String unit;
    @ExcelProperty("物品类型")
    private String goodsType;
    @ExcelProperty("所在仓库")
    private String warehouseName;
//    @ExcelProperty("创建机构")
//    private String agencyName;
    @ExcelProperty("供货商")
    private String supplierName;
    @ExcelProperty("数量单位")
    private String unit;
    @ExcelProperty("单价(元)")
    private String price;
    @ExcelProperty("入库数量")
    @ExcelProperty("库存数量")
    private String num;
//    @ExcelProperty("库管员")
//    private String warehouseKeeper;
}
consum-base/src/main/java/com/consum/base/pojo/excel/LWhFormTransferTemplate.java
New file
@@ -0,0 +1,53 @@
package com.consum.base.pojo.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
 * åŠŸèƒ½æè¿°: åˆ†å‘单模板
 *
 * @author lxk
 * @version 1.0
 * @date 2024/5/10 10:15
 **/
@Data
public class LWhFormTransferTemplate {
    @ExcelProperty("一级分类")
    private String categoryOne;
    @ExcelProperty("二级分类")
    private String categoryTwo;
    @ExcelProperty("品类名称")
    private String categoryThree;
    @ExcelProperty("管理分类")
    private String type;
    @ExcelProperty("品名")
    private String goodsName;
    @ExcelProperty("规格型号")
    private String goodModelName;
    @ExcelProperty("单位")
    private String unit;
//    @ExcelProperty("物品类型")
//    private String goodsType;
//    @ExcelProperty("所在仓库")
//    private String warehouseName;
    @ExcelProperty("所属机构")
    private String agencyName;
    @ExcelProperty("供货商")
    private String supplierName;
//    @ExcelProperty("单价(元)")
//    private String price;
    @ExcelProperty("库管员")
    private String warehouseKeeper;
    @ExcelProperty("使用人")
    private String user;
    @ExcelProperty("使用人部门")
    private String userDepartment;
    @ExcelProperty("使用人联系电话")
    private String userContactPhone;
    @ExcelProperty("领用数量")
    private String num;
    @ExcelProperty("填报人")
    private String reportedBy;
}
consum-base/src/main/java/com/consum/base/service/BaseCategoryService.java
@@ -36,4 +36,19 @@
     * @return
     */
    BaseCategory getByCategoryByName(String categoryName);
    /**
     * æŸ¥è¯¢æœ€å¤§çš„æŽ’序号By id
     * @param id åˆ†ç±»id
     * @return
     */
    int selIndexByPid(Long id);
    /**
     * ç‰©å“åˆ†ç±»åˆ—表查询精确查询
     * @param baseCategoryParam1
     * @return
     */
    GenericPager<BaseCategory> queryBaseCategoryList2(BaseCategoryParam baseCategoryParam1);
}
consum-base/src/main/java/com/consum/base/service/FinSysTenantDepartmentService.java
@@ -63,5 +63,13 @@
    List<FinSysTenantDepartment> queryDataList(FinSysTenantDepartmentParam finSysTenantDepartmentParam1);
    /**
     * æŸ¥è¯¢id by机构和部门名
     * @param tenantName
     * @param departmentName
     * @return
     */
    FinSysTenantDepartment queryIdByTenDepName(String tenantName, String departmentName);
}
consum-base/src/main/java/com/consum/base/service/impl/BaseCategoryServiceImpl.java
@@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@@ -102,6 +103,42 @@
        if (!StringUtils.isEmpty(param.getCategoryName())) {
            sql.append(" and category_name like:category_name ");
            paramts.put("category_name", StringUtils.CHAR_PERCENT + param.getCategoryName() + StringUtils.CHAR_PERCENT);
        }
        // ç±»åˆ«
        if (!StringUtils.isEmpty(param.getClassification())) {
            sql.append(" and classification =:classification ");
            paramts.put("classification", param.getClassification());
        }
        // çŠ¶æ€
        if (param.getStates() != null) {
            sql.append(" and states =:states ");
            paramts.put("states", param.getStates());
        } else {
            sql.append(" and states !=3 ");
        }
        sql.append(" ORDER BY ORDER_NUMBER,CREATE_TIME DESC ");
        return selectSplit(sql.toString(), paramts, new BaseCategory());
    }
    /**
     * ç‰©å“åˆ†ç±»åˆ—表查询精确查询
     * @param param
     * @return
     */
    public GenericPager<BaseCategory> queryBaseCategoryList2(BaseCategoryParam param) {
        StringBuilder sql = new StringBuilder("SELECT * FROM base_category WHERE 1 = 1 ");
        HashMap<String, Object> paramts = new HashMap<>();
        // åˆ†ç±»åç§°
        if (param.getFatherCategoryId() != null) {
            sql.append("and father_category_id =:fatherCategoryId ");
            paramts.put("fatherCategoryId", param.getFatherCategoryId());
        } else {
            sql.append("and levels =1 ");
        }
        // åˆ†ç±»åç§°
        if (!StringUtils.isEmpty(param.getCategoryName())) {
            sql.append(" and category_name =:category_name ");
            paramts.put("category_name", param.getCategoryName());
        }
        // ç±»åˆ«
        if (!StringUtils.isEmpty(param.getClassification())) {
@@ -236,4 +273,25 @@
        BaseCategory baseCategory = this.get(sql.toString(), paramts, new BaseCategory());
        return baseCategory;
    }
    /**
     * æŸ¥è¯¢åˆ†ç±»åŒçº§åˆ«çš„æœ€å¤§æŽ’序号
     * @param id åˆ†ç±»
     * @return
     */
    @Override
    public int selIndexByPid(Long id) {
        StringBuilder sql = new StringBuilder("SELECT max(ORDER_NUMBER) maxNum FROM base_category WHERE 1 = 1 ");
        HashMap<String, Object> paramts = new HashMap<>();
        // åˆ†ç±»åç§°
        sql.append(" and FATHER_CATEGORY_ID =:FATHER_CATEGORY_ID ");
        paramts.put("FATHER_CATEGORY_ID", id);
        Map getMap = this.get(sql.toString(), paramts);
        Object obj = getMap.get("maxNum");
        if(obj!=null){
            return new Integer(obj.toString());
        }
        return 0;
    }
}
consum-base/src/main/java/com/consum/base/service/impl/FinSysTenantDepartmentServiceImpl.java
@@ -203,4 +203,19 @@
        List<FinSysTenantDepartment> select = this.select(sql.toString(), paramts, new FinSysTenantDepartment());
        return select;
    }
    /**
     * æ ¹æ®éƒ¨é—¨å’Œæœºæž„名查找对应的部门信息
     * @param tenantName
     * @param departmentName
     * @return
     */
    @Override
    public FinSysTenantDepartment queryIdByTenDepName(String tenantName, String departmentName ) {
        StringBuilder sql = new StringBuilder("SELECT * FROM fin_sys_tenant_department \n" +
                "WHERE TENANT_ID = ( SELECT id FROM fin_sys_tenant WHERE NAME = '"+tenantName+"' LIMIT 1 ) AND NAME = '"+departmentName+"' LIMIT 1 ");
        HashMap<String, Object> paramts = new HashMap<>();
        return this.get(sql.toString(), paramts, new FinSysTenantDepartment());
    }
}
consum-base/src/main/java/com/consum/base/util/DateUtil.java
New file
@@ -0,0 +1,250 @@
package com.consum.base.util;
import org.apache.commons.lang3.StringUtils;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
/**
 * åŠŸèƒ½æè¿°: æ—¶é—´å¤„理
 *
 * @author lxk
 * @date  2024/4/9 10:34
 * @version 1.0
 **/
public class DateUtil {
    /**
     * @author: hyf
     * @create: 2023/4/26 0026
     * @description: èŽ·å–å½“å‰æ—¶é—´
     *
     **/
    public static Timestamp getNowTimestamp(){
        return new Timestamp(System.currentTimeMillis());
    }
    /**
     * èŽ·å–å½“å‰æ—¶é—´çš„long值
     *
     * @return è¿”回当前时间的long值:例 20230101101010
     */
    public static Long getNowDate() {
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        long currentTimeMillis = System.currentTimeMillis();
        Date date = new Date(currentTimeMillis);
        String format = df.format(date);
        return new Long(format);
    }
    /**
     * æŠŠ14位的时间long,转化时间字符串
     * @param dateLong  long时间14位
     * @param format è¦è½¬çš„æ—¶é—´æ ¼å¼
     * @return
     */
    public static String getStrDateByLong(Long dateLong,String format) {
        String dateStr = dateLong.toString();
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        DateFormat df2 = new SimpleDateFormat(format);
        try {
            Date parse = df.parse(dateStr);
            String format1 = df2.format(parse);
            return format1;
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
    public static Long DateToLong(Date date) {
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        String format = df.format(date);
        return new Long(format);
    }
    /**
     * èŽ·å–å½“å‰æ—¶åˆ†
     * @return
     */
    public static Long getNowTime4HHMM() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHmm");
        LocalTime localTime = LocalTime.now();
        String format = localTime.format(formatter);
        return Long.parseLong(format);
    }
    /**
     * åˆ¤æ–­å½“前时间在某个区间
     * @param startTime
     * @param endTime
     * @return
     */
    public static Boolean betweenNowTime(Long startTime, Long endTime) {
        Long nowTime4HHMM = DateUtil.getNowTime4HHMM();
        if (startTime <= nowTime4HHMM && endTime >= nowTime4HHMM) {
            return true;
        }
        return false;
    }
    /**
     * æ—¶é—´æ·»åР天
     * @param time
     * @param day
     * @return
     */
    public static Long addDay(Long time, Long day) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime localDateTime = LocalDateTime.parse(time.toString(time), formatter);
        LocalDateTime newTime = localDateTime.plusDays(day);
        String format = newTime.format(formatter);
        return Long.parseLong(format);
    }
    /**
     * æ—¶é—´å‡å°‘天
     * @param time
     * @param day
     * @return
     */
    public static Long subDay(Long time, Long day) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime localDateTime = LocalDateTime.parse(time.toString(time), formatter);
        LocalDateTime newTime = localDateTime.minusDays(day);
        String format = newTime.format(formatter);
        return Long.parseLong(format);
    }
    private static final DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
    private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    private static final SimpleDateFormat birthdayFormat = new SimpleDateFormat("yyyy-MM-dd");
    /**
     * æ–¹æ³•描述: æ—¥æœŸç±»åž‹æ ¼å¼è½¬æ¢
     * eg:20240428163146 è½¬æ¢ä¸º è‡ªå®šä¹‰æ—¥æœŸæ ¼å¼
     *
     **/
    public static String longToStr(Long time,String fmt) {
        DateTimeFormatter defaultFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        if(StringUtils.isNotBlank(fmt)){
            defaultFormatter = DateTimeFormatter.ofPattern(fmt);
        }
        if(time.toString().length() == 8) {
            LocalDate start = LocalDate.parse(time.toString(), dayFormatter);
            return start.format(defaultFormatter);
        } else {
            LocalDateTime start = LocalDateTime.parse(time.toString(), timeFormatter);
            return start.format(defaultFormatter);
        }
    }
    /**
     * æ ¹æ®ç”Ÿæ—¥èŽ·å–å¹´é¾„
     * eg:出生年月日=2000-04-30;当前时间=2024-04-29;则age=24
     * @param birthday  å‡ºç”Ÿæ—¥æœŸ
     * @return
     */
    private static int getAgeByBirth(String birthday) {
        int age = 0;
        try {
            Date date = birthdayFormat.parse(birthday);
            Calendar now = Calendar.getInstance();
            // å½“前时间
            now.setTime(new Date());
            Calendar birth = Calendar.getInstance();
            birth.setTime(date);
            //如果传入的时间,在当前时间的后面,返回0岁
            if (birth.after(now)) {
                age = 0;
            } else {
                age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
                if (now.get(Calendar.DAY_OF_YEAR) > birth.get(Calendar.DAY_OF_YEAR)) {
                    age += 1;
                }
            }
            return age;
        } catch (Exception e) {
            e.getStackTrace();
            return 0;
        }
    }
    /**
     * æ ¹æ®å¹´é¾„获取生日
     * eg:age=24;当前时间=2024-04-30;则出生年月日=2000-04-30;
     * @param age  å¹´é¾„
     * @return
     */
    public static LocalDate getBirthByAge(int age){
        LocalDate localDate = LocalDate.now();
        return localDate.minusYears(age);
    }
    /**
     * èŽ·å–å½“å‰æ—¥æœŸ
     */
    public static Long getNowTime(String fmt) {
        if(StringUtils.isBlank(fmt)){
            fmt = "yyyyMMddHHmmss";
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(fmt);
        if(fmt.length() == 8) {
            LocalDate localTime = LocalDate.now();
            String format = localTime.format(formatter);
            return Long.parseLong(format);
        } else {
            LocalDateTime localTime = LocalDateTime.now();
            String format = localTime.format(formatter);
            return Long.parseLong(format);
        }
    }
    /**
     * åˆ¤æ–­å½“前日期在某个区间
     * @param startDate å¼€å§‹æ—¥æœŸ
     * @param endDate   æˆªæ­¢æ—¥æœŸ
     * @param fmt   è‡ªå®šä¹‰æ ¼å¼ï¼›é»˜è®¤=yyyyMMddHHmmss
     */
    public static Boolean betweenNowDateTime(Long startDate, Long endDate,String fmt) {
        Long nowDate = DateUtil.getNowTime(fmt);
        if (startDate <= nowDate && endDate >= nowDate) {
            return true;
        }
        return false;
    }
    /**
     * èŽ·å–å½“å‰æ—¶é—´çš„long值
     * @param fmt   è‡ªå®šä¹‰æ ¼å¼
     * @return
     */
    public static Long getNowDateLong(String fmt) {
        if(StringUtils.isBlank(fmt)) {
            fmt = "yyyyMMddHHmmss";
        }
        DateFormat df = new SimpleDateFormat(fmt);
        long currentTimeMillis = System.currentTimeMillis();
        Date date = new Date(currentTimeMillis);
        String format = df.format(date);
        return new Long(format);
    }
    public static void main(String aaa[]){
        //System.out.println(getAgeByBirth("2025-04-30"));
//        System.out.println(betweenNowDateTime(20240429135709L,20240429170909L,""));
//        System.out.println(getBirthByAge(23).toString());
//        System.out.println(longToStr(20240515L,"yyyy-MM-dd"));
        System.out.println(getNowDateLong("yyyyMMdd"));
    }
}
deploy-jar-single/src/main/resources/import/·Ö·¢µ¼Èë.xls
Binary files differ
deploy-jar-single/src/main/resources/import/ÎïÆ·ÐÅÏ¢.xls
Binary files differ
deploy-jar-single/src/main/resources/import/ÎïÆ·ÐÅÏ¢old.xls
Binary files differ
deploy-jar-single/src/main/resources/import/ÎïÆ··ÖÀà.xls
Binary files differ
deploy-jar-single/src/main/resources/import/²É¹ºµ¼Èë.xls
Binary files differ
deploy-jar-single/src/main/resources/import/²É¹ºµ¼Èëold.xls
Binary files differ