jiangping
2025-05-27 3d6a8e384d31432a23f5a8c1a3135a58cbe617b5
提交一把
已添加2个文件
已修改12个文件
1904 ■■■■■ 文件已修改
company/src/components/business/OperaKnowledgeWindow.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaSettleClaimsCheckWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaSettleClaimsWindow.vue 455 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaSolutionsBaseWindow.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/caseProgress.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/tagLibrary.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/common/previewArea.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/enterprise/onlineReporting.vue 716 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/knowledge.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/riskReminder.vue 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/settleClaims.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log/web/error.2025-05-27.0.log 补丁 | 查看 | 原始文档 | blame | 历史
log/web/info.2025-05-27.0.log 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaKnowledgeWindow.vue
@@ -15,22 +15,42 @@
                    <el-select v-model="form.labelsArr" style="width: 100%;" @change="changeLabel" multiple placeholder="请选择">
                        <el-option
                            v-for="item in cateList"
                            :key="item.id"
                            :key="item.name"
                            :label="item.name"
                            :value="item.id">
                            :value="item.name">
                        </el-option>
                    </el-select>
                    <el-button size="medium" style="margin-left: 15px;" @click="$refs.tagLibrary.open('标签库')">标签库</el-button>
                </div>
            </el-form-item>
            <el-form-item label="地区" prop="area">
          <el-form-item label="省份" prop="provinceId">
            <el-select   v-model="form.provinceId"   filterable @change="changeProvince" placeholder="请选择">
              <el-option
                  v-for="item in areas"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="城市" prop="cityId">
            <el-select  v-model="form.cityId"  clearablefilterable   placeholder="请选择">
              <el-option
                  v-for="item in citys"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
              </el-option>
            </el-select>
          </el-form-item>
<!--            <el-form-item label="地区" prop="area">
                <el-cascader
                    v-model="form.area"
                    :options="area"
                    @change="changeArea"
                    :props="{ label: 'name', children: 'childAreasList', value: 'id' }" />
            </el-form-item>
            <el-form-item label="年份" prop="yearInfo">
            </el-form-item>-->
            <el-form-item label="年份" prop="yearInfo"  >
                <el-date-picker
                    v-model="form.yearInfo"
                    type="year"
@@ -48,118 +68,140 @@
</template>
<script>
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import TagLibrary from '@/components/business/tagLibrary'
    import { findTreeList, list } from '@/api/business/knowledge'
    export default {
        name: 'OperaKnowledgeWindow',
        extends: BaseOpera,
        components: { GlobalWindow, TagLibrary },
        data () {
            return {
                // è¡¨å•数据
                form: {
                    id: null,
                    provinceId: '',
                    cityId: '',
                    title: '',
                    link: '',
                    labels: '',
                    yearInfo: '',
                    area: [],
                    labelsArr: []
                },
                // éªŒè¯è§„则
                rules: {
                    title: [
                        { required: true, message: '请输入内容', trigger: 'blur' }
                    ],
                    link: [
                        { required: true, message: '请输入内容', trigger: 'blur' }
                    ]
                },
                area: [],
                cateList: []
            }
        },
        created () {
            this.config({
                api: '/business/knowledge',
                'field.id': 'id'
            })
        },
        methods: {
            changeLabel(e) {
                this.form.labels = e.join(',')
            },
            changeArea(e) {
                if (e.length === 0) return
                if (e.length === 1) {
                    this.form.provinceId = e[0]
                } else if (e.length === 2) {
                    this.form.provinceId = e[0]
                    this.form.cityId = e[1]
                }
            },
            open (title, target) {
                this.getLabel()
                this.getCityTree()
                this.title = title
                this.visible = true
                // æ–°å»º
                if (target == null) {
                    this.$nextTick(() => {
                        this.$refs.form.resetFields()
                        this.form[this.configData['field.id']] = null
                    })
                    return
                }
                // ç¼–辑
                this.$nextTick(() => {
                    for (const key in this.form) {
                        this.form[key] = target[key]
                    }
                    if (this.form.labels) {
                        this.form.labelsArr = this.form.labels.split(',').map(item => Number(item))
                    }
                    if (this.form.provinceId && this.form.cityId) {
                        this.form.area = [this.form.provinceId, this.form.cityId]
                    } else if (this.form.provinceId && !this.form.cityId) {
                        this.form.area = [this.form.provinceId]
                    }
                })
            },
            async getLabel() {
                this.cateList = await list()
            },
            async getCityTree() {
                this.area = await findTreeList({})
                this.setSecondLevelChildrenToNullPrecise(this.area);
                this.area.forEach(item => {
                    if (item.childAreasList.length === 0) {
                        item.childAreasList = null
                    }
                })
            },
            setSecondLevelChildrenToNullPrecise(data, level = 1) {
                if (!data || !data.length) return;
                data.forEach(item => {
                    if (item.childAreasList && item.childAreasList.length) {
                        if (level === 1) {
                            // è¿™æ˜¯ç¬¬ä¸€çº§èŠ‚ç‚¹ï¼Œå¤„ç†å…¶å­èŠ‚ç‚¹ï¼ˆç¬¬äºŒçº§ï¼‰
                            item.childAreasList.forEach(child => {
                                child.childAreasList = null;
                            });
                        } else {
                            // ç»§ç»­é€’归处理更深层级
                            this.setSecondLevelChildrenToNullPrecise(item.childAreasList, level + 1);
                        }
                    }
                });
            }
        }
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import TagLibrary from '@/components/business/tagLibrary'
import { findTreeList, list } from '@/api/business/knowledge'
export default {
  name: 'OperaKnowledgeWindow',
  extends: BaseOpera,
  components: { GlobalWindow, TagLibrary },
  data () {
    return {
      // è¡¨å•数据
      form: {
        id: null,
        provinceId: '',
        cityId: '',
        title: '',
        link: '',
        labels: '',
        yearInfo: '',
        area: [],
        labelsArr: []
      },
      areas: [],
      citys: [],
      // éªŒè¯è§„则
      rules: {
        title: [
          { required: true, message: '请输入内容', trigger: 'blur' }
        ],
        yearInfo: [
          { required: true, message: '请选择年份', trigger: 'blur' }
        ],
        labelsArr: [
          { required: true, message: '请选择表情', trigger: 'blur' }
        ],
        provinceId: [
          { required: true, message: '请选择省份', trigger: 'blur' }
        ],
        link: [
          { required: true, message: '请输入内容', trigger: 'blur' }
        ]
      },
      area: [],
      cateList: []
    }
  },
  created () {
    this.config({
      api: '/business/knowledge',
      'field.id': 'id'
    })
  },
  methods: {
    changeLabel (e) {
      this.form.labels = e.join(',')
    },
    changeArea (e) {
      if (e.length === 0) return
      if (e.length === 1) {
        this.form.provinceId = e[0]
      } else if (e.length === 2) {
        this.form.provinceId = e[0]
        this.form.cityId = e[1]
      }
    },
    changeProvince (e) {
      this.citys = []
      this.form.cityId=null
      this.areas.forEach(item => {
        if (item.id === this.form.provinceId) {
          this.citys = item.childAreasList || []
        }
      })
    },
    open (title, target) {
      this.getLabel()
      this.getCityTreeList()
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        if (this.form.labels) {
          this.form.labelsArr = this.form.labels.split(',')
        }
        if (this.form.provinceId && this.form.cityId) {
          this.form.area = [this.form.provinceId, this.form.cityId]
        } else if (this.form.provinceId && !this.form.cityId) {
          this.form.area = [this.form.provinceId]
        }
      })
    },
    async getLabel () {
      this.cateList = await list()
    },
    async getCityTreeList () {
      this.areas = await findTreeList({})
    },
    async getCityTree () {
      this.area = await findTreeList({})
      this.setSecondLevelChildrenToNullPrecise(this.area)
      this.area.forEach(item => {
        if (item.childAreasList.length === 0) {
          item.childAreasList = null
        }
      })
    },
    setSecondLevelChildrenToNullPrecise (data, level = 1) {
      if (!data || !data.length) return
      data.forEach(item => {
        if (item.childAreasList && item.childAreasList.length) {
          if (level === 1) {
            // è¿™æ˜¯ç¬¬ä¸€çº§èŠ‚ç‚¹ï¼Œå¤„ç†å…¶å­èŠ‚ç‚¹ï¼ˆç¬¬äºŒçº§ï¼‰
            item.childAreasList.forEach(child => {
              child.childAreasList = null
            })
          } else {
            // ç»§ç»­é€’归处理更深层级
            this.setSecondLevelChildrenToNullPrecise(item.childAreasList, level + 1)
          }
        }
      })
    }
  }
}
</script>
company/src/components/business/OperaSettleClaimsCheckWindow.vue
@@ -296,7 +296,7 @@
</script>
<style>
    .v-modal {
        z-index: 2000 !important;
      //  z-index: 2000 !important;
    }
