黎星凯
2024-05-08 b4adff68a07b783fc90da1c9370d8be5f383e700
20240528修改:
bug41、42、43修改
领用单(分发单),调拨单,流程优化
5个文件已添加
12个文件已修改
927 ■■■■■ 已修改文件
admin-web/src/api/stock/transfer.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/departmentitem/itemdis/distribution/edit.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/departmentitem/itemdis/distribution/index.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/departmentitem/itemdis/distribution/uploadPage.vue 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/mixins/listPage.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/stock/transfer/transferApplication/edit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/stock/transfer/transferApplication/index.vue 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/stock/transfer/transferApplication/uploadPage.vue 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/views/stock/transfer/transferissue/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/controller/LWhFormTransferController.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/service/LWhFormTransferService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/service/core/LWhFormTransferCoreService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/service/impl/LWhFormTransferServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consum-base/src/main/java/com/consum/base/util/ExcelStyleUtil.java 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/调拨入库单.xls 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/调拨入库单1.xls 补丁 | 查看 | 原始文档 | blame | 历史
deploy-jar-single/src/main/resources/import/调拨入库单old.xls 补丁 | 查看 | 原始文档 | blame | 历史
admin-web/src/api/stock/transfer.js
@@ -8,6 +8,16 @@
    data,
  });
}
// å•据导入
export function transferImport(data) {
  return request({
    url: '/pc/l/wh/form/transfer/import',
    method: 'post',
    data,
  });
}
// åˆ—表
export function transferList(params) {
  return request({
admin-web/src/views/departmentitem/itemdis/distribution/edit.vue
@@ -331,6 +331,7 @@
        operatorName: [{required: true, message: '请填写领取人', trigger: 'blur'}],
        tel: [{required: true, message: '请填写联系电话', trigger: 'blur'}],
        createTime: [{required: true, message: '请选择分发时间', trigger: 'change'}],
        // å¢žåŠ äº†åˆ†å‘çš„ä¸­é—´æµç¨‹ï¼Œè‹¥åŽæœŸåºå·æ­¤æµç¨‹ï¼ˆä¸‹è½½åˆ†å‘å•ï¼Œä¸Šä¼ åˆ†å‘å•ï¼‰åˆ™æ³¨æŽ‰procureDoc
        procureDoc: [{required: true, message: '请上传审批手续', trigger: 'change'}],
        baseCategoryIds: [{required: true, message: '请选择', trigger: 'change'}],
        baseGoodsTemplateId: [{required: true, message: '请选择', trigger: 'change'},{validator: checkGoodsTemplateId, trigger: ['blur', 'change']}],
@@ -557,7 +558,7 @@
              .catch((err) => {
                this.loading = false
                console.log('create err', err);
                this.$message.error('保存失败');
                //this.$message.error('保存失败');
              });
        } else {
          this.$message.error('校验未通过,请检查。');
admin-web/src/views/departmentitem/itemdis/distribution/index.vue
@@ -21,8 +21,21 @@
                        <div class="card-header-left">
                          <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>
                        </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="handleUploadPage(item)">
                            ä¸Šä¼ 
                          </el-button>
                          <el-button name="查看详情" site="form" type="primary" size="mini" @click="handleDetail(item)">
                            æŸ¥çœ‹è¯¦æƒ…
                          </el-button>
@@ -32,7 +45,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.createTime | formatTime }}
                          <span class="span-two">分发时间:</span>{{ item.inTime | formatTime }}
                        </div>
                      </div>
                      <div class="card-end">
@@ -67,6 +80,16 @@
        </el-row>
      </el-card>
    </el-container>
    <!-- ä¸Šä¼ åˆ†å‘单文件-->
    <uploadPage
      v-if="uploadPageSetting.show"
      :setting="uploadPageSetting"
      ref="uploadRef"
      @close="uploadPageSetting.show = false"
      @search="refreshData"
    ></uploadPage>
    <!--添加/编辑弹窗-->
    <edit
        v-if="editSetting.show"
@@ -91,13 +114,14 @@
import myImport from '@/views/components/myImport';
import edit from './edit';
import detail from './detail';
import uploadPage from './uploadPage';
import listPage from '@/views/mixins/listPage';
import {getUserDetail} from "@/utils/auth";
export default {
  name: 'index',
  mixins: [listPage],
  components: {MyButton, myImport, edit, detail},
  components: {MyButton, myImport, edit, detail,uploadPage},
  data() {
    return {
      loading: false,
admin-web/src/views/departmentitem/itemdis/distribution/uploadPage.vue
New file
@@ -0,0 +1,185 @@
<template>
  <win-md class="stock-detail" title="导入分发单文件" @close="close" :width="'800px'" :loading="loading">
    <upload ref="uploadRef" :values="fileList" :settings="uploadSettings" @on-change="uploadChange"></upload>
    <el-button name="确定分发" style="float: right;margin-right: 50px;margin-top: 20px" site="form" type="primary" size="mini" @click="distribute()">
      ç¡®å®šåˆ†å‘
    </el-button>
  </win-md>
</template>
<script>
import winMd from '@/components/win/win-md';
import * as DateFormatter from '@/utils/DateFormatter';
import {getDownUrl, getUploadUrl} from '@/utils/base';
import Viewer from 'viewerjs';
import 'viewerjs/dist/viewer.css';
import de from "element-ui/src/locale/lang/de";
import upload from '@/components/upload/index';
let viewer = null;
import {transferAdd, transferImport} from '@/api/stock/transfer';
export default {
  computed: {
    de() {
      return de
    }
  },
  components: {winMd,upload},
  props: {
    setting: {
      type: Object,
      default: () => {
      },
    },
  },
  data() {
    return {
      procureDoc:"",
      uploadSettings: {
        title: '上传',
        max: 20, // æœ€å¤§å¤§å°ï¼Œå•位M
        num: 10, // æ”¯æŒä¸Šä¼ å›¾ç‰‡ä¸ªæ•°
        tip: '', // æç¤º é»˜è®¤ï¼š`只能上传${this.defaultSettings.num}个${this.defaultSettings.accept}文件,且不超过${this.defaultSettings.max}kb`
        uploadUrl: getUploadUrl(), // ä¸Šä¼ è·¯å¾„
        multiple: true, // æ˜¯å¦æ”¯æŒæ‰¹é‡ä¸Šä¼ 
        disabled: false, // æ˜¯å¦ç¦ç”¨
      },
      loading: true,
      fileList: [],
      detail: {
        baseCategoryName: '',
        businessFormCode: '',
        goodsTemplateName: '',
        procureDoc: '',
        agencyId: '',
        agencyName: '',
        states: '',
        createName: '',
        time: '',
        procureGoods: [{}, {}],
        fileKey: Math.random(),
      },
    };
  },
  filters: {
    formatTime(time) {
      if (!time) return '-';
      return DateFormatter.LongToDateTime(time);
    },
    formatPrice(price) {
      return price / 100
    }
  },
  created() {
    this.loading = false
    this.fileList = []
  },
  methods: {
    initPreviewImg() {
      if (viewer != null) {
        viewer.destroy();
      }
      const ViewerDom = document.querySelector('#uploadPreviewImages');
      viewer = new Viewer(ViewerDom, {});
    },
    handlePreview(file) {
      if (!this.checkImg(file.name)) {
        return false;
      }
      let index = 0;
      for (let i = 0; i < this.fileList.length; i++) {
        const f = this.fileList[i];
        if (this.checkImg(f.name)) {
          if (file.id == f.id) {
            break;
          }
          index++;
        }
      }
      // this.fileList.forEach((f, i) => {
      //   if (file.uid == f.uid) {
      //     index = i
      //   }
      // })
      // document.querySelector('#uploadPreviewImages').children[0].click()
      viewer.view(index);
    },
    checkImg(name) {
      const suffix = name.substring(name.lastIndexOf('.'), name.length);
      const imgArray = ['.jpg', '.jpeg', '.png', '.bmp'];
      if (imgArray.indexOf(suffix) < 0) {
        return false;
      }
      return true;
    },
    getUrl(path) {
      if (path.substr(0, 7).toLowerCase() == 'http://' || path.substr(0, 8).toLowerCase() == 'https://') {
        return path;
      } else {
        return getDownUrl() + path;
      }
    },
    close() {
      this.$emit('close');
    },
    // ä¸Šä¼ 
    uploadChange() {
      let arr = this.$refs.uploadRef.fileList;
      let procureDoc = JSON.stringify(arr);
      console.log(procureDoc)
      this.procureDoc = procureDoc;
      let pro = this.setting.id
      console.log(pro)
    },
    /**
     * ç¡®å®šåˆ†å‘
     */
    distribute(){
      let id = this.setting.id
      let procureDoc = this.procureDoc
      if(id == null || procureDoc === ''){
        this.$message.error('请上传图片!');
        return
      }
      let opTime = DateFormatter.formatDate(new Date(), 'yyyyMMddhhmmss');
      transferImport({"idStr":id,"procureDoc":procureDoc,"opTime":opTime,"type":"1"})
        .then((res) => {
          this.loading = false
          this.$message.success('保存成功!');
          this.close();
          this.$emit('search');
        })
        .catch((err) => {
          this.loading = false
          console.log('edit err', err);
          this.$message.error('保存失败');
        });
    }
  },
};
</script>
<style lang="scss" scoped>
@import url(../../../../styles/store.scss);
.card3 {
  padding: 10px;
  margin-top: 10px;
  border-radius: 2px;
  background: #ffffff;
}
</style>
admin-web/src/views/mixins/listPage.js
@@ -16,6 +16,12 @@
        orgId: '',
        show: false,
      },
      uploadPageSetting: {
        title: '上传页面',
        id: '',
        orgId: '',
        show: false,
      },
      detailSetting: {
        title: '详情',
        id: '',
@@ -81,6 +87,12 @@
      this.detailSetting.title = '详情';
      this.detailSetting.show = true;
    },
    // å¯¼å…¥
    handleUploadPage(row) {
      this.uploadPageSetting.id = row.id;
      this.uploadPageSetting.title = '导入';
      this.uploadPageSetting.show = true;
    },
    // åˆ†é¡µ
    handleSizeChange(pageSize) {
      this.pageSize = pageSize;
admin-web/src/views/stock/transfer/transferApplication/edit.vue
@@ -237,7 +237,7 @@
      rules: {
        outAgencyId: [{ required: true, message: '请选择', trigger: 'change' }],
        createTime: [{ required: true, message: '请选择', trigger: 'change' }],
        procureDoc: [{ required: true, message: '请上传调拨手续', trigger: 'change' }],
        // procureDoc: [{ required: true, message: '请上传调拨手续', trigger: 'change' }],
        baseCategoryIds: [{ required: true, message: '请选择', trigger: 'change' }],
        baseGoodsTemplateId: [{ required: true, message: '请选择', trigger: 'change' },{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
        modelsIds: [{ required: true, message: '请选择', trigger: 'change' }],
admin-web/src/views/stock/transfer/transferApplication/index.vue
@@ -21,7 +21,8 @@
                        <div class="card-header-left">
                          <span>调拨单号:</span>
                          <span class="value">{{ item.businessFormCode }}</span>
                          <div v-if="item.states == 0" class="states states-warning">待出库</div>
                          <div v-if="item.states == 0 && item.procureDoc !=null" class="states states-warning">待出库</div>
                          <div v-if="item.states == 0 && item.procureDoc ==null" class="states states-warning">待提交</div>
                          <div v-if="item.states == 1" class="states states-warning">待接收</div>
                          <div v-if="item.states == 2" class="states states-success">已接收</div>
                          <div v-if="item.states == 4" class="states states-info">已撤销</div>
@@ -35,6 +36,22 @@
                            @click="handleIncome(item)"
                            >入库</el-button
                          >
                          <el-button v-if="item.states == 0 && item.procureDoc ==null" site="form" type="primary" size="mini"
                                     @click="handleExport('transferExport',`调拨单-${item.businessFormCode}`, {id:item.id,type:0})"
                          >下载
                          </el-button
                          >
                          <el-button
                            v-if="item.states == 0 && item.procureDoc ==null"
                            site="form"
                            type="primary"
                            size="mini"
                            @click="handleUploadPage(item)"
                          >上传</el-button
                          >
                          <el-button
                            v-if="item.states == 0"
                            site="form"
@@ -103,6 +120,16 @@
        </el-row>
      </el-card>
    </el-container>
    <!-- ä¸Šä¼ åˆ†å‘单文件-->
    <uploadPage
      v-if="uploadPageSetting.show"
      :setting="uploadPageSetting"
      ref="uploadRef"
      @close="uploadPageSetting.show = false"
      @search="refreshData"
    ></uploadPage>
    <!--添加/编辑弹窗-->
    <edit
      v-if="editSetting.show"
@@ -129,11 +156,14 @@
import listPage from '@/views/mixins/listPage';
import transfer from '@/views/mixins/transfer';
import SettingIplatform from '@/utils/settingIplatform';
import uploadPage from './uploadPage';
import * as dataExport from "@/api/exportExcel";
import {downLoad} from "@/utils/base";
export default {
  name: 'index',
  mixins: [listPage, transfer],
  components: { MyButton, myImport, edit, detail },
  components: { MyButton, myImport, edit, detail,uploadPage },
  data() {
    return {
      loading: false,
@@ -255,6 +285,37 @@
        });
      });
    },
    // å¯¼å…¥
    handleUploadPage(row) {
      this.uploadPageSetting.id = row.id;
      this.uploadPageSetting.title = '导入';
      this.uploadPageSetting.show = true;
    },
    /**
     * å¯¼å‡ºè°ƒæ‹¨å…¥åº“单
     * @param api
     * @param fileName
     * @param params
     */
    handleExport(api, fileName, params) {
      let loading = this.$loading({
        lock: true,
        text: '导出中,请稍候...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)',
      });
      // åˆ¤æ–­æ€»æ¡æ•°æ˜¯å¦å¤§äºŽæœ€å¤§æ”¯æŒæ¡æ•°
      dataExport[api](params)
        .then((res) => {
          console.log(res)
          downLoad(res)
          this.$message.success('导出成功!');
          loading.close();
        })
        .catch(() => {
          loading.close();
        });
    },
  },
};
</script>
admin-web/src/views/stock/transfer/transferApplication/uploadPage.vue
New file
@@ -0,0 +1,185 @@
<template>
  <win-md class="stock-detail" title="上传调拨手续" @close="close" :width="'800px'" :loading="loading">
    <upload ref="uploadRef" :values="fileList" :settings="uploadSettings" @on-change="uploadChange"></upload>
    <el-button name="上传调拨手续" style="float: right;margin-right: 50px;margin-top: 20px" site="form" type="primary" size="mini" @click="allocationProcedures()">
      ä¸Šä¼ è°ƒæ‹¨æ‰‹ç»­
    </el-button>
  </win-md>
</template>
<script>
import winMd from '@/components/win/win-md';
import * as DateFormatter from '@/utils/DateFormatter';
import {getDownUrl, getUploadUrl} from '@/utils/base';
import Viewer from 'viewerjs';
import 'viewerjs/dist/viewer.css';
import de from "element-ui/src/locale/lang/de";
import upload from '@/components/upload/index';
let viewer = null;
import {transferAdd, transferImport} from '@/api/stock/transfer';
export default {
  computed: {
    de() {
      return de
    }
  },
  components: {winMd,upload},
  props: {
    setting: {
      type: Object,
      default: () => {
      },
    },
  },
  data() {
    return {
      procureDoc:"",
      uploadSettings: {
        title: '上传',
        max: 20, // æœ€å¤§å¤§å°ï¼Œå•位M
        num: 2, // æ”¯æŒä¸Šä¼ å›¾ç‰‡ä¸ªæ•°
        tip: '', // æç¤º é»˜è®¤ï¼š`只能上传${this.defaultSettings.num}个${this.defaultSettings.accept}文件,且不超过${this.defaultSettings.max}kb`
        uploadUrl: getUploadUrl(), // ä¸Šä¼ è·¯å¾„
        multiple: true, // æ˜¯å¦æ”¯æŒæ‰¹é‡ä¸Šä¼ 
        disabled: false, // æ˜¯å¦ç¦ç”¨
      },
      loading: true,
      fileList: [],
      detail: {
        baseCategoryName: '',
        businessFormCode: '',
        goodsTemplateName: '',
        procureDoc: '',
        agencyId: '',
        agencyName: '',
        states: '',
        createName: '',
        time: '',
        procureGoods: [{}, {}],
        fileKey: Math.random(),
      },
    };
  },
  filters: {
    formatTime(time) {
      if (!time) return '-';
      return DateFormatter.LongToDateTime(time);
    },
    formatPrice(price) {
      return price / 100
    }
  },
  created() {
    this.loading = false
    this.fileList = []
  },
  methods: {
    initPreviewImg() {
      if (viewer != null) {
        viewer.destroy();
      }
      const ViewerDom = document.querySelector('#uploadPreviewImages');
      viewer = new Viewer(ViewerDom, {});
    },
    handlePreview(file) {
      if (!this.checkImg(file.name)) {
        return false;
      }
      let index = 0;
      for (let i = 0; i < this.fileList.length; i++) {
        const f = this.fileList[i];
        if (this.checkImg(f.name)) {
          if (file.id == f.id) {
            break;
          }
          index++;
        }
      }
      // this.fileList.forEach((f, i) => {
      //   if (file.uid == f.uid) {
      //     index = i
      //   }
      // })
      // document.querySelector('#uploadPreviewImages').children[0].click()
      viewer.view(index);
    },
    checkImg(name) {
      const suffix = name.substring(name.lastIndexOf('.'), name.length);
      const imgArray = ['.jpg', '.jpeg', '.png', '.bmp'];
      if (imgArray.indexOf(suffix) < 0) {
        return false;
      }
      return true;
    },
    getUrl(path) {
      if (path.substr(0, 7).toLowerCase() == 'http://' || path.substr(0, 8).toLowerCase() == 'https://') {
        return path;
      } else {
        return getDownUrl() + path;
      }
    },
    close() {
      this.$emit('close');
    },
    // ä¸Šä¼ 
    uploadChange() {
      let arr = this.$refs.uploadRef.fileList;
      let procureDoc = JSON.stringify(arr);
      console.log(procureDoc)
      this.procureDoc = procureDoc;
      let pro = this.setting.id
      console.log(pro)
    },
    /**
     * ç¡®å®šåˆ†å‘
     */
    allocationProcedures(){
      let id = this.setting.id
      let procureDoc = this.procureDoc
      if(id == null || procureDoc === ''){
        this.$message.error('请上传图片!');
        return
      }
      //let opTime = DateFormatter.formatDate(new Date(), 'yyyyMMddhhmmss');
      transferImport({"idStr":id,"procureDoc":procureDoc,"type":"0"})
        .then((res) => {
          this.loading = false
          this.$message.success('保存成功!');
          this.close();
          this.$emit('search');
        })
        .catch((err) => {
          this.loading = false
          console.log('edit err', err);
          this.$message.error('保存失败');
        });
    }
  },
};
</script>
<style lang="scss" scoped>
@import url(../../../../styles/store.scss);
.card3 {
  padding: 10px;
  margin-top: 10px;
  border-radius: 2px;
  background: #ffffff;
}
</style>
admin-web/src/views/stock/transfer/transferissue/index.vue
@@ -18,17 +18,15 @@
                        <div class="card-header-left">
                          <span>调拨单号:</span>
                          <span class="value">{{ item.businessFormCode }}</span>
                          <div v-if="item.states == 0" class="states states-warning">待出库</div>
                          <div v-if="item.states == 0  && item.procureDoc !=null" class="states states-warning">待出库</div>
                          <div v-if="item.states == 0  && item.procureDoc ==null" class="states states-warning">待提交</div>
                          <div v-if="item.states == 1" class="states states-warning">待接收</div>
                          <div v-if="item.states == 2" class="states states-success">已接收</div>
                          <div v-if="item.states == 4" class="states states-info">已撤销</div>
                        </div>
                        <div class="card-header-right">
                          <!--  <el-button v-if="item.states == 1" site="form" type="success" size="mini"
                                >导出调拨出库单</el-button
                              >-->
                          <el-button
                              v-if="item.states == 0"
                              v-if="item.states == 0 && item.procureDoc !=null"
                              site="form"
                              type="success"
                              size="mini"
consum-base/src/main/java/com/consum/base/controller/LWhFormTransferController.java
@@ -9,19 +9,18 @@
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.consum.base.util.ExcelStyleUtil;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.ObjectUtils;
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.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.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import com.consum.base.BaseController;
import com.consum.base.core.WhBusinessEnum;
import com.consum.base.core.type.StatesType;
@@ -62,7 +61,6 @@
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;
@@ -104,6 +102,7 @@
    @ApiOperation(value = "单据新增", notes = "单据新增")
    @ApiImplicitParam(name = "param", value = "单据新增", required = true, dataType = "LWhFormTransferParam")
    @PostMapping("/add")
    @Transactional(rollbackFor = Exception.class)
    public ResponseValue add() throws Exception {
        LWhFormTransferParam param = CommonUtil.getObjFromReqBody(LWhFormTransferParam.class);
        LWhFormTransferParam param2 = new LWhFormTransferParam();
@@ -118,24 +117,31 @@
        if (CollectionUtils.isEmpty(transferGoods)) {
            return ResponseValue.error("调拨单不能为空");
        }
        long id = this.lWhFormTransferService.add(param, this.getSysInfo());
        long id = this.lWhFormTransferService.add(param, this.getSysInfo(), StrUtil.isEmpty(param.getProcureDoc()));
        if(id == -1L){
            return ResponseValue.error("您不是库管员");
        }
        if(id == -2L){
            return ResponseValue.error("仓库不存在");
        }
        Integer transferBusinessType = param.getTransferBusinessType();
        // éƒ¨é—¨åˆ†å‘业务需要处理
        if (transferBusinessType == 1) {
        // todo æ‹†åˆ† æ–°é€»è¾‘
        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());
                    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());
                    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);
            List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null);
            GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null);
            if (ObjectUtils.isEmpty(goodsInfoDTO)) {
                return ResponseValue.error("该型号没有库存可使用");
@@ -147,27 +153,101 @@
            lWhFormTransfer.setOutWarehouseId(wareHouseId);
            lWhFormTransfer.setOutWarehouseName(warehouseName);
            lWhFormTransferService.update(lWhFormTransfer);
            lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
            Long l = lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
            if(l == -1L){
                return ResponseValue.error("仓库数量不足");
            }
            lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), param.getOperatorName());
        }
        return ResponseValue.success();
    }
    /**
     * ä¸Šä¼ åˆ†å‘单(流程修改)
     *
     * @param idStr è°ƒæ‹¨å•id json
     * @return
     * @throws Exception
     */
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),})
    @Transactional(rollbackFor = Exception.class)
    @PostMapping("import")
    public ResponseValue upload(@RequestBody String idStr) throws Exception {
        Map<String, Object> map = JSONObject.parseObject(idStr, Map.class);
        String type = map.get("type").toString();
        Long id = Convert.toLong(map.get("idStr"));
        String procureDoc = map.get("procureDoc").toString();
        // [调拨]
        if ("0".equals(type)) {
            // ä¿®æ”¹
            LWhFormTransfer addLWhFormTransfer = new LWhFormTransfer();
            addLWhFormTransfer.setId(id);
            addLWhFormTransfer.setProcureDoc(procureDoc);
            int update = lWhFormTransferService.update(addLWhFormTransfer);
            if (update < 1) {
                return ResponseValue.error();
            }
            return ResponseValue.success();
        }
        // [分发]
        Long opTime = Convert.toLong(map.get("opTime"));
        // ä¿®æ”¹è¡¨çš„æ–‡ä»¶é€»è¾‘
        LWHFromTransferExtendVO lwhFromTransferExtendVO = lWhFormTransferService.getById(id);
        // ä¿®æ”¹
        LWhFormTransfer addLWhFormTransfer = new LWhFormTransfer();
        addLWhFormTransfer.setId(id);
        addLWhFormTransfer.setProcureDoc(procureDoc);
        addLWhFormTransfer.setInTime(opTime);
        addLWhFormTransfer.setOutputTime(opTime);
        int update = lWhFormTransferService.update(addLWhFormTransfer);
        if (update < 1) {
            return ResponseValue.error();
        }
        // ä¸»åˆ†å‘逻辑
        // å…ˆå‡ºåº“,再入库
        // å‡ºåº“前 è®¾ç½®å‡ºåº“仓库
        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);
        lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
        lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), lwhFromTransferExtendVO.getOperatorName());
        return ResponseValue.success();
    }
    /**
     * @Description åˆ—表查询(调拨明细)
     * @Author å¢åº†é˜³
     * @Date 2023/10/30
     *       <p>
     *       1.查询调拨单
     *       <p>
     *       2.查询物品型号
     * <p>
     * 1.查询调拨单
     * <p>
     * 2.查询物品型号
     */
    @ApiOperation(value = "单据列表查询", notes = "单据列表查询")
    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", required = true, dataType = "int"),
        @ApiImplicitParam(name = "size", value = "每页条数", required = true, dataType = "int"),
        @ApiImplicitParam(name = "param", value = "条件参数", required = true, dataType = "TransferQry"),})
            @ApiImplicitParam(name = "size", value = "每页条数", required = true, dataType = "int"),
            @ApiImplicitParam(name = "param", value = "条件参数", required = true, dataType = "TransferQry"),})
    @GetMapping("/list")
    public ResponseValue queryFormTransferList() {
        TransferQry param = CommonUtil.getObjFromReq(TransferQry.class);
@@ -190,7 +270,7 @@
                // æŸ¥è¯¢åž‹å·æ•°é‡
                List<GoodsTemplateCountVO> goodsTemplateCount =
                    lWhProcureModelService.getGoodsTemplateCountByBusinessId(item.getId());
                        lWhProcureModelService.getGoodsTemplateCountByBusinessId(item.getId());
                formTransferVO.setFromTransferTemplateInfoList(goodsTemplateCount);
                result.add(formTransferVO);
@@ -293,16 +373,16 @@
        List<LWhProcureModel> modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.DIAOBO, id);
        Set<Long> baseModelIds =
            modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
                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());
                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,1);
        List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, 1);
        GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null);
        if (ObjectUtils.isEmpty(goodsInfoDTO)) {
            return ResponseValue.error("该型号没有库存可使用");
@@ -320,26 +400,30 @@
    @ApiOperation(value = "调拨单导出", notes = "调拨单导出")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "type", value = "导出类型 1 å…¥åº“ 2 å‡ºåº“", required = true, dataType = "Integer"),})
            @ApiImplicitParam(name = "type", value = "导出类型 1 å…¥åº“ 2 å‡ºåº“", required = true, dataType = "Integer"),})
    @GetMapping("/list/export")
    public ResponseValue<String> export(Long id, Integer type, HttpServletResponse response) throws Exception {
        TemplateExportParams params;
        String fileName;
        if (type == 1) {
        if (type == 0) {
            params = new TemplateExportParams("import/调拨入库单.xls");
            fileName = "调拨入库单";
        }else if (type == 1) {
            params = new TemplateExportParams("import/调拨入库单1.xls");
            fileName = "调拨入库单";
        } else {
            params = new TemplateExportParams("import/调拨出库单.xls");
            fileName = "调拨出库单";
        }
        params.setHeadingStartRow(2);
        params.setStyle(ExcelStyleUtil.class);
        List<TransferExcelTemplate> export = this.lWhFormTransferService.export(id, type);
        int countNum =
            export.stream().filter(item -> item.getNum() != null).mapToInt(TransferExcelTemplate::getNum).sum();
                export.stream().filter(item -> item.getNum() != null).mapToInt(TransferExcelTemplate::getNum).sum();
        double totalAmount = export.stream().filter(item -> item.getTotalAmount() != null)
            .mapToDouble(TransferExcelTemplate::getAmount).sum();
                .mapToDouble(TransferExcelTemplate::getAmount).sum();
        Optional<TransferExcelTemplate> first = export.stream().findFirst();
        TransferExcelTemplate entity = first.get();
        String businessFormCode = entity.getBusinessFormCode();
@@ -385,7 +469,7 @@
            param.setOutAgencyId(Long.valueOf(tenantId));
        }
        GenericPager<Map<String, Object>> transferInfoDetailsVoGenericPager =
            this.lWhFormTransferService.queryTransferInfo(param);
                this.lWhFormTransferService.queryTransferInfo(param);
        return ResponseValue.success(transferInfoDetailsVoGenericPager);
    }