</style>
<style lang="scss" scoped>
company/src/components/business/OperaSettleClaimsWindow.vue
@@ -22,7 +22,7 @@
            <div class="box_dk" v-if="[13].includes(info.status)">
                <div class="box_dk_title">
                    <i class="el-icon-success"></i>
                    <span>已打款</span>
                    <span style="font-weight: bold">已打款</span>
                </div>
                <div class="box_dk_list">
                    <div class="box_dk_list_row">
@@ -161,7 +161,7 @@
                    <div class="box_desc_title">
                        <span class="box_desc_title_val">报案详情</span>
                        <div class="box_desc_title_zt" v-if="info.statusName">{{info.statusName}}</div>
                        <div class="box_desc_title_tips" v-if="info.isRisk === 1">
                        <div class="box_desc_title_tips" @click="$refs.riskCaseReminder.open('风险案件提醒', info.riskContent)" v-if="info.isRisk === 1">
                            <i class="el-icon-warning"></i>
                            <span>风险案件</span>
                        </div>
@@ -183,7 +183,7 @@
                            <el-button type="primary" @click="register" v-if="[1,2].includes(info.status)">立案</el-button>
                            <el-button type="primary" @click="$refs.acceptance.open('案件受理', info.id)" v-if="[3,5].includes(info.status)">受理</el-button>
                            <el-button type="primary" @click="addRemark" v-if="![0,1,2,4,13,14].includes(info.status)">备注</el-button>
                            <el-button type="primary" @click="addReport(1)" v-if="[3].includes(info.status) && info.reportNumStatus === 0">添加报案号</el-button>
                            <el-button type="primary" @click="addReport(1)" v-if="[3,7,9].includes(info.status) && info.reportNumStatus === 0">添加报案号</el-button>
                            <el-button type="primary" @click="addReport(2)" v-if="[9].includes(info.status) && info.reportNumStatus === 1">编辑报案号</el-button>
                            <el-button type="primary" @click="$refs.adjustment.open('理算', info.id, 1)" v-if="[9].includes(info.status)">理算</el-button>
                            <el-button type="primary" @click="$refs.adjustment.open('重新理算', info.id, 1)" v-if="[10].includes(info.status)">重新理算</el-button>
@@ -193,7 +193,7 @@
                            <el-button type="primary" @click="supplementaryMaterials" v-if="[9].includes(info.status)">补充材料</el-button>
                            <el-button type="primary" @click="$refs.additionMaterial_ba.open('添加材料', info.id)" v-if="[9,10].includes(info.status)">添加材料</el-button>
                        </template>
                        <el-button icon="el-icon-refresh-left" type="primary" circle @click="$refs.caseProgress.open('案件进度', info.settleClaimsLogList)" v-if="![0,13,14].includes(info.status)"></el-button>
                        <el-button icon="el-icon-refresh-left" type="primary" title="查看案件进度" circle @click="$refs.caseProgress.open('案件进度', info.settleClaimsLogList)" v-if="![0].includes(info.status)"></el-button>
                    </div>
                </div>
                <div class="box_desc_list">
@@ -210,18 +210,18 @@
                        æŠ¥æ¡ˆäººï¼š{{info.informantName}}
                    </div>
                    <div class="box_desc_list_row">
                        æŠ¥æ¡ˆäººè”系方式:{{info.informantPhone}}
                       æŠ¥æ¡ˆäººè”系方式:{{info.informantPhone}}
                    </div>
                    <div class="box_desc_list_zw"></div>
                </div>
            </div>
            <div class="box_fx" v-if="info.isRisk === 1">
            <div class="box_fx" v-if="info.isRisk === 1 && showIsRisk ===true ">
                <div class="box_fx_left">
                    <i class="el-icon-warning"></i>
                    <span class="box_fx_left_a">注意,该案件有{{info.riskContent.length}}条风险信息</span>
                    <span class="box_fx_left_b" @click="$refs.riskCaseReminder.open('风险案件提醒', info.riskContent)">查看详情</span>
                </div>
                <i class="el-icon-close" @click="info.isRisk = 0"></i>
                <i class="el-icon-close" @click="closeRiskTip"></i>
            </div>
            <div class="box_desc">
                <div class="box_desc_head">
@@ -240,7 +240,7 @@
                        å‡ºé™©äººå§“名:{{info.memberName}}
                    </div>
                    <div class="box_desc_list_row">
                        å‡ºé™©äººèº«ä»½è¯å·ï¼š{{info.memberIdcard}}
                        å‡ºé™©äººèº«ä»½è¯å·ï¼š{{info.idcardNo}}
                    </div>
                    <div style="width: 33%; height: 0;"></div>
                </div>
@@ -281,7 +281,10 @@
                        äº‹æ•…类型:{{returnType(info.type)}}
                    </div>
                    <div class="box_desc_list_row">
                        æ˜¯å¦æœ‰åŒ»ç–—保险:{{returnName(info.medicalInsurance)}}
                        æ˜¯å¦ä¼¤æ®‹ï¼š{{returnName(info.hurtType)}}
                    </div>
                    <div class="box_desc_list_row">
                        æ˜¯å¦æœ‰åŒ»ä¿ï¼š{{returnName(info.medicalInsurance)}}
                    </div>
                    <div class="box_desc_list_row">
                        å°±è¯Šç±»åž‹ï¼š{{returnInHospital(info.inHospital)}}
@@ -358,7 +361,7 @@
                        <span>补充材料</span>
                    </div>
                    <div class="box_desc_cailiao_list">
                        <PreviewArea :list="info.supplementFileList || []" />
                        <PreviewArea   :list="info.supplementFileList || []" />
                    </div>
                </div>
            </div>
@@ -387,12 +390,13 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import { findById, returnSettle } from '@/api/business/settleClaims'
import {
    register,
    addReportNum,
    addRemark,
    saveSupplementDescribe,
    updCaseType,
    confirmFee } from '@/api/business/settleRisk'
  register,
  addReportNum,
  addRemark,
  saveSupplementDescribe,
  updCaseType,
  confirmFee
} from '@/api/business/settleRisk'
import RiskCaseReminder from '@/components/business/riskCaseReminder'
import CaseProgress from '@/components/business/caseProgress'
import Acceptance from '@/components/business/acceptance'
@@ -410,8 +414,9 @@
  components: { GlobalWindow, MakePayment, PreviewArea, PaymentInformation, CompensationDetails, RiskCaseReminder, CaseProgress, Acceptance, AdditionMaterial_ba, adjustment },
  data () {
    return {
        info: null,
        id: null
      info: null,
      id: null,
      showIsRisk: true
    }
  },
  computed: {
@@ -424,206 +429,244 @@
    })
  },
  methods: {
      open (title, id) {
          this.title = title
          this.id = id
    open (title, id) {
      this.title = title
      this.id = id
      this.getDetail()
    },
    closeRiskTip(){
      this.showIsRisk= false
    },
    setCaseType (e) {
      updCaseType({ id: this.id, caseType: e })
        .then(res => {
          this.getDetail()
      },
      setCaseType(e) {
          updCaseType({ id: this.id, caseType: e })
            .then(res => {
                this.getDetail()
            })
      },
      supplementaryMaterials() {
          this.$prompt('补充说明', '补充材料', {
              confirmButtonText: '提交',
              cancelButtonText: '取消',
              inputPattern: /^(?:.|\n)+$/,
              inputErrorMessage: '补充说明不能为空!',
              beforeClose: (action, instance, done) => {
                  if (action === 'confirm') {
                      instance.confirmButtonLoading = true;
                      saveSupplementDescribe({ id: this.id, describe: instance.inputValue })
                          .finally(() => {
                              done();
                              instance.confirmButtonLoading = false;
                          })
                  } else {
                      done();
                  }
              }
          }).then(({ value }) => {
              this.getDetail()
          }).catch(() => {
        })
    },
    supplementaryMaterials () {
      this.$prompt('补充说明', '补充材料', {
        confirmButtonText: '提交',
        cancelButtonText: '取消',
        inputType: 'textarea',
        inputPattern: /^(?:.|\n)+$/,
        inputErrorMessage: '补充说明不能为空!',
        beforeClose: (action, instance, done) => {
          if (action === 'confirm') {
            instance.confirmButtonLoading = true
            saveSupplementDescribe({ id: this.id, describe: instance.inputValue })
                .then((res) => {
                  done()
                })
                .catch((data) => {
                  this.$message.error(data.message)
                })
                .finally(() => {
                  instance.confirmButtonLoading = false
                })
          } else {
            done()
          }
        }
      }).then(({ value }) => {
        this.getDetail()
      }).catch(() => {
          });
      },
      addRemark() {
          this.$prompt('备注', '添加备注', {
              confirmButtonText: '添加',
              cancelButtonText: '取消',
              inputPattern: /^(?:.|\n)+$/,
              inputErrorMessage: '备注不能为空!',
              beforeClose: (action, instance, done) => {
                  if (action === 'confirm') {
                      instance.confirmButtonLoading = true;
                      addRemark({ id: this.id, describe: instance.inputValue })
                          .finally(() => {
                              done();
                              instance.confirmButtonLoading = false;
                          })
                  } else {
                      done();
                  }
              }
          }).then(({ value }) => {
              this.getDetail()
          }).catch(() => {
      })
    },
    addRemark () {
      this.$prompt('备注', '添加备注', {
        confirmButtonText: '添加',
        cancelButtonText: '取消',
        inputType: 'textarea',
        inputPattern: /^(?:.|\n)+$/,
        inputErrorMessage: '备注不能为空!',
        beforeClose: (action, instance, done) => {
          if (action === 'confirm') {
            instance.confirmButtonLoading = true
            addRemark({ id: this.id, describe: instance.inputValue })
                .then((res) => {
                  done()
                })
                .catch((data) => {
                  this.$message.error(data.message)
                })
                .finally(() => {
                  instance.confirmButtonLoading = false
                })
          } else {
            done()
          }
        }
      }).then(({ value }) => {
        this.getDetail()
      }).catch(() => {
          });
      },
      addReport(type) {
          this.$prompt(`报案号`, `${type === 1 ? '添加报案号' : '编辑报案号'}`, {
              confirmButtonText: '添加',
              cancelButtonText: '取消',
              inputPattern: /^(?:.|\n)+$/,
              inputErrorMessage: '报案号不能为空!',
              beforeClose: (action, instance, done) => {
                  if (action === 'confirm') {
                      instance.confirmButtonLoading = true;
                      addReportNum({ id: this.id, reportNum: instance.inputValue })
                        .finally(() => {
                            done();
                            instance.confirmButtonLoading = false;
                        })
                  } else {
                      done();
                  }
              }
          }).then(({ value }) => {
              this.getDetail()
          }).catch(() => {
          });
      },
      register() {
          this.$prompt('立案说明', '立案', {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              beforeClose: (action, instance, done) => {
                  if (action === 'confirm') {
                      instance.confirmButtonLoading = true;
                      register({ id: this.id, describe: instance.inputValue, registerStatus: 3 })
                          .finally(() => {
                              done();
                              instance.confirmButtonLoading = false;
                          })
                  } else {
                      done();
                  }
              }
          }).then(({ value }) => {
              this.getDetail()
          }).catch(() => {
          });
      },
      returnCase() {
          this.$prompt('退回说明', '退回', {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              inputPattern: /^(?:.|\n)+$/,
              inputErrorMessage: '退回说明不能为空!',
              beforeClose: (action, instance, done) => {
                  if (action === 'confirm') {
                      instance.confirmButtonLoading = true;
                      register({ id: this.id, describe: instance.inputValue, registerStatus: 4 })
                          .finally(() => {
                              done();
                              instance.confirmButtonLoading = false;
                          })
                  } else {
                      done();
                  }
              }
          }).then(({ value }) => {
              this.getDetail()
          }).catch(() => {
          });
      },
      getDetail() {
          findById(this.id)
              .then(res => {
                  res.riskContent = JSON.parse(res.riskContent)
                  this.info = res
                  this.visible = true
      })
    },
    addReport (type) {
      this.$prompt('报案号', `${type === 1 ? '添加报案号' : '编辑报案号'}`, {
        confirmButtonText: '添加',
        cancelButtonText: '取消',
        inputPattern: /^(?:.|\n)+$/,
        inputErrorMessage: '报案号不能为空!',
        beforeClose: (action, instance, done) => {
          if (action === 'confirm') {
            instance.confirmButtonLoading = true
            addReportNum({ id: this.id, reportNum: instance.inputValue })
              .then((res) => {
                done()
              })
      },
      // æ’¤é”€
      revoke(id) {
          this.$confirm('撤销后,案件直接结束,无法继续进行理赔操作!', '是否撤销报案?', {
              confirmButtonText: '确定撤销',
              cancelButtonText: '我再想想',
              type: 'warning'
          }).then(() => {
              returnSettle({ id: this.info.id })
                  .then(res => {
                      this.getDetail()
                  })
          }).catch(() => {
              .catch((data) => {
                this.$message.error(data.message)
              })
              .finally(() => {
                instance.confirmButtonLoading = false
              })
          } else {
            done()
          }
        }
      }).then(({ value }) => {
        this.getDetail()
      }).catch(() => {
          });
      },
      returnInHospital(type) {
          switch (type) {
              case 0:
                  return '住院'
              case 1:
                  return '门诊'
      })
    },
    register () {
      this.$prompt('立案说明', '立案', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputType: 'textarea',
        beforeClose: (action, instance, done) => {
          if (action === 'confirm') {
            instance.confirmButtonLoading = true
            register({ id: this.id, describe: instance.inputValue, registerStatus: 3 })
                .then((res) => {
                  done()
                })
                .catch((data) => {
                  this.$message.error(data.message)
                })
                .finally(() => {
                  instance.confirmButtonLoading = false
                })
          } else {
            done()
          }
      },
      returnName(type) {
          switch (type) {
              case 0:
                  return '是'
              case 1:
                  return '否'
          }
      },
      returnType(type) {
          switch (type) {
                case 0:
                    return '工作期间受伤'
              case 1:
                  return '上下班途中受伤'
              case 2:
                  return '非工作时间受伤'
              case 3:
                  return '意外受伤'
          }
      },
      confirmFeeInfo() {
          this.$confirm('是否确认赔付金额?', '提示', {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning'
          }).then(() => {
              confirmFee(this.id)
                  .then(res => {
                      this.getDetail()
                  })
          }).catch(() => {
        }
      }).then(({ value }) => {
        this.getDetail()
      }).catch(() => {
          });
      },
      })
    },
    returnCase () {
      this.$prompt('退回说明', '退回', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputType: 'textarea',
        inputPattern: /^(?:.|\n)+$/,
        inputErrorMessage: '退回说明不能为空!',
        beforeClose: (action, instance, done) => {
          if (action === 'confirm') {
            instance.confirmButtonLoading = true
            register({ id: this.id, describe: instance.inputValue, registerStatus: 4 })
                .then((res) => {
                  done()
                })
                .catch((data) => {
                  this.$message.error(data.message)
                })
                .finally(() => {
                  instance.confirmButtonLoading = false
                })
          } else {
            done()
          }
        }
      }).then(({ value }) => {
        this.getDetail()
      }).catch(() => {
      })
    },
    getDetail () {
      findById(this.id)
        .then(res => {
          res.riskContent = JSON.parse(res.riskContent)
          this.info = res
          this.info.showIsRisk = true
          this.visible = true
        })
    },
    // æ’¤é”€
    revoke (id) {
      this.$confirm('撤销后,案件直接结束,无法继续进行理赔操作!', '是否撤销报案?', {
        confirmButtonText: '确定撤销',
        cancelButtonText: '我再想想',
        type: 'warning'
      }).then(() => {
        returnSettle({ id: this.info.id })
          .then(res => {
            this.getDetail()
          })
      }).catch(() => {
      })
    },
    returnInHospital (type) {
      switch (type) {
      case 0:
        return '住院'
      case 1:
        return '门诊'
      }
    },
    returnName (type) {
      switch (type) {
      case 0:
        return '是'
      case 1:
        return '否'
      case 2:
        return '待确定'
      default:
        return ''
      }
    },
    returnType (type) {
      switch (type) {
      case 0:
        return '工作期间受伤'
      case 1:
        return '上下班途中受伤'
      case 2:
        return '非工作时间受伤'
      case 3:
        return '意外受伤'
      }
    },
    confirmFeeInfo () {
      this.$confirm('是否确认赔付金额?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        confirmFee(this.id)
          .then(res => {
            this.getDetail()
          })
      }).catch(() => {
      })
    }
  }
}
</script>
<style lang="scss" scoped>
    .box {
        //margin-left: 30px;
        width: 100%;
        .box_tui {
            width: 100%;
@@ -987,6 +1030,7 @@
            .box_desc_head {
                width: 100%;
                display: flex;
                font-weight: bold;
                align-items: center;
                justify-content: space-between;
                margin-bottom: 26px;
@@ -1017,6 +1061,7 @@
                        margin-right: 20px;
                    }
                    .box_desc_title_tips {
                      cursor: pointer;
                        width: 84px;
                        height: 25px;
                        border-radius: 15px;
company/src/components/business/OperaSolutionsBaseWindow.vue
@@ -101,6 +101,8 @@
                    <el-button type="primary" @click="impor">导入工种</el-button>
                    <el-button type="text" @click="exprot">导入模版xls</el-button>
                </div>
              <el-form-item label="已添加工种" prop="worktypeIdList">
                <u-table
                    :data="form.worktypeIdList"
                    border
@@ -125,6 +127,7 @@
                        </template>
                    </u-table-column>
                </u-table>
              </el-form-item>
            </div>
            <el-form-item label="风险设置" prop="risk">
                <div class="tx">
@@ -151,8 +154,8 @@
                        </div>
                        <div class="tx_item_content">
                            <span>规则设置:允许出险时间在保单生效前</span>
                            <el-input-number style="margin: 0 15px;" v-model="form.riskNewUserTime" :min="1"></el-input-number>
                            <el-select v-model="form.riskNewUserUnit" style="width: 100px; margin-right: 15px;" placeholder="请选择">
                            <el-input-number style="margin: 0 15px;" :disabled="form.riskNewUserStatus === 0"   v-model="form.riskNewUserTime" :min="1"></el-input-number>
                            <el-select v-model="form.riskNewUserUnit"  :disabled="form.riskNewUserStatus === 0"  style="width: 100px; margin-right: 15px;" placeholder="请选择">
                                <el-option label="小时" :value="1"></el-option>
                                <el-option label="天" :value="2"></el-option>
                            </el-select>
@@ -283,6 +286,9 @@
          correctWarnTime: [
            { required: true, message: '请输入批改提醒时间' }
          ],
          worktypeIdList: [
            { required: true, message: '请完善工种信息' }
          ],
          canAdd: [
            { required: true, validator: canAddFun }
          ]
company/src/components/business/caseProgress.vue
@@ -3,7 +3,7 @@
        :title="title"
        width="50%"
        :withFooter="false"
        :visible.sync="visible"
        :visible.sync="visible"是否
        :confirm-working="isWorking"
    >
        <el-timeline reverse>
@@ -11,7 +11,7 @@
                <div style="display: flex; flex-direction: column;">
                    <span class="a">{{item.title}}</span>
                    <span class="b">{{item.creatorName}} {{item.companyName || '平台理赔员'}} {{item.createDate }}</span>
                    <span class="c">说明:{{item.content}}</span>
                    <span class="c" v-if="index>0">说明:{{item.content}}</span>
                </div>
            </el-timeline-item>
        </el-timeline>
company/src/components/business/tagLibrary.vue
@@ -22,56 +22,72 @@
                </div>
            </div>
        </div>
      <template v-slot:footer>
        <el-button @click="close">返回</el-button>
      </template>
    </GlobalWindow>
</template>
<script>
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import { createLabels, list, labelsDeleteById } from '@/api/business/knowledge'
    export default {
        name: 'tagLibrary',
        extends: BaseOpera,
        components: { GlobalWindow },
        data () {
            return {
                value: '',
                list: []
            }
        },
        created () {
            this.config({
                api: '/business/knowledge',
                'field.id': 'id'
            })
        },
        methods: {
            async open(title, target) {
                this.title = title
                await this.getData()
                this.visible = true
            },
            async getData() {
                this.list = await list()
            },
            // æ·»åŠ æ ‡ç­¾
            async add() {
                if (!this.value) return this.$message.warning('请先输入内容')
                let res = await createLabels({ name: this.value })
                await this.getData()
                this.$emit('refresh')
                this.value = ''
                this.$message.success('添加成功')
            },
            // åˆ é™¤
            async dele(id) {
                let res = await labelsDeleteById(id)
                await this.getData()
                this.$emit('refresh')
                this.$message.success('删除成功')
            }
        }
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { createLabels, list, labelsDeleteById } from '@/api/business/knowledge'
export default {
  name: 'tagLibrary',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      value: '',
      list: []
    }
  },
  created () {
    this.config({
      api: '/business/knowledge',
      'field.id': 'id'
    })
  },
  methods: {
    async open (title, target) {
      this.title = title
      await this.getData()
      this.visible = true
    },
    async getData () {
      this.list = await list()
    },
    // æ·»åŠ æ ‡ç­¾
    async add () {
      if (!this.value) return this.$message.warning('请先输入内容')
       createLabels({ name: this.value })
        .then(() => {
          this.$message.success('添加成功')
          this.$emit('success')
          this.getData()
          this.$emit('refresh')
          this.value = ''
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
    },
    // åˆ é™¤
    async dele (id) {
     labelsDeleteById(id)
        .then(() => {
          this.$message.success('删除成功')
          this.$emit('success')
          this.getData()
          this.$emit('refresh')
          this.value = ''
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
    }
  }
}
</script>
<style lang="scss" scoped>
company/src/components/common/previewArea.vue
@@ -1,10 +1,12 @@
<template>
<template   :append-to-body="true">
    <div class="box_item_list_row_l">
        <div class="desc_data_list_item" v-for="(item, index) in list" :key="index">
            <div class="desc_data_list_item_img" v-if="item.type === 0">
                <el-image
                    style="width: 100%; height: 100%"
                    style="width: 100%; height: 100%;"
                    :src="item.fileurlFull"
                    :preview-teleported="true"
                    :append-to-body="true"
                    :preview-src-list="[item.fileurlFull]">
                </el-image>
            </div>
@@ -27,19 +29,24 @@
        props: {
            list: {
                type: Array,
                default: ()=> []
      default: ()=> []
            }
        },
        methods: {
            openFile(url) {
                window.open(url)
            }
    }
        }
    }
</script>
<style>
.el-image-viewer__wrapper{
   z-index: 9999 !important;
}
</style>
<style lang="scss" scoped>
    .box_item_list_row_l {
.box_item_list_row_l {
        width: 100%;
        display: flex;
        align-items: center;
company/src/components/enterprise/onlineReporting.vue
@@ -407,360 +407,376 @@
</template>
<script>
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import upload from '@/components/common/upload'
    import { saveSettleClaims } from '@/api/business/settleRisk'
    import { findById } from '@/api/business/settleClaims'
    import { findListByDTO } from '@/api/business/member'
    import { findList } from '@/api/business/applyChange'
    import { findTreeList } from '@/api/business/knowledge'
    import OperaWtbApplyShopWindow from '@/components/business/OperaWtbApplyShopWindow'
    import OperaInsuranceApplyDetails from '@/components/business/OperaInsuranceApplyWindow'
    import OperaSettleClaimsWindow from '@/components/business/OperaSettleClaimsWindow'
    import { mapState } from 'vuex'
    export default {
        name: 'onlineReporting',
        extends: BaseOpera,
        components: { GlobalWindow, upload, OperaSettleClaimsWindow, OperaWtbApplyShopWindow, OperaInsuranceApplyDetails },
        computed: {
            ...mapState(['userInfo'])
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import upload from '@/components/common/upload'
import { saveSettleClaims } from '@/api/business/settleRisk'
import { findById } from '@/api/business/settleClaims'
import { findListByDTO } from '@/api/business/member'
import { findList } from '@/api/business/applyChange'
import { findTreeList } from '@/api/business/knowledge'
import OperaWtbApplyShopWindow from '@/components/business/OperaWtbApplyShopWindow'
import OperaInsuranceApplyDetails from '@/components/business/OperaInsuranceApplyWindow'
import OperaSettleClaimsWindow from '@/components/business/OperaSettleClaimsWindow'
import { mapState } from 'vuex'
export default {
  name: 'onlineReporting',
  extends: BaseOpera,
  components: { GlobalWindow, upload, OperaSettleClaimsWindow, OperaWtbApplyShopWindow, OperaInsuranceApplyDetails },
  computed: {
    ...mapState(['userInfo'])
  },
  data () {
    return {
      i: 0,
      id: null,
      statusList: [
        {
          name: '填写出险信息',
          info: '完成报案基础信息填写'
        },
        data () {
            return {
                i: 0,
                id: null,
                statusList: [
                    {
                        name: '填写出险信息',
                        info: '完成报案基础信息填写'
                    },
                    {
                        name: '上传理赔材料',
                        info: '补充需要理赔的相关资料'
                    },
                    {
                        name: '完成报案',
                        info: '提交报案信息'
                    }
                ],
                form: {
                    id: null,
                    memberId: '',
                    idcardNo: '',
                    insuranceApplyId: '',
                    happenTime: '',
                    hospital: '',
                    area: [],
                    areaId: '',
                    address: '',
                    areaInfo: '',
                    content: '',
                    type: 0,
                    inHospital: 0,
                    hurtType: 0,
                    medicalInsurance: 0,
                    reportFileList: [],
                    informantName: '',
                    informantPhone: '',
                    relationFileList: [],
                    outpatientFileList: [],
                    hospitalFileList: [],
                    disabilityFileList: [],
                    otherFileList: [],
                    applyDetailId: '',
                    solutionId: '',
                    worktypeId: '',
                    duId: '',
                    receiveBank: '',
                    receiveUserName: '',
                    receiveAccount: ''
                },
                rules: {
                    receiveAccount: [
                        { required: true, message: '不能为空' }
                    ],
                    receiveUserName: [
                        { required: true, message: '不能为空' }
                    ],
                    receiveBank: [
                        { required: true, message: '不能为空' }
                    ],
                    memberId: [
                        { required: true, message: '不能为空' }
                    ],
                    idcardNo: [
                        { required: true, message: '不能为空' }
                    ],
                    happenTime: [
                        { required: true, message: '不能为空' }
                    ],
                    content: [
                        { required: true, message: '不能为空' }
                    ],
                    type: [
                        { required: true, message: '不能为空' }
                    ],
                    inHospital: [
                        { required: true, message: '不能为空' }
                    ],
                    hurtType: [
                        { required: true, message: '不能为空' }
                    ],
                    medicalInsurance: [
                        { required: true, message: '不能为空' }
                    ],
                    informantName: [
                        { required: true, message: '不能为空' }
                    ],
                    informantPhone: [
                        { required: true, message: '不能为空' }
                    ],
                },
                pickerOptions: {},
                area: [],
                user: [],
                solutionList: []
            }
        {
          name: '上传理赔材料',
          info: '补充需要理赔的相关资料'
        },
        created () {
            this.config({
                api: '/business/settleClaims',
                'field.id': 'id'
            })
        },
        methods: {
            open (title, id) {
                this.title = title
                this.form.area = []
                this.i = 0
                this.solutionList = []
                this.area = []
                this.user = []
                this.getUser()
                this.getCityTree()
                if (id) {
                    findById(id)
                        .then(res => {
                            this.visible = true
                            this.$nextTick(() => {
                                for (const key in this.form) {
                                    this.form[key] = res[key]
                                }
                                if (this.form.areaId) {
                                    this.form.area = this.form.areaId.split(',').map(item => Number(item))
                                }
                                findList({ memberId: this.form.memberId })
                                    .then(res1 => {
                                        res1.forEach(item => {
                                            if (item.id === res.applyDetailId) {
                                                item.active = true
                                                this.pickerOptions = {
                                                    disabledDate(time) {
                                                        return time.getTime() < new Date(item.parentStartTime).getTime() || time.getTime() > new Date(item.parentEndTime).getTime()
                                                    }
                                                };
                                            } else {
                                                item.active = false
                                            }
                                        })
                                        this.solutionList = res1
                                    })
                            })
                        })
                } else {
                    this.visible = true
                    this.$nextTick(() => {
                        this.$refs.form.resetFields()
                        this.form.informantName = this.userInfo.realname
                    })
                }
            },
            continueReporting() {
                this.i = 0
                this.id = null
                this.pickerOptions = {}
                this.solutionList = []
                this.form = {
                    id: null,
                    memberId: '',
                    idcardNo: '',
                    insuranceApplyId: '',
                    happenTime: '',
                    hospital: '',
                    area: [],
                    areaId: '',
                    address: '',
                    areaInfo: '',
                    content: '',
                    type: 0,
                    inHospital: 0,
                    hurtType: 0,
                    medicalInsurance: 0,
                    reportFileList: [],
                    informantName: '',
                    informantPhone: '',
                    relationFileList: [],
                    outpatientFileList: [],
                    hospitalFileList: [],
                    disabilityFileList: [],
                    otherFileList: [],
                    applyDetailId: '',
                    solutionId: '',
                    worktypeId: '',
                    duId: '',
                    receiveBank: '',
                    receiveUserName: '',
                    receiveAccount: ''
                }
            },
            changeArea(e) {
                if (!e && e.length === 0) {
                    this.form.areaId = ''
                    this.form.areaInfo = ''
                } else {
                    this.form.areaId = e.join(',')
                    this.form.areaInfo = this.$refs.cascader.getCheckedNodes()[0].pathLabels.join(',')
                }
            },
            async getCityTree() {
                this.area = await findTreeList({})
                this.setSecondLevelChildrenToNullPrecise(this.area);
            },
            setSecondLevelChildrenToNullPrecise(data, level = 1) {
                if (!data || !data.length) return;
                data.forEach(item => {
                    if (item.childAreasList && item.childAreasList.length) {
                        if (level === 2) {
                            // è¿™æ˜¯ç¬¬ä¸€çº§èŠ‚ç‚¹ï¼Œå¤„ç†å…¶å­èŠ‚ç‚¹ï¼ˆç¬¬äºŒçº§ï¼‰
                            item.childAreasList.forEach(child => {
                                child.childAreasList = null;
                            });
                        } else {
                            // ç»§ç»­é€’归处理更深层级
                            this.setSecondLevelChildrenToNullPrecise(item.childAreasList, level + 1);
                        }
                    }
                });
            },
            getUser() {
                findListByDTO({})
                    .then(res => {
                        this.user = res
                    })
            },
            delFile(index, type) {
                if (type === 1) {
                    this.form.relationFileList.splice(index, 1)
                } else if (type === 2) {
                    this.form.outpatientFileList.splice(index, 1)
                } else if (type === 3) {
                    this.form.hospitalFileList.splice(index, 1)
                } else if (type === 4) {
                    this.form.disabilityFileList.splice(index, 1)
                } else if (type === 5) {
                    this.form.otherFileList.splice(index, 1)
                } else if (type === 6) {
                    this.form.reportFileList.splice(index, 1)
                }
            },
            claimsUploadFile(file, type) {
                file.fileurl = file.imgaddr
                file.name = file.originname
                file.fileurlFull = file.url
                if (type === 1) {
                    this.form.relationFileList.push(file)
                } else if (type === 2) {
                    this.form.outpatientFileList.push(file)
                } else if (type === 3) {
                    this.form.hospitalFileList.push(file)
                } else if (type === 4) {
                    this.form.disabilityFileList.push(file)
                } else if (type === 5) {
                    this.form.otherFileList.push(file)
                } else if (type === 6) {
                    this.form.reportFileList.push(file)
                }
            },
            getSolutions(id) {
                let row = this.user.filter(item => item.id === id)
                this.form.idcardNo = row[0].idcardNo
                findList({ memberId: id })
                    .then(res => {
                        this.form.insuranceApplyId = ''
                        res.forEach(item => {
                            item.active = false
                        })
                        this.solutionList = res
                    })
            },
            changeSolution(e, i) {
                this.solutionList.forEach((item, index) => {
                    item.active = i === index
                })
                let obj = this.solutionList.filter(item => item.active)[0]
                this.form.insuranceApplyId = obj.applyId
                this.form.solutionId = obj.solutionId
                this.form.worktypeId = obj.worktypeId
                this.form.duId = obj.duId
                this.form.applyDetailId = obj.id
                this.form.happenTime = ''
                this.pickerOptions = {
                    disabledDate(time) {
                        return time.getTime() < new Date(obj.parentStartTime).getTime() || time.getTime() > new Date(obj.parentEndTime).getTime()
                    }
                };
            },
            // æŸ¥çœ‹ä¿å•详情
            jumpSolutionDetail(id, solutionType) {
                if (solutionType === 1) {
                    this.$refs.OperaWtbApplyShopWindow.open('委托投保详情', { id: id })
                } else {
                    this.$refs.OperaInsuranceApplyDetails.open('投保详情', { id: id })
                }
            },
            confirm(saveType) {
                this.isWorking = true
                saveSettleClaims({...this.form, saveType})
                    .then(res => {
                        console.log(res)
                        if (saveType === 0) {
                            this.visible = false
                        } else {
                            this.id = res
                            this.i = 2
                        }
                        this.$emit('success')
                    })
                    .finally(() => {
                        this.isWorking = false
                    })
            },
            next() {
                this.$refs.form.validate((valid) => {
                    if (!valid) return
                    this.i++
                    // this.isWorking = true
                    // createSys(obj)
                    //     .then(() => {
                    //         this.visible = false
                    //         this.$emit('success')
                    //     })
                    //     .catch(e => {
                    //         this.$tip.apiFailed(e)
                    //     })
                    //     .finally(() => {
                    //         this.isWorking = false
                    //     })
                })
            }
        {
          name: '完成报案',
          info: '提交报案信息'
        }
      ],
      form: {
        id: null,
        memberId: '',
        idcardNo: '',
        insuranceApplyId: '',
        happenTime: '',
        hospital: '',
        area: [],
        areaId: '',
        address: '',
        areaInfo: '',
        content: '',
        type: 0,
        inHospital: 0,
        hurtType: 0,
        medicalInsurance: 0,
        reportFileList: [],
        informantName: '',
        informantPhone: '',
        relationFileList: [],
        outpatientFileList: [],
        hospitalFileList: [],
        disabilityFileList: [],
        otherFileList: [],
        applyDetailId: '',
        solutionId: '',
        worktypeId: '',
        duId: '',
        receiveBank: '',
        receiveUserName: '',
        receiveAccount: ''
      },
      rules: {
        receiveAccount: [
          { required: true, message: '不能为空' }
        ],
        receiveUserName: [
          { required: true, message: '不能为空' }
        ],
        receiveBank: [
          { required: true, message: '不能为空' }
        ],
        memberId: [
          { required: true, message: '不能为空' }
        ],
        idcardNo: [
          { required: true, message: '不能为空' }
        ],
        happenTime: [
          { required: true, message: '不能为空' }
        ],
        content: [
          { required: true, message: '不能为空' }
        ],
        type: [
          { required: true, message: '不能为空' }
        ],
        inHospital: [
          { required: true, message: '不能为空' }
        ],
        hurtType: [
          { required: true, message: '不能为空' }
        ],
        medicalInsurance: [
          { required: true, message: '不能为空' }
        ],
        informantName: [
          { required: true, message: '不能为空' }
        ],
        informantPhone: [
          { required: true, message: '不能为空' }
        ]
      },
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() > Date.now(); // ç¦ç”¨æœªæ¥çš„æ—¥æœŸ
        }
      },
      area: [],
      user: [],
      solutionList: []
    }
  },
  created () {
    this.config({
      api: '/business/settleClaims',
      'field.id': 'id'
    })
  },
  methods: {
    open (title, id) {
      this.title = title
      this.form.area = []
      this.i = 0
      this.solutionList = []
      this.area = []
      this.user = []
      this.getUser()
      this.getCityTree()
      if (id) {
        findById(id)
          .then(res => {
            this.visible = true
            this.$nextTick(() => {
              for (const key in this.form) {
                this.form[key] = res[key]
              }
              if (this.form.areaId) {
                this.form.area = this.form.areaId.split(',').map(item => Number(item))
              }
              findList({ memberId: this.form.memberId })
                .then(res1 => {
                  res1.forEach(item => {
                    if (item.id === res.applyDetailId) {
                      item.active = true
                      this.pickerOptions = {
                        disabledDate (time) {
                          var start = new Date(item.startTime)
                          var end = new Date(item.endTime)
                          return ( time.getTime() < start.getTime() ||  time.getTime()>end.getTime())
                        }
                      }
                    } else {
                      item.active = false
                    }
                  })
                  this.solutionList = res1
                })
            })
          })
      } else {
        this.visible = true
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form.informantName = this.userInfo.realname
        })
      }
    },
    continueReporting () {
      this.i = 0
      this.id = null
      this.pickerOptions = {}
      this.solutionList = []
      this.form = {
        id: null,
        memberId: '',
        idcardNo: '',
        insuranceApplyId: '',
        happenTime: '',
        hospital: '',
        area: [],
        areaId: '',
        address: '',
        areaInfo: '',
        content: '',
        type: 0,
        inHospital: 0,
        hurtType: 0,
        medicalInsurance: 0,
        reportFileList: [],
        informantName: '',
        informantPhone: '',
        relationFileList: [],
        outpatientFileList: [],
        hospitalFileList: [],
        disabilityFileList: [],
        otherFileList: [],
        applyDetailId: '',
        solutionId: '',
        worktypeId: '',
        duId: '',
        receiveBank: '',
        receiveUserName: '',
        receiveAccount: ''
      }
    },
    changeArea (e) {
      if (!e && e.length === 0) {
        this.form.areaId = ''
        this.form.areaInfo = ''
      } else {
        this.form.areaId = e.join(',')
        this.form.areaInfo = this.$refs.cascader.getCheckedNodes()[0].pathLabels.join(',')
      }
    },
    async getCityTree () {
      this.area = await findTreeList({})
      this.setSecondLevelChildrenToNullPrecise(this.area)
    },
    setSecondLevelChildrenToNullPrecise (data, level = 1) {
      if (!data || !data.length) return
      data.forEach(item => {
        if (item.childAreasList && item.childAreasList.length) {
          if (level === 2) {
            // è¿™æ˜¯ç¬¬ä¸€çº§èŠ‚ç‚¹ï¼Œå¤„ç†å…¶å­èŠ‚ç‚¹ï¼ˆç¬¬äºŒçº§ï¼‰
            item.childAreasList.forEach(child => {
              child.childAreasList = null
            })
          } else {
            // ç»§ç»­é€’归处理更深层级
            this.setSecondLevelChildrenToNullPrecise(item.childAreasList, level + 1)
          }
        }
      })
    },
    getUser () {
      findListByDTO({})
        .then(res => {
          this.user = res
        })
    },
    delFile (index, type) {
      if (type === 1) {
        this.form.relationFileList.splice(index, 1)
      } else if (type === 2) {
        this.form.outpatientFileList.splice(index, 1)
      } else if (type === 3) {
        this.form.hospitalFileList.splice(index, 1)
      } else if (type === 4) {
        this.form.disabilityFileList.splice(index, 1)
      } else if (type === 5) {
        this.form.otherFileList.splice(index, 1)
      } else if (type === 6) {
        this.form.reportFileList.splice(index, 1)
      }
    },
    claimsUploadFile (file, type) {
      file.fileurl = file.imgaddr
      file.name = file.originname
      file.fileurlFull = file.url
      if (type === 1) {
        this.form.relationFileList.push(file)
      } else if (type === 2) {
        this.form.outpatientFileList.push(file)
      } else if (type === 3) {
        this.form.hospitalFileList.push(file)
      } else if (type === 4) {
        this.form.disabilityFileList.push(file)
      } else if (type === 5) {
        this.form.otherFileList.push(file)
      } else if (type === 6) {
        this.form.reportFileList.push(file)
      }
    },
    getSolutions (id) {
      const row = this.user.filter(item => item.id === id)
      this.form.idcardNo = row[0].idcardNo
      findList({ memberId: id })
        .then(res => {
          this.form.insuranceApplyId = ''
          res.forEach(item=> {
              item.active = false
          })
          this.solutionList = res
          this.changeSolution(null,0)
        })
    },
    changeSolution (e, i) {
      this.pickerOptions = {}
      if(this.solutionList.length < i){
        return
      }
      this.solutionList.forEach((item, index) => {
        item.active = i === index
      })
      const obj = this.solutionList.filter(item => item.active)[0]
      this.pickerOptions = {
        disabledDate (time) {
          var start = new Date(obj.startTime)
          var end = new Date(obj.endTime)
          return ( time.getTime() < start.getTime() ||  time.getTime()>end.getTime())
        }
      }
      this.form.insuranceApplyId = obj.applyId
      this.form.solutionId = obj.solutionId
      this.form.worktypeId = obj.worktypeId
      this.form.duId = obj.duId
      this.form.applyDetailId = obj.id
      this.form.happenTime = obj.startTime
      console.log(this.pickerOptions)
    },
    // æŸ¥çœ‹ä¿å•详情
    jumpSolutionDetail (id, solutionType) {
      if (solutionType === 1) {
        this.$refs.OperaWtbApplyShopWindow.open('委托投保详情', { id: id })
      } else {
        this.$refs.OperaInsuranceApplyDetails.open('投保详情', { id: id })
      }
    },
    confirm (saveType) {
      this.isWorking = true
      saveSettleClaims({ ...this.form, saveType })
        .then(res => {
          console.log(res)
          if (saveType === 0) {
            this.visible = false
          } else {
            this.id = res
            this.i = 2
          }
          this.$emit('success')
        }).catch(err => {
            this.$tip.apiFailed(err)
         })
        .finally(() => {
          this.isWorking = false
        })
    },
    next () {
      this.$refs.form.validate((valid) => {
        if (!valid) return
        this.i++
        // this.isWorking = true
        // createSys(obj)
        //     .then(() => {
        //         this.visible = false
        //         this.$emit('success')
        //     })
        //     .catch(e => {
        //         this.$tip.apiFailed(e)
        //     })
        //     .finally(() => {
        //         this.isWorking = false
        //     })
      })
    }
  }
}
</script>
<style lang="scss" scoped>
company/src/views/business/knowledge.vue
@@ -2,15 +2,29 @@
    <TableLayout :permissions="['business:knowledge:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="标题/内容" prop="title">
                <el-input v-model="searchForm.title" placeholder="请输入标题内容" @keypress.enter.native="search"></el-input>
            <el-form-item label="标题" prop="title">
                <el-input v-model="searchForm.title" style="width: 120px"  clearable placeholder="请输入标题" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="省份编码" prop="provinceId">
                <el-input v-model="searchForm.provinceId" placeholder="请输入省份编码" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="城市编码" prop="cityId">
                <el-input v-model="searchForm.cityId" placeholder="请输入城市编码" @keypress.enter.native="search"></el-input>
            </el-form-item>
          <el-form-item label="省份" prop="area">
            <el-select style="width: 120px"  v-model="searchForm.provinceId" clearable filterable @change="changeProvince" placeholder="请选择">
              <el-option
                  v-for="item in areas"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="城市" prop="area">
            <el-select style="width: 120px" v-model="searchForm.cityId"  clearablefilterable @change="search" placeholder="请选择">
              <el-option
                  v-for="item in citys"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
              </el-option>
            </el-select>
          </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
<!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:knowledge:exportExcel']" @click="exportExcel">导出</el-button>-->
@@ -25,18 +39,17 @@
            </ul>
            <div class="list" v-loading="isWorking.search" v-if="tableData.list.length > 0">
                <div class="list-item" v-for="(item, index) in tableData.list" :key="index">
                    <div class="list-item-title">
                        <span>{{item.title}}</span>
                    <div class="list-item-title" @click="gourl(item.link)">
                        <span >{{item.title}}</span>
                        <i class="el-icon-arrow-right"></i>
                    </div>
                    <div class="list-item-cates" v-if="item.labelNames">
                        <div class="list-item-cates-row" v-for="(label, index) in item.labelNames.split(',')" :key="index">政策法规labels</div>
                        <div class="list-item-cates-row">{{label}}</div>
                    <div class="list-item-cates" v-if="item.labels">
                        <div class="list-item-cates-row" v-for="(label, index) in item.labels.split(',')" :key="index">  {{label}}</div>
                    </div>
                    <div class="list-item-footer">
                        <div class="left">
                            <div class="list-item-footer-row">适用地区:{{item.cityName ? item.cityName : item.provinceName}}</div>
                            <div class="list-item-footer-row">适用年份:{{item.yearInfo}}</div>
                            <div class="list-item-footer-row">适用年份:{{item.yearInfo}} å¹´</div>
                        </div>
                        <div class="right">
                            <el-button type="text" size="medium" style="margin-right: 15px; color: red;" @click="dele(item.id)">删除</el-button>
@@ -61,50 +74,71 @@
</template>
<script>
    import BaseTable from '@/components/base/BaseTable'
    import TableLayout from '@/layouts/TableLayout'
    import Pagination from '@/components/common/Pagination'
    import OperaKnowledgeWindow from '@/components/business/OperaKnowledgeWindow'
    import { deleteById } from '@/api/business/knowledge'
    export default {
        name: 'Knowledge',
        extends: BaseTable,
        components: { TableLayout, Pagination, OperaKnowledgeWindow },
        data () {
            return {
                // æœç´¢
                searchForm: {
                    provinceId: '',
                    cityId: '',
                    title: ''
                }
            }
        },
        created () {
            this.config({
                module: '知识库信息表',
                api: '/business/knowledge',
                'field.id': 'id',
                'field.main': 'id'
            })
            this.search()
        },
        methods: {
            dele(id) {
                this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(async () => {
                    let res = await deleteById(id)
                    this.search()
                    this.$message.success('删除成功')
                }).catch(() => {
                });
            }
        }
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaKnowledgeWindow from '@/components/business/OperaKnowledgeWindow'
import {deleteById, findTreeList} from '@/api/business/knowledge'
export default {
  name: 'Knowledge',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaKnowledgeWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        provinceId: '',
        cityId: '',
        title: ''
      },
      areas: [],
      citys: []
    }
  },
  created () {
    this.config({
      module: '知识库信息表',
      api: '/business/knowledge',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
    this.getCityTree()
  },
  methods: {
    changeProvince (e) {
      this.citys = []
      this.searchForm.cityId=null
      this.areas.forEach(item => {
        if (item.id === this.searchForm.provinceId) {
          this.citys = item.childAreasList || []
        }
      })
      this.search()
    },
    gourl (url) {
      if (url) {
        window.open(url)
      }
    },
    dele (id) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async () => {
        const res = await deleteById(id)
        this.search()
        this.$message.success('删除成功')
      }).catch(() => {
      })
    },
    async getCityTree () {
      this.areas = await findTreeList({})
    }
  }
}
</script>
<style lang="scss" scoped>
company/src/views/business/riskReminder.vue
@@ -3,23 +3,23 @@
        <div class="tx_item">
            <div class="tx_item_head">
                <span>多次出险提醒</span>
                <el-switch active-value="1" inactive-value="0" v-model="form.riskTimesOpen"></el-switch>
                <el-switch :active-value="'1'" :inactive-value="'0'" v-model="form.riskTimesOpen"></el-switch>
            </div>
            <div class="tx_item_content">
                <span>规则设置:同一人一年内报案</span>
                <el-input-number style="margin: 0 15px;" v-model="form.riskTimesReportTimes" :min="0"></el-input-number>
                <el-input-number style="width: 100px; min-width: 100px;margin: 0 15px;"  :disabled="form.riskTimesOpen === '0'"  v-model="form.riskTimesReportTimes" :min="0"></el-input-number>
                <span>次及以上,进行提醒。</span>
            </div>
        </div>
        <div class="tx_item">
            <div class="tx_item_head">
                <span>疑似重复报案提醒</span>
                <el-switch active-value="1" inactive-value="0" v-model="form.riskRepeatReportOpen"></el-switch>
                <el-switch :active-value="'1'" :inactive-value="'0'" v-model="form.riskRepeatReportOpen"></el-switch>
            </div>
            <div class="tx_item_content">
                <span>规则设置:</span>
                <el-input-number style="margin: 0 15px;" v-model="form.riskRepeatReportTime" :min="0"></el-input-number>
                <el-select v-model="form.riskRepeatReportTimeUnit" style="width: 100px; margin-right: 15px;" placeholder="请选择">
                <el-input-number  style="width: 100px; min-width: 100px;margin: 0 15px;" v-model="form.riskRepeatReportTime" :disabled="form.riskRepeatReportOpen === '0'" :min="0"></el-input-number>
                <el-select v-model="form.riskRepeatReportTimeUnit" :disabled="form.riskRepeatReportOpen === '0'"  style="width: 90px; min-width: 90px; margin-right: 15px;" placeholder="请选择">
                    <el-option label="小时" value="1"></el-option>
                    <el-option label="天" value="2"></el-option>
                </el-select>
@@ -29,23 +29,23 @@
        <div class="tx_item">
            <div class="tx_item_head">
                <span>索赔次数过多提醒</span>
                <el-switch active-value="1" inactive-value="0" v-model="form.riskClaimTimesOpen"></el-switch>
                <el-switch :active-value="'1'" :inactive-value="'0'" v-model="form.riskClaimTimesOpen"></el-switch>
            </div>
            <div class="tx_item_content">
                <span>规则设置:同一个保单1年内索赔次数超过</span>
                <el-input-number style="margin: 0 15px;" v-model="form.riskClaimTimes" :min="0"></el-input-number>
                <el-input-number style="width: 100px; min-width: 100px;margin: 0 15px;" v-model="form.riskClaimTimes"  :disabled="form.riskClaimTimesOpen === '0'" :min="0"></el-input-number>
                <span>次,进行提醒。</span>
            </div>
        </div>
        <div class="tx_item">
            <div class="tx_item_head">
                <span>新员工出险提醒</span>
                <el-switch active-value="1" inactive-value="0" v-model="form.riskNewMemberOpen"></el-switch>
                <el-switch :active-value="'1'" :inactive-value="'0'" v-model="form.riskNewMemberOpen"></el-switch>
            </div>
            <div class="tx_item_content">
                <span>规则设置:保单生效的</span>
                <el-input-number style="margin: 0 15px;" v-model="form.riskNewMemberTime" :min="0"></el-input-number>
                <el-select v-model="form.riskNewMemberTimeUnit" style="width: 100px; margin-right: 15px;" placeholder="请选择">
                <el-input-number style="width: 100px; min-width: 100px;margin: 0 15px;" v-model="form.riskNewMemberTime" :disabled="form.riskNewMemberOpen === '0'" :min="0"></el-input-number>
                <el-select v-model="form.riskNewMemberTimeUnit" style="width: 90px; min-width: 90px; margin-right: 15px;"  :disabled="form.riskNewMemberOpen === '0'" placeholder="请选择">
                    <el-option label="小时" value="1"></el-option>
                    <el-option label="天" value="2"></el-option>
                </el-select>
@@ -55,11 +55,12 @@
        <div class="tx_item">
            <div class="tx_item_head">
                <span>敏感词设置</span>
                <el-switch active-value="1" inactive-value="0" v-model="form.riskSensitiveWordsOpen"></el-switch>
                <el-switch :active-value="'1'" :inactive-value="'0'" v-model="form.riskSensitiveWordsOpen"></el-switch>
            </div>
            <div class="tx_item_content">
                <span>规则设置:</span>
                <el-input
                    :disabled="form.riskSensitiveWordsOpen === '0'"
                    type="textarea"
                    :rows="5"
                    placeholder="每个敏感词请用“;”分隔,如骨折;高空;夜间;交通事故;搬运等其他字符"
@@ -74,51 +75,52 @@
</template>
<script>
    import { updRiskConfig, getRiskConfig } from '@/api/business/settleRisk'
    export default {
        name: "riskReminder",
        data() {
            return {
                form: {
                    riskClaimTimes: '0',
                    riskClaimTimesOpen: '0',
                    riskNewMemberOpen: '0',
                    riskNewMemberTime: '0',
                    riskNewMemberTimeUnit: '0',
                    riskRepeatReportOpen: '0',
                    riskRepeatReportTime: '0',
                    riskRepeatReportTimeUnit: '0',
                    riskSensitiveWords: '0',
                    riskSensitiveWordsOpen: '0',
                    riskTimesOpen: '0',
                    riskTimesReportTimes: '0'
                },
                loading: false
            }
        },
        created() {
            this.getRiskConfigs()
        },
        methods: {
            async getRiskConfigs() {
                let res = await getRiskConfig()
                for (const key in this.form) {
                    this.form[key] = res[key]
                }
            },
            submit() {
                this.loading = true
                updRiskConfig(this.form)
                    .then(res => {
                        this.getRiskConfigs()
                        this.$message.success('保存成功')
                    })
                    .finally(() => {
                        this.loading = false
                    })
            }
        }
import { updRiskConfig, getRiskConfig } from '@/api/business/settleRisk'
export default {
  name: 'riskReminder',
  data () {
    return {
      form: {
        riskClaimTimes: '0',
        riskClaimTimesOpen: '0',
        riskNewMemberOpen: '0',
        riskNewMemberTime: '0',
        riskNewMemberTimeUnit: '0',
        riskRepeatReportOpen: '0',
        riskRepeatReportTime: '0',
        riskRepeatReportTimeUnit: '0',
        riskSensitiveWords: '0',
        riskSensitiveWordsOpen: '0',
        riskTimesOpen: '0',
        riskTimesReportTimes: '0'
      },
      loading: false
    }
  },
  created () {
    this.getRiskConfigs()
  },
  methods: {
    async getRiskConfigs () {
      const res = await getRiskConfig()
      for (const key in this.form) {
        this.form[key] = res[key]
      }
      console.log(this.form)
    },
    submit () {
      this.loading = true
      updRiskConfig(this.form)
        .then(res => {
          this.getRiskConfigs()
          this.$message.success('保存成功')
        })
        .finally(() => {
          this.loading = false
        })
    }
  }
}
</script>
<style lang="scss" scoped>
@@ -138,6 +140,7 @@
        }
        .tx_item {
            width: 49%;
            //min-width: 500px;
            padding: 30px 20px;
            box-sizing: border-box;
            background-color: #ffffff;
company/src/views/business/settleClaims.vue
@@ -3,13 +3,13 @@
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="员工姓名" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="请输入" @keypress.enter.native="search"></el-input>
                <el-input v-model="searchForm.memberName" clearable placeholder="请输入" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="身份证" prop="memberIdcardNo">
                <el-input v-model="searchForm.memberIdcardNo" placeholder="请输入" @keypress.enter.native="search"></el-input>
                <el-input v-model="searchForm.memberIdcardNo" clearable placeholder="请输入" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="报案单位" prop="companyId" v-if="userInfo.type === 0">
                <el-select v-model="searchForm.companyId" filterable placeholder="请选择" @change="search">
                <el-select v-model="searchForm.companyId" clearable filterable placeholder="请选择" @change="search">
                    <el-option
                        v-for="item in companyList"
                        :key="item.id"
@@ -19,7 +19,7 @@
                </el-select>
            </el-form-item>
            <el-form-item label="保险方案" prop="baseSolutionId">
                <el-select v-model="searchForm.baseSolutionId" filterable placeholder="请选择" @change="search">
                <el-select v-model="searchForm.baseSolutionId"  clearable filterable placeholder="请选择" @change="search">
                    <el-option
                        v-for="item in solutionList"
                        :key="item.baseId"
@@ -29,7 +29,7 @@
                </el-select>
            </el-form-item>
            <el-form-item label="案件状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="请选择" @change="search">
                <el-select v-model="searchForm.status" clearable placeholder="请选择" @change="search">
                    <el-option label="暂存中" value="0"></el-option>
                    <el-option label="已报案" value="1"></el-option>
                    <el-option label="待立案" value="2"></el-option>
@@ -48,7 +48,7 @@
                </el-select>
            </el-form-item>
            <el-form-item label="派遣单位" prop="duName">
              <el-input v-model="searchForm.duName" placeholder="请输入" @keypress.enter.native="search"></el-input>
              <el-input v-model="searchForm.duName" placeholder="请输入" clearable @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
@@ -79,6 +79,9 @@
                <el-table-column prop="duName" label="派遣单位" min-width="100px"></el-table-column>
                <el-table-column prop="worktypeName" label="所属工种" min-width="100px"></el-table-column>
                <el-table-column prop="baoxianStartTime" label="保险生效起期" min-width="100px"></el-table-column>
                <el-table-column prop="isRisk" label="是否风险案件" min-width="100px">
                  <template slot-scope="{row}"> <span style="color: red" v-if="row.isRisk === 1">风险案件</span></template>
                </el-table-column>
                <el-table-column prop="createDate" label="报案时间" min-width="100px"></el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:settleclaims:update', 'business:settleclaims:delete'])"
log/web/error.2025-05-27.0.log
log/web/info.2025-05-27.0.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
2025-05-27 10:04:22.659 [main] INFO  com.doumee.CompanyApplication - Starting CompanyApplication on DESKTOP-77EHGKJ with PID 31268 (D:\code\idea2023\git\yunyibao\server\company\target\classes started by T14 in D:\code\idea2023\git\yunyibao)
2025-05-27 10:04:22.668 [main] INFO  com.doumee.CompanyApplication - The following profiles are active: dev
2025-05-27 10:04:26.676 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
2025-05-27 10:04:26.683 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-05-27 10:04:27.098 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 355ms. Found 0 Redis repository interfaces.
2025-05-27 10:04:29.000 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroCredentialsMatcher' of type [com.doumee.config.shiro.ShiroCredentialsMatcher] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.066 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'spring.redis-org.springframework.boot.autoconfigure.data.redis.RedisProperties' of type [org.springframework.boot.autoconfigure.data.redis.RedisProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.073 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration' of type [org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.453 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'lettuceClientResources' of type [io.lettuce.core.resource.DefaultClientResources] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.667 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'redisConnectionFactory' of type [org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.802 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'sessionRedisTemplate' of type [org.springframework.data.redis.core.RedisTemplate] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.802 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroCache' of type [com.doumee.config.shiro.ShiroCache] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.805 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroTokenManager' of type [com.doumee.config.shiro.ShiroTokenManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.806 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroSessionDAO' of type [com.doumee.config.shiro.ShiroSessionDAO] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.816 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroCacheManager' of type [com.doumee.config.shiro.ShiroCacheManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.884 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroRealm' of type [com.doumee.config.shiro.ShiroRealm] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:29.886 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroConfig' of type [com.doumee.config.shiro.ShiroConfig$$EnhancerBySpringCGLIB$$49ba0da8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:31.470 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'sessionManager' of type [com.doumee.config.shiro.ShiroSessionManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:31.474 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'shiroCache' of type [com.doumee.config.shiro.ShiroCache] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:31.475 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'securityManager' of type [org.apache.shiro.web.mgt.DefaultWebSecurityManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:31.633 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'authorizationAttributeSourceAdvisor' of type [org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-27 10:04:32.705 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 10031 (http)
2025-05-27 10:04:32.736 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-10031"]
2025-05-27 10:04:32.737 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
2025-05-27 10:04:32.738 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.31]
2025-05-27 10:04:33.139 [main] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2025-05-27 10:04:33.139 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 10281 ms
2025-05-27 10:04:40.541 [main] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
2025-05-27 10:04:58.579 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2025-05-27 10:05:05.599 [main] WARN  s.d.s.r.operation.OperationImplicitParameterReader - Unable to interpret the implicit parameter configuration with dataType: Integer, dataTypeClass: class java.lang.Void
2025-05-27 10:05:07.134 [main] WARN  s.d.s.r.operation.OperationImplicitParameterReader - Unable to interpret the implicit parameter configuration with dataType: Integer, dataTypeClass: class java.lang.Void
2025-05-27 10:05:09.344 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-10031"]
2025-05-27 10:05:09.488 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 10031 (http) with context path ''
2025-05-27 10:05:09.518 [main] INFO  com.doumee.CompanyApplication - Started CompanyApplication in 49.121 seconds (JVM running for 56.066)
2025-05-27 10:06:37.703 [SpringContextShutdownHook] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
2025-05-27 10:06:37.730 [SpringContextShutdownHook] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closing ...
2025-05-27 10:06:37.737 [SpringContextShutdownHook] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
server/service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java
@@ -34,7 +34,6 @@
    @Autowired
    private LabelsMapper labelsMapper;
    @Override
    public Integer create(Labels labels) {
        LoginUserInfo user= (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();