@@ -408,7 +492,7 @@
        }
        Map<Long, List<ProcureModelInfoParam>> collect = param.getRecordInfoList().stream()
            .collect(Collectors.groupingBy(ProcureModelInfoParam::getBaseGoodModelId));
                .collect(Collectors.groupingBy(ProcureModelInfoParam::getBaseGoodModelId));
        for (Map.Entry<Long, List<ProcureModelInfoParam>> entry : collect.entrySet()) {
            Long baseGoodModelId = entry.getKey();
@@ -441,7 +525,7 @@
                    // è®¾ç½®ä¸€ä¸‹åœ¨ç”¨æ•°é‡
                    Long oldProcureModelId = item.getOldProcureModelId();
                    LWhProcureModelUser oldInfo =
                        lWhProcureModelUserService.get(new LWhProcureModelUser(oldProcureModelId));
                            lWhProcureModelUserService.get(new LWhProcureModelUser(oldProcureModelId));
                    lWhProcureModelUser.setUseCount(oldInfo.getUseCount());
                    procureModelUserList.add(lWhProcureModelUser);
                }
@@ -476,52 +560,52 @@
        }
        List<GoodsUseRecordVO> goodsUseRecordList = useRecordDTOList.stream()
            .collect(Collectors.groupingBy(UseRecordDTO::getId)).entrySet().stream().map(entry -> {
                Long id = entry.getKey();
                List<UseRecordDTO> useRecordList = entry.getValue();
                UseRecordDTO useRecordDto = useRecordList.get(0);
                .collect(Collectors.groupingBy(UseRecordDTO::getId)).entrySet().stream().map(entry -> {
                    Long id = entry.getKey();
                    List<UseRecordDTO> useRecordList = entry.getValue();
                    UseRecordDTO useRecordDto = useRecordList.get(0);
                GoodsUseRecordVO goodsUseRecordVO = new GoodsUseRecordVO();
                goodsUseRecordVO.setId(id);
                goodsUseRecordVO.setUpdateUserName(useRecordDto.getUpdateUserName());
                goodsUseRecordVO.setUpdateTime(useRecordDto.getUpdateTime());
                    GoodsUseRecordVO goodsUseRecordVO = new GoodsUseRecordVO();
                    goodsUseRecordVO.setId(id);
                    goodsUseRecordVO.setUpdateUserName(useRecordDto.getUpdateUserName());
                    goodsUseRecordVO.setUpdateTime(useRecordDto.getUpdateTime());
                List<UseRecordSkuVO> useRecordSkuList =
                    useRecordList.stream().collect(Collectors.groupingBy(UseRecordDTO::getProcureModelId)).values()
                        .stream().map(recordList -> {
                            UseRecordDTO useRecordDTO = recordList.get(0);
                            UseRecordSkuVO useRecordSkuVO = new UseRecordSkuVO();
                            useRecordSkuVO.setBaseGoodModelId(useRecordDTO.getBaseGoodsModelsId());
                            useRecordSkuVO.setBaseGoodModelName(useRecordDTO.getBaseGoodsModelsName());
                            useRecordSkuVO.setUnit(useRecordDTO.getUnit());
                            useRecordSkuVO.setProcureModelId(useRecordDTO.getProcureModelId());
                    List<UseRecordSkuVO> useRecordSkuList =
                            useRecordList.stream().collect(Collectors.groupingBy(UseRecordDTO::getProcureModelId)).values()
                                    .stream().map(recordList -> {
                                        UseRecordDTO useRecordDTO = recordList.get(0);
                                        UseRecordSkuVO useRecordSkuVO = new UseRecordSkuVO();
                                        useRecordSkuVO.setBaseGoodModelId(useRecordDTO.getBaseGoodsModelsId());
                                        useRecordSkuVO.setBaseGoodModelName(useRecordDTO.getBaseGoodsModelsName());
                                        useRecordSkuVO.setUnit(useRecordDTO.getUnit());
                                        useRecordSkuVO.setProcureModelId(useRecordDTO.getProcureModelId());
                            List<RecordUserInfoVO> recordUserInfoList = recordList.stream().map(userInfo -> {
                                RecordUserInfoVO recordUserInfoVO = new RecordUserInfoVO();
                                recordUserInfoVO.setOldProcureModelId(userInfo.getOldProcureModelId());
                                recordUserInfoVO.setUseName(userInfo.getUseName());
                                recordUserInfoVO.setPhone(userInfo.getPhone());
                                recordUserInfoVO.setNum(userInfo.getNum());
                                return recordUserInfoVO;
                            }).collect(Collectors.toList());
                                        List<RecordUserInfoVO> recordUserInfoList = recordList.stream().map(userInfo -> {
                                            RecordUserInfoVO recordUserInfoVO = new RecordUserInfoVO();
                                            recordUserInfoVO.setOldProcureModelId(userInfo.getOldProcureModelId());
                                            recordUserInfoVO.setUseName(userInfo.getUseName());
                                            recordUserInfoVO.setPhone(userInfo.getPhone());
                                            recordUserInfoVO.setNum(userInfo.getNum());
                                            return recordUserInfoVO;
                                        }).collect(Collectors.toList());
                            useRecordSkuVO.setRecordUserInfos(recordUserInfoList);
                            return useRecordSkuVO;
                        }).collect(Collectors.toList());
                                        useRecordSkuVO.setRecordUserInfos(recordUserInfoList);
                                        return useRecordSkuVO;
                                    }).collect(Collectors.toList());
                goodsUseRecordVO.setRecordSkuDtoList(useRecordSkuList);
                return goodsUseRecordVO;
                    goodsUseRecordVO.setRecordSkuDtoList(useRecordSkuList);
                    return goodsUseRecordVO;
            }).sorted(Comparator.comparing(GoodsUseRecordVO::getUpdateTime, Comparator.nullsFirst(Long::compareTo))
                .reversed())
            .collect(Collectors.toList());
                }).sorted(Comparator.comparing(GoodsUseRecordVO::getUpdateTime, Comparator.nullsFirst(Long::compareTo))
                        .reversed())
                .collect(Collectors.toList());
        return ResponseValue.success(goodsUseRecordList);
    }
    @ApiOperation(value = "查询部门下的分发单", notes = "查询部门下的分发单")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "agencyId", value = "机构id", required = true, dataType = "Long", paramType = "query")})
            @ApiImplicitParam(name = "agencyId", value = "机构id", required = true, dataType = "Long", paramType = "query")})
    @GetMapping("/query/transfList")
    public ResponseValue queryDepartmentTransferOrderList() {
consum-base/src/main/java/com/consum/base/service/LWhFormTransferService.java
@@ -14,7 +14,7 @@
public interface LWhFormTransferService extends BaseService {
    long add(LWhFormTransferParam param, FinSysTenantUser sysInfo) throws Exception;
    long add(LWhFormTransferParam param, FinSysTenantUser sysInfo,boolean isHaveDoc) throws Exception;
    GenericPager<LWhFormTransfer> queryFormTransferList(TransferQry param);
consum-base/src/main/java/com/consum/base/service/core/LWhFormTransferCoreService.java
@@ -230,7 +230,8 @@
                    log.error("出库失败!型号{} çš„æ•°é‡ä¸è¶³ï¼Œéœ€è¦è°ƒæ‹¨{}个,仓库中现存{}个", baseGoodsModelsId, counts, goodsModelNum);
                    // æ‰‹åŠ¨å›žæ»š
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    throw new RuntimeException("出库失败!型号数量不足");
                    //throw new RuntimeException("出库失败!型号数量不足");
                    return -1L;
                }
                whGoodsRecord.setInitialCount(goodsModelNum);
                whGoodsRecord.setEndCount(goodsModelNum - counts);
consum-base/src/main/java/com/consum/base/service/impl/LWhFormTransferServiceImpl.java
@@ -13,6 +13,7 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
@@ -96,7 +97,8 @@
     * @Author å¢åº†é˜³
     * @Date 2023/10/30
     */
    public long add(LWhFormTransferParam param, FinSysTenantUser sysInfo) throws Exception {
    @Transactional(rollbackFor = Exception.class)
    public long add(LWhFormTransferParam param, FinSysTenantUser sysInfo,boolean isHaveDoc) throws Exception {
        // 1.新增调拨单记录
        LWhFormTransfer lWhFormTransfer = new LWhFormTransfer();
        // è°ƒæ‹¨å•id
@@ -123,7 +125,8 @@
            BaseWarehouse warehouse = baseWarehouseService.getWarehouseByAgencyId(Long.valueOf(tenantId), null);
            if (warehouse == null) {
                log.error("仓库不存在");
                throw new Exception("仓库不存在");
                //throw new Exception("仓库不存在");
                return -2L;
            }
            lWhFormTransfer.setInWarehouseId(warehouse.getId());
            lWhFormTransfer.setInWarehouseName(warehouse.getWarehouseName());
@@ -142,7 +145,8 @@
            List<BaseWarehouseManager> managerList = baseWarehouseManagerService.select(manager);
            if (CollectionUtils.isEmpty(managerList)) {
                log.error("该用户不是库管员");
                throw new Exception("该用户不是库管员");
                //throw new Exception("该用户不是库管员");
                return -1L;
            }
            BaseWarehouseManager baseWarehouseManager = managerList.stream().findFirst().orElse(null);
            Long baseWarehouseId = baseWarehouseManager.getBaseWarehouseId();
@@ -154,7 +158,11 @@
            lWhFormTransfer.setInWarehouseId(param.getDepartmentId());
            lWhFormTransfer.setInWarehouseName(param.getDepartmentName());
            lWhFormTransfer.setInOperatorName(param.getOperatorName());
            lWhFormTransfer.setInTime(param.getCreateTime());
            if(!isHaveDoc){
                lWhFormTransfer.setInTime(param.getCreateTime());
            }
            lWhFormTransfer.setOutWarehouseType(WareHouseType.TENANT.getValue());
            lWhFormTransfer.setOutWarehouseId(warehouse.getId());
@@ -162,7 +170,10 @@
            lWhFormTransfer.setOutOperatorId(sysInfo.getId());
            lWhFormTransfer.setOutOperatorName(sysInfo.getUserName());
            lWhFormTransfer.setOutputTime(param.getCreateTime());
            if(!isHaveDoc) {
                lWhFormTransfer.setOutputTime(param.getCreateTime());
            }
            lWhFormTransfer.setTel(param.getTel());
        }
consum-base/src/main/java/com/consum/base/util/ExcelStyleUtil.java
New file
@@ -0,0 +1,187 @@
package com.consum.base.util;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams;
import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
import org.apache.poi.ss.usermodel.*;
/**
 * åŠŸèƒ½æè¿°: Excel样式设置
 *
 * @author lxk
 * @date  2024/5/8 13:41
 * @version 1.0
 **/
public class ExcelStyleUtil implements IExcelExportStyler {
    private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");
    private static final short FONT_SIZE_TEN = 10;
    private static final short FONT_SIZE_ELEVEN = 11;
    private static final short FONT_SIZE_TWELVE = 12;
    // æ ‡é¢˜å¤´æ ·å¼
    private CellStyle headerStyle;
    // æ•°æ®åˆ—标题样式
    private CellStyle titleStyle;
    // æ•°æ®è¡Œæ ·å¼
    private CellStyle styles;
    public ExcelStyleUtil(Workbook workbook) {
        this.init(workbook);
    }
    /**
     * åˆå§‹åŒ–样式
     *
     * @param workbook
     */
    private void init(Workbook workbook) {
        this.headerStyle = initHeaderStyle(workbook);
        this.titleStyle = initTitleStyle(workbook);
        this.styles = initStyles(workbook);
    }
    /**
     * æ ‡é¢˜å¤´æ ·å¼
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getHeaderStyle(short color) {
        return headerStyle;
    }
    /**
     * æ•°æ®åˆ—标题样式
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getTitleStyle(short color) {
        return titleStyle;
    }
    /**
     * æ•°æ®è¡Œæ ·å¼
     *
     * @param parity            è¡¨ç¤ºå¥‡å¶è¡Œ
     * @param excelExportEntity æ•°æ®å†…容
     * @return
     */
    @Override
    public CellStyle getStyles(boolean parity, ExcelExportEntity excelExportEntity) {
        return styles;
    }
    /**
     * æ•°æ®è¡Œæ ·å¼
     *
     * @param cell              å•元格
     * @param dataRow           æ•°æ®è¡Œ
     * @param excelExportEntity æ•°æ®å†…容
     * @param obj               å¯¹è±¡
     * @param data              æ•°æ®
     * @return
     */
    @Override
    public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity excelExportEntity, Object obj, Object data) {
        return getStyles(true, excelExportEntity);
    }
    /**
     * æ¨¡æ¿ä½¿ç”¨çš„æ ·å¼è®¾ç½®
     *
     * @param b
     * @param excelForEachParams
     * @return
     */
    @Override
    public CellStyle getTemplateStyles(boolean b, ExcelForEachParams excelForEachParams) {
        return null;
    }
    /**
     * åˆå§‹åŒ–--标题头样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initHeaderStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true));
        return style;
    }
    /**
     * åˆå§‹åŒ–--数据列标题样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initTitleStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false));
        // èƒŒæ™¯è‰²
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        return style;
    }
    /**
     * åˆå§‹åŒ–--数据行样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initStyles(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TEN, false));
        style.setDataFormat(STRING_FORMAT);
        return style;
    }
    /**
     * åŸºç¡€æ ·å¼
     *
     * @return
     */
    private CellStyle getBaseCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // ä¸‹è¾¹æ¡†
        style.setBorderBottom(BorderStyle.THIN);
        // å·¦è¾¹æ¡†
        style.setBorderLeft(BorderStyle.THIN);
        // ä¸Šè¾¹æ¡†
        style.setBorderTop(BorderStyle.THIN);
        // å³è¾¹æ¡†
        style.setBorderRight(BorderStyle.THIN);
        // æ°´å¹³å±…中
        style.setAlignment(HorizontalAlignment.CENTER);
        // ä¸Šä¸‹å±…中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // è®¾ç½®è‡ªåŠ¨æ¢è¡Œ
        style.setWrapText(true);
        return style;
    }
    /**
     * å­—体样式
     *
     * @param size   å­—体大小
     * @param isBold æ˜¯å¦åŠ ç²—
     * @return
     */
    private Font getFont(Workbook workbook, short size, boolean isBold) {
        Font font = workbook.createFont();
        // å­—体样式
        font.setFontName("宋体");
        // æ˜¯å¦åŠ ç²—
        font.setBold(isBold);
        // å­—体大小
        font.setFontHeightInPoints(size);
        return font;
    }
}
deploy-jar-single/src/main/resources/import/µ÷²¦Èë¿âµ¥.xls
Binary files differ
deploy-jar-single/src/main/resources/import/µ÷²¦Èë¿âµ¥1.xls
Binary files differ
deploy-jar-single/src/main/resources/import/µ÷²¦Èë¿âµ¥old.xls
Binary files differ