Mr.Shi
2023-08-14 5f5f07db32be63e6112ddff7722c1ada10472da5
Merge branch 'master' of ssh://139.186.142.91:29418/productDev/dmMes
已添加20个文件
已修改73个文件
20393 ■■■■■ 文件已修改
log/eva.log 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/.env.production 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/components/common/CommonHeader.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/components/common/MenuSelect.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/components/system/menu/OperaMenuH5Window.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/components/system/menu/OperaMenuWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/views/business/clientRecord.vue 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/views/system/menuCom.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/views/system/menuH5.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/business/SalaryParamController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/ext/SalaryParamExtController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/ext/WorkorderRecordExtController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/system/SystemController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/biz/system/impl/SystemMenuBizImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroCredentialsMatcher.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroToken.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/core/annotation/excel/ExcelExporter.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/core/utils/Constants.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/core/utils/HttpsUtil.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/SalaryParamMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/dto/AutoWorkReportDTO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/dto/CreateWorkorderRecordDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/model/CompanyUser.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/model/SalaryParam.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/model/Workorder.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/model/WorkorderHistory.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/model/WorkorderRecord.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/vo/SalaryParamVO.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/WorkorderRecordExtMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/QuerySalaryStatisticDTO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/QueryUserSalaryListDTO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/QueryWorkorderExtDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/QueryWorkorderRecordExtDTO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/SalaryParamDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/SalaryParamImportDTO.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/WorkPlansSaveDTO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/WxLoginDTO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/SalaryStatisticsListVO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/UserBaseInfoVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/UserSalaryListVO.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/WorkPlansExtListVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/WorkorderExtListVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/WorkorderListModelVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/WorkorderRecordExtListVO.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/WxLoginVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/system/model/SystemMenu.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/system/model/SystemUser.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/system/vo/SystemMenuListVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/business/SalaryParamService.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/business/impl/SalaryParamServiceImpl.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/business/impl/WorkorderCheckServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/PlansExtService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/WorkorderRecordExtService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/WorkorderRecordStandardService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/PlansExtServiceImpl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkPlansExtServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordExtServiceImpl.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/SystemLoginService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/WxLoginService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/SystemLoginServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/SystemPermissionServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/SalaryParamMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/WorkorderRecordExtMapper.xml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/.env.development 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/.env.staging 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/package-lock.json 17623 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/App.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/assets/js/validate.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/assets/style/lib.css 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/business/OperaCategoryExtWindow.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/business/OperaWorkPlansWindow.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/common/Header.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/common/Menu.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaCompanyUserExtWindow.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaPlansDetailExtWindow.vue 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaProceduresExtWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OrderDistrubution.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/system/OperaSystemRolePowerWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/system/menu/MenuSelect.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/system/role/MenuConfigWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/business/badCategory.vue 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/business/materialCategory.vue 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/business/workPlans.vue 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/plansExt.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/login.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/system/menu.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/vue.config.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/yarn.lock 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log/eva.log
platform_web/.env.production
@@ -20,11 +20,4 @@
# VUE_APP_BASE_URL = 'http://121.41.112.139:10012/'
#正式环境
#VUE_APP_BASE_URL = 'http://127.0.0.1:10012/'
#艾丽格斯 https://hsky.doumee.com/doumeeplant_api/doc.html
# VUE_APP_BASE_URL = 'https://hsky.doumee.com/doumeeplant_api/'
# https://dmtest.ahapp.net/doumeeplant_api/doc.html
# VUE_APP_BASE_URL = 'https://dmtest.ahapp.net/doumeeplant_api/'
VUE_APP_BASE_URL = 'https://www.mes.red/doumeeplant/'
# VUE_APP_BASE_URL = 'http://192.168.0.18:10021/'
platform_web/src/components/common/CommonHeader.vue
@@ -2,7 +2,7 @@
  <div class="common-header">
    <div class="header">
      <div class="logo">
        <div>工厂平台端</div>
        <div>DM云工厂平台端</div>
        <!-- <div class="title-en">Diagnosis of Intelligent Manufacturing Integrated Service Platfrom</div> -->
      </div>
      <div class="user">
platform_web/src/components/common/MenuSelect.vue
@@ -48,6 +48,8 @@
      this.fetchData()
    },
    type () {
      console.log(type);
      debugger
      this.fetchData()
    }
  },
platform_web/src/components/system/menu/OperaMenuH5Window.vue
@@ -6,7 +6,7 @@
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <p class="tip" v-if="form.parent != null && form.id == null">为 <em>{{parentName}}</em> æ–°å»ºå­èœå•</p>
    <p class="tip" v-if="form.parentId != null && form.id == null">为 <em>{{parentName}}</em> æ–°å»ºå­èœå•</p>
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="上级菜单" prop="parentId">
        <MenuSelect v-if="visible" v-model="form.parentId" placeholder="请选择上级菜单" type="2" :exclude-id="excludeMenuId" clearable :inline="false"/>
@@ -20,7 +20,7 @@
      <el-form-item label="图标" prop="icon" class="form-item-icon">
        <div style="display: flex;">
          <UploadAvatarImage
            :file="{ 'imgurlfull': form.icon, 'imgurl': form.icon }"
            :file="{ 'imgurlfull': form.fullIcon, 'imgurl': form.icon }"
            :uploadData="uploadData"
            customStyle="width: 80px; height: 80px;"
            tipsLabel="上传图标"
@@ -61,6 +61,7 @@
      uploadData: {
        floader: 'company/menu'
      },
      parent: {},
      // è¡¨å•数据
      form: {
        id: null,
@@ -68,6 +69,7 @@
        name: '',
        path: '',
        icon: '',
        fullIcon: '',
        remark: '',
        type: '2'
      },
@@ -79,6 +81,12 @@
      }
    }
  },
  created () {
    this.config({
      api: '/system/menu'
    })
  },
  methods: {
    /**
     * @title: çª—口标题
@@ -86,18 +94,21 @@
     * @parent: æ–°å»ºæ—¶çš„上级菜单
     * @type: 0平台 1、企业 2、h5
     */
    open (title, target, parent, type) {
    open (title, target, parent) {
      debugger
      this.title = title
      console.log('-----',parent);
      this.visible = true
      // æ–°å»ºï¼Œmenu为空时表示新建菜单
      if (target == null) {
        this.excludeMenuId = null
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.parent = parent
          this.form.id = null
          this.form.parentId = parent == null ? null : parent.id
          this.parentName = parent == null ? null : parent.name
          this.form.type = type
        })
        return
      }
@@ -107,20 +118,14 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.form.fullIcon = !!target.icon ? (target.resourcePath + target.icon) : ''
      })
    }
  },
  created () {
    this.config({
      api: '/system/menu'
    })
  },
  methods: {
    },
    uploadReverseSuccess(file) {
      // this.form. = file.imgurl;
      this.form.icon = file.imgurlfull;
      this.form.icon = file.imgurl;
      this.form.fullIcon = file.imgurlfull;
    }
  }
  },
}
</script>
platform_web/src/components/system/menu/OperaMenuWindow.vue
@@ -73,7 +73,6 @@
     * @type: 0平台 1、企业 2、h5
     */
    open (title, target, parent, type) {
      debugger
      this.title = title
      this.visible = true
      // æ–°å»ºï¼Œmenu为空时表示新建菜单
@@ -81,10 +80,10 @@
        this.excludeMenuId = null
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form.type = type
          this.form.id = null
          this.form.parentId = parent == null ? null : parent.id
          this.parentName = parent == null ? null : parent.name
          this.form.type = type
        })
        return
      }
@@ -94,6 +93,7 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.form.type = type
      })
    }
  },
platform_web/src/views/business/clientRecord.vue
@@ -97,162 +97,6 @@
}
/**
 *  
    è¿™ä¸€æ¬¡å¤åŸå´©å¼€å¯èƒ½å°±æ˜¯ä¸Žé’铜仙殿有关,是它散发的气机加剧了此地高地的龟裂,而后全面塌沉,出现天坑。
    ä¸Žé’铜仙殿相比,三位古圣的身高若蚁虫般,主要是这座铜殿太大了且在散发无穷仙光。
    æ˜¾ç„¶ï¼Œä»–们发现了叶凡几人,霍坦的的一双瞳孔像是黑日般,漆黑而深不可测发出一缕缕乌光,扫视了过来,有一种高高在上,俯视蝼蚁般的气势。
    å¯æƒœï¼Œä»–无法脱困没有办法冲过来,更不能出手。
    å¶å‡¡ã€æ®µå¾·ã€é»‘皇等人都无惧,三人自身难保被定在了那里,能否活下去都两说。
    â€œæ¯æ°”……这么多?!”龙马四蹄发出光火,远远的绕着铜殿每行,一副精力过利的样子。
    å¶çž³ä¹Ÿå¼ å¤§äº†å˜´å·´ï¼Œé›³å‡ºä¸å¯æ€è®®çš„神色,道:“师博这就是你鼎的来源处?”
    â€œç‹ äººåœŒå¤§å¸äº†ä¸å¾—,这是要做什么,挖开了一个混沌仙地,这是要打造最强仙兵吗这么多母气铸鼎,反复提炼,一击之下谁能挡住?”大黑狗也震撼。
    åœ¨é’铜仙殿外部万物母气缭绕,成片成山成海,一层又一层,若星域般沉重压的人将停止呼吸,有无量的道痕在交织。
    ä»»ä½•一缕母气都可以压塌一座山脊这么多凝聚在一起,这得多么沉重?古之大帝以它铸成兵器,是想一击圌打碎其他帝兵吗?
    å¯»å¸¸äººè‹¥èƒ½å¯»åˆ°ä¸€ç¼•母气就是大机缘了,而今这么多,跟云层一般密布,笼苹此地,古朴大气,巍峨磅旖,是一种奇迹。
    â€œèµ·ï¼â€
    å¶å‡¡å¤§å–äº†ä¸€å£°ï¼Œé¢éª¨å†…一个金色的小人睁开了眼睛,长身而起,一步迈出,以道痕为战衣,以鼎为兵器。
    ä¸‡è½´æ¯æ°”鼎悬在其头乒,金色小人张口一声清啸,小鼎快速放大,向前飞去,开始鲸吸牛饮,吞收那海量的母气!
    â€œä½ æ•¢â€¦â€¦â€éœå¦å¤§æ€’,终是变了颜色,难以不语,无法镇定。
    è¿™ä¹ˆå¤šä¸‡ç‰©æ¯æ°”,即便失去了源根,也是举世难寻的神料,若是到手,简直是逆天的造化。
    ä»€ä¹ˆä¸œè¥¿æœ€çè´µï¼Œè‡ªç„¶æ˜¯å¤ä¹‹å¤§å¸çš„兵器,而这些的母气集是人族大帝准备用来炼兵的,价值没有办法衡量。
    å¦å¤–两位古圣变色,有心无力,真身都难保了,还怎么去阻挡?
    â€œäººæ—çš„圣体,你杀我部众,夺我造化,此是大仇,我若脱困,杀以百次,即便是斗战胜佛也无话可说。”霍坦幽森的开口。
    â€œç­‰ä½ è„±å›°æ—¶å†è®¡è¾ƒå§ï¼ŒçŽ°åœ¨æˆ‘æ²¡ç©ºæ­ç†ä½ ï¼Œç»™æˆ‘æ‰¾ä¸ªåœ°æ–¹è‡ªå·²æ¸…å‡€åŽ»ã€‚â€å¶å‡¡æ¼«ä¸ç»å¿ƒçš„è¯´é“ã€‚
    æ­¤æ—¶ï¼Œä»–心情大好,以鼎吞收海量母气,纳于鼎婺,熔圌炼于一体。
    å…µå­—诀原状,他的鼎沉沉浮浮,俚掰作响,母气如万流归海,压的虚空扭曲、崩塌,与鼎合一,不分彼此。
    ä¸‡ç‰©æ¯æ°”源从此合一,狠人的帝兵材料,万圌古罕见,霍坦眼红与怒吼,自然是再正常不过的事情了!
    é¼Žï¼Œä¸ºæ¯æ°”精粹,此时与海量母气合一,水乳圌交融,散发出一种生命波动,像是将要诞生神灵志了。
    â€œä½ åˆå‘½æ”¶èµ°ï¼Œæ— å‘½ä½¿ç”¨ã€‚”霍坦冷森森的笑,他充满了不敢,杀机毕雳,是不加掩饰的。
    è‹¥æ˜¯èƒ½è¡ŒåŠ¨ï¼Œä»–è‚¯å®šä¼šåœ¨ç¬¬ä¸€æ—¶é—´å‡ºæ‰‹ï¼Œå°†å¶å‡¡ç¢¾åŽ‹æˆé£žç°ï¼Œæ— æ¯”çš„é—æ†¾ã€‚
    â€œä½ æ²¡æœ‰è¿™ä¸ªæœºä¼šï¼Œå³ä¾¿ä½ æˆä¸ºäº†åœ£çº§äººç‰©ï¼Œä½†ä¹Ÿä¸è§å¾—不会殒落,还是当心你自已吧。”叶凡笑道。
    ä»–并根本不计较,有什么比证道之器完美更人激动,他的鼎海纳百川,将所有母气都给汲取了,道痕交织。
    â€œäºŒåä¸‰ï¼Œä½ å˜´å·´æœ€å¥½è€å®žç‚¹ï¼Œä¸ç„¶æœ¬åº§èµä½ ä¸€ä¸ªé”…贴,再让你来个驴打滚。”龙马满口浑话。
    å®ƒè¾¹è¯´è¾¹æŠ¬èµ·äº†è¹„子,准备一蹶子尥过去,落圌井圌下圌石,将霍坦饮恨,死在青铜仙殿中。
    â€œåˆ«ï¼â€æ®µå¾·èµ¶ç´§é˜»æ­¢ï¼Œè®©å®ƒä¸è¦è½»ä¸¾å¦„动。
    é‚£é’铜殿,一仙光亿万缕,将祖王都要吞没了,他们若是贸然出手,也被吞过去就麻烦大了。
    â€œè¿™ç§å¹³è¡¡ä¸å¯æ‰“破,他们若是命大就闯出来,命小就等着殒落吧。”黑皇也道。
    å¶å‡¡å®Œå·¥ï¼Œé¼Žä¸€ä¸‹å­ä¹Ÿä¸çŸ¥é‡äº†å¤šå°‘倍,好在早已被炼化,其重不被他承受,现在砸出去,不动用法圌力,估计一般的敌手就得直接成为齑粉。
    â€œå°å­ï¼Œè¿™ä¹ˆå®è´µçš„东西落入了你的手中,你得拿东西补偿我们,不然就平分,换作他人,本皇早就抢了!”大黑狗叫嚣。
    â€œå‡»æ¯™å¤©çš‡å­ï¼Œä»Žä»–身圌体圌内扒拉出的好东西不少,怎么不见你上缴?”叶凡揭他老底。
    â€œæ— é‡å¤©å°Šï¼Œæ—¢ç„¶è¿™æ˜¯ä½ çš„证道物,贫道也有成圌人之美,到时候将从不死天皇行宫中弄来的悟道茶等多分我一份就行了。”
    â€œè¿˜æœ‰æˆ‘的……”龙马也叫道。
    ä¸‰ä¸ªæžå“ä¸€èµ·å«åš·ã€‚叶瞳很本分,不可能去瓜分师傅的宝贝。
    ä¸è¿œå¤„,三位古圣生闷气,眼睁睁的看着几个小辈收走了古之大帝的专属仙料,而今还放肆的在此议论分赃,实在让他们大恨。
    å°¤å…¶æ˜¯éœå¦ï¼Œè‚ºéƒ½è¦æ°”炸了,因为那头龙马一口一个二十三,听那口吻肯定不是什么好话,斜着眼睛看他,根本就没有将他当成一位圣圌人。
    â€œå’¦â€¦â€¦â€æ®µå¾·è¹™çœ‰ï¼Œåƒæ˜¯è§‰å¯Ÿåˆ°äº†ä»€ä¹ˆã€‚
    å°”好,有圣圌人来了,本皇布下阵纹有反应,我心惊肉跳。”黑皇变色。
    è€Œä»Šï¼Œä¸ä¸ºåœ£åœŒäººï¼Œç¼ºå°‘安身立命的资本,他们自然谨慎小心,在进来前布下了各种阵纹,只要圣圌人降临,就会预弊。
    é»‘皇二话没说,取出棋盘阵台,打开虚空,直接没入了进去,快速从这个地方消失。
    â€œçœŸå¯æƒœï¼Œé’铜仙殿下可是有一个混沌仙地,里面多半有神珍。”段德很遗憾。
    â€œå¤ªå¯æƒœäº†ï¼â€é¾™é©¬æ›´æ˜¯åå§ä¸å®‰ï¼Œä½†æ²¡æœ‰åŠžæ³•ï¼Œåœ£åœŒäººæ¥äº†ï¼Œä»–ä»¬åªèƒ½é€€ã€‚
    â€œä¸‡ç‰©æ¯æ°”暂且寄存你们手中,项上人头也先留着,我会去收取的!”霍坦阴森森的说道。
    â€œäºŒåä¸‰ï¼Œå®‰å¿ƒçš„等死吧。”龙马直接一句话差点噎死他。
    â€œåˆ·â€
    å…‰åŽä¸€é—ªï¼Œä»–们消失在了地圌下世界。
    è¿œå¤„,神秘波动扩散,域门打开,一个满头赤发的女子走出,肌体修圌长矫健,是一名强大的古族。
    â€œè¡€ç”µå¥³çŽ‹æ¥äº†ï¼â€
    ä¸å°‘人惊呼,这是一个圣圌人王,曾在瑶池大圌会出现过,曾与姜神王对决,今日竟然亲身降临,事情越来越大,这等人物也都坐不住了。
    å¥¹æ²¡æœ‰è½»ä¸¾å¦„动,绕着深渊走了很长时间,才一步迈下去,当来到青铜仙殿远处时,见到了三位古圣被困。
    â€œè½°ï¼â€
    åŠåˆ»é’ŸåŽä¸€å£°å·¨å“ï¼Œè¡€ç”µå¥³çŽ‹å†²äº†ä¸Šæ¥ï¼Œèº«ä¸Šæœ‰æ–‘æ–‘è¡€è¿¹ï¼Œèº«åœŒå­å·®ç‚¹ç‚¸å¼€ï¼Œè€Œåœ¨å©·çš„èº«åŽï¼Œå¦æœ‰ä¸‰é“åœŒäººå½±ï¼Œåæ˜¯å‡„æƒ¨åˆ°äº†æžç‚¹ï¼Œå…ƒç¥žä¹‹ç«å·®ä¸€ç‚¹ç†„ç­ï¼Œèº«åœŒå­ç ´çƒ‚çš„ä¸æˆæ ·å­ã€‚
    å•Šâ€¦â€¦â€
    ä»–们冲上来后,全都大叫,充满了愤怒,地圌下有仙珍,却不可夺得,一座仙殿就足以镇死有人!
    å°¤å…¶æ˜¯éœå¦ï¼Œå€æ„Ÿæ†‹å±ˆï¼Œè¢«å¶å‡¡ä¸Žé¾™é©¬å¥šè½ï¼Œçœ¼çççš„看着万物母气鼎被洗劫走,那种不敢与愤懑难以言表。
    â€œäººæ—åœ£ä½“,我必杀你,神复牛也救不了你!”霍坦大吼。
    è½°éš†å…­å£°ï¼ŒéŸ³æ´«ä¼¼å¤©é›·ï¼Œå¤§åŸé™„近很多修士身圌体龟裂,修为稍差的人直接崩开,化成了血雾,圣贤一怒,伏尸无数,并非字话。
    â€œå£æ°”不小,就是不知道,若有一日真有神明降临,你会如何自处?”一个苍老的声音传来。
    æ— å£°æ— æ¯ï¼Œå¤©ç’‡åœ£åœ°çŸ³åŠçš„老圣圌人卫易出现,古井无波,站在那里,如一段枯木。
    è¡€ç”µå¥³çŽ‹å¦‚ä¸´å¤§æ•Œï¼Œç¥žè‰²å˜äº†ï¼Œäººæ—åœ£åœŒäººå“ªä¸€ä¸ªæ˜¯å‡¡ä¿—ï¼Œå½“å¹´åœ¨ç‘¶æ± å¤§åœŒä¼šä¸€ä¸ªç™½è¡£ç¥žçŽ‹æ€å¤æ—è¯¸åœ£è¡€æº…å¡ç©ºï¼Œæ­»äº†ä¸€æ‰¹åˆä¸€æ‰¹ï¼Œå…ƒæ°”å¤§ä¼¤ã€‚
    è¿™ä¸ªè€åœ£åœŒäººï¼Œè¿žå¥¹éƒ½ä¸èƒ½åº¦æ·±æµ…,心中突突直跳,不敢妄动。
    å«æ˜“站在这里,默默推演了一番,而后蹙起了眉头,一语不发,身影模糊,凭空消失了。
    åŒæ—¶ï¼Œå«æ˜“消失的刹那,将高地诸多修士都给带走了,传圌送入到远空。
    â€œè½°â€
    çªç„¶ï¼Œé’铜仙殿,瞬间万丈,一下子冲上了天坑,仙光无数,像是一轮太阳般发光,内部一个血圌淋圌淋的“仙”,化成一道光,映在虚空中,横断古今。
    è¡€ç”µå¥³çŽ‹ã€éœå¦å‡ äººé£žå¿«å€’é€€ï¼Œéª¨èŠ‚ä½œå“ï¼Œå·®ä¸€ç‚¹åœ¨è¿™ä¸ªåœ°æ–¹ç‚¸å¼€ï¼Œæµ‘èº«éƒ½æ˜¯è¡€ï¼Œå‡ ä¹Žè¢«æ´»æ´»é•‡æ­»ã€‚
    å¥½ä¸€ä¸ªä»™æ®¿ï¼Œæžœç„¶éžå‡¡ï¼ŒçœŸæ˜¯éš¾ä»¥æƒ³è±¡ï¼Œç©¶ç«Ÿæ˜¯è°åœ¨å…¶å†…部击出一个大洞,生生打了出来。”一个苍老的声音说道,浑拓大圣显化,出现在天边。
    åœ¨å…¶èº«åŽï¼Œæœ‰æ•°ä½å¤åœ£ç›¸éšï¼Œä¸Žå…¶å…±è¿›é€€ï¼Œæ˜¾ç„¶å¯¹å¤§åŸå†…的神珍势在必得。
    å¦ä¸€è¾¹ï¼Œäººæ—å‰å‡ºçŽ°ä¸€é“èº«å½±ï¼Œç™½è¡£çŒŽçŒŽï¼Œæ­£æ˜¯ç¥žçŽ‹å§œå¤ªè™šï¼Œä»–ä¹ŸçŽ°å‡ºäº†è¸ªè¿¹ã€‚
    ç¥žçŽ‹ä¸€å‡ºçŽ°ï¼ŒçŽ°åœºé¡¿æ—¶ä¸€é˜µå¤§ä¹±ï¼Œè¯¸å¤šå¤æ—é¢¤åœŒæŠ–ï¼Œè¿žä¸€äº›ç¥–çŽ‹éƒ½æ˜¯æµ‘èº«å‘å‡‰ï¼Œç‘¶æ± å¤§åœŒä¼šï¼Œç»ä»£ç¥žçŽ‹ä¸€äººæ€çš„ä»–ä»¬å¿ƒèƒ†éƒ½å¯’äº†ã€‚
    â€œå˜¿ï¼Œè¿™åº§é“œæ®¿ä¸Žä»™æœ‰å…³ï¼Œä¸è‹¥æˆ‘等一起将打开如何,看一看到底有什么。”有一道身影降临,很是古老,不少人圌大惊,是万龙巢的大圣到了。
    ä¸€åº§å¸åŸå¼•发了一场滔天大乱,诸多古王,还有几位大圣也坐不住了,想要开启,获取成仙的秘密。
    â€œäººæ—å¤§å¸çš„坟,外人难动……”姜太虚自语。
 */
</script>
  
platform_web/src/views/system/menuCom.vue
@@ -50,8 +50,8 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text"  @click="$refs.operaMenuWindow.open('编辑菜单', row)" v-permissions="['system:menu:update']">编辑</el-button>
            <el-button type="text" icon="el-icon-plus" @click="$refs.operaMenuWindow.open('新建子菜单', null, row)" v-permissions="['system:menu:create']">新建子菜单</el-button>
            <el-button type="text"  @click="$refs.operaMenuWindow.open('编辑菜单', row, null, 1)" v-permissions="['system:menu:update']">编辑</el-button>
            <el-button type="text" icon="el-icon-plus" @click="$refs.operaMenuWindow.open('新建子菜单', null, row, 1)" v-permissions="['system:menu:create']">新建子菜单</el-button>
            <el-button v-if="!row.fixed" type="text" style="color: red" @click="deleteById(row)" v-permissions="['system:menu:delete']">删除</el-button>
          </template>
        </el-table-column>
platform_web/src/views/system/menuH5.vue
@@ -3,7 +3,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['system:menu:create', 'system:menu:delete', 'system:menu:sort']">
        <li><el-button type="primary" @click="$refs.operaMenuWindow.open('新建一级菜单', null, null, 2)" icon="el-icon-plus" v-permissions="['system:menu:create']">新建</el-button></li>
        <li><el-button type="primary" @click="$refs.operaMenuWindow.open('新建一级菜单', null, null)" icon="el-icon-plus" v-permissions="['system:menu:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" v-permissions="['system:menu:delete']">删除</el-button></li>
        <li><el-button @click="sort('top')" :loading="isWorking.sort" icon="el-icon-sort-up" v-permissions="['system:menu:sort']">上移</el-button></li>
        <li><el-button @click="sort('bottom')" :loading="isWorking.sort" icon="el-icon-sort-down" v-permissions="['system:menu:sort']">下移</el-button></li>
@@ -50,8 +50,8 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text"  @click="$refs.operaMenuWindow.open('编辑菜单', row)" v-permissions="['system:menu:update']">编辑</el-button>
            <el-button type="text" icon="el-icon-plus" @click="$refs.operaMenuWindow.open('新建子菜单', null, row)" v-permissions="['system:menu:create']">新建子菜单</el-button>
            <el-button type="text" @click="$refs.operaMenuWindow.open('编辑菜单', row)" v-permissions="['system:menu:update']">编辑</el-button>
            <el-button type="text" @click="$refs.operaMenuWindow.open('新建子菜单', null, row)" v-permissions="['system:menu:create']">新建子菜单</el-button>
            <el-button v-if="!row.fixed" type="text" style="color: red" @click="deleteById(row)" v-permissions="['system:menu:delete']">删除</el-button>
          </template>
        </el-table-column>
server/src/main/java/doumeemes/api/business/SalaryParamController.java
@@ -7,10 +7,12 @@
import doumeemes.core.model.PageWrap;
import doumeemes.core.model.PageData;
import doumeemes.dao.business.model.SalaryParam;
import doumeemes.dao.business.vo.SalaryParamVO;
import doumeemes.dao.ext.dto.SalaryParamDTO;
import doumeemes.service.business.SalaryParamService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@@ -33,7 +35,7 @@
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:salaryparam:create")
//    @RequiresPermissions("business:salaryparam:create")
    public ApiResponse create(@RequestBody SalaryParam salaryParam) {
        return ApiResponse.success(salaryParamService.create(salaryParam));
    }
@@ -69,16 +71,16 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:salaryparam:query")
    public ApiResponse<PageData<SalaryParam>> findPage (@RequestBody PageWrap<SalaryParam> pageWrap) {
//    @RequiresPermissions("business:salaryparam:query")
    public ApiResponse<PageData<SalaryParamVO>> findPage (@RequestBody PageWrap<SalaryParamDTO> pageWrap) {
        return ApiResponse.success(salaryParamService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:salaryparam:exportExcel")
    public void exportExcel (@RequestBody PageWrap<SalaryParam> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(SalaryParam.class).export(salaryParamService.findPage(pageWrap).getRecords(), "设置类-绩效工资配置表", response);
    public void exportExcel (@RequestBody PageWrap<SalaryParamDTO> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(SalaryParamVO.class).export(salaryParamService.findPage(pageWrap).getRecords(), "设置类-绩效工资配置表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/doumeemes/api/ext/SalaryParamExtController.java
@@ -7,15 +7,24 @@
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.business.model.SalaryParam;
import doumeemes.dao.business.vo.SalaryParamVO;
import doumeemes.dao.ext.dto.SalaryParamDTO;
import doumeemes.service.business.SalaryParamService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
@@ -33,7 +42,7 @@
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:salaryparam:create")
//    @RequiresPermissions("business:salaryparam:create")
    public ApiResponse create(@RequestBody SalaryParam salaryParam) {
        return ApiResponse.success(salaryParamService.create(salaryParam));
    }
@@ -70,15 +79,15 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:salaryparam:query")
    public ApiResponse<PageData<SalaryParam>> findPage (@RequestBody PageWrap<SalaryParam> pageWrap) {
    public ApiResponse<PageData<SalaryParamVO>> findPage (@RequestBody PageWrap<SalaryParamDTO> pageWrap) {
        return ApiResponse.success(salaryParamService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:salaryparam:exportExcel")
    public void exportExcel (@RequestBody PageWrap<SalaryParam> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(SalaryParam.class).export(salaryParamService.findPage(pageWrap).getRecords(), "设置类-绩效工资配置表", response);
    public void exportExcel (@RequestBody PageWrap<SalaryParamDTO> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(SalaryParamVO.class).export(salaryParamService.findPage(pageWrap).getRecords(), "设置类-绩效工资配置表", response);
    }
    @ApiOperation("根据ID查询")
@@ -87,4 +96,24 @@
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(salaryParamService.findById(id));
    }
    @ApiOperation(value = "批量导入计划", notes = "批量导入计划", httpMethod = "POST", position = 6)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "folder", value = "文件夹", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
    })
    @PostMapping(value = "/importBatch", headers = "content-type=multipart/form-data")
    @RequiresPermissions("business:salaryparam:create")
    public ApiResponse importBatch(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
        CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
        if (multipartResovler.isMultipart(request)) {
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            Iterator<String> it = multipartRequest.getFileNames();
            while (it.hasNext()) {
                MultipartFile file = multipartRequest.getFile((String) it.next());
                salaryParamService.importPlans(file);
                break;
            }
        }
        return ApiResponse.success( null);
    }
}
server/src/main/java/doumeemes/api/ext/WorkorderRecordExtController.java
@@ -14,10 +14,10 @@
import doumeemes.dao.business.model.WorkorderRecord;
import doumeemes.dao.ext.bean.EndCheckApBean;
import doumeemes.dao.ext.beanDto.QueryWStockDto;
import doumeemes.dao.ext.dto.QuerySalaryStatisticDTO;
import doumeemes.dao.ext.dto.QueryUserSalaryListDTO;
import doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO;
import doumeemes.dao.ext.vo.WStockExtListForWorkorderVO;
import doumeemes.dao.ext.vo.WStockExtListVO;
import doumeemes.dao.ext.vo.WorkorderRecordExtListVO;
import doumeemes.dao.ext.vo.*;
import doumeemes.service.business.WorkorderRecordService;
import doumeemes.service.ext.WorkorderExtService;
import doumeemes.service.ext.WorkorderRecordExtService;
@@ -140,6 +140,18 @@
    public ApiResponse<PageData<WorkorderRecordExtListVO>> findPage (@RequestBody PageWrap<QueryWorkorderRecordExtDTO> pageWrap) {
        return ApiResponse.success(workorderRecordExtService.findPage(pageWrap));
    }
    @ApiOperation("员工绩效分页查询")
    @PostMapping("/userSalary")
    @RequiresPermissions("ext:workorderrecordext:query")
    public ApiResponse<PageData<UserSalaryListVO>> userSalaryPage (@RequestBody PageWrap<QueryUserSalaryListDTO> pageWrap) {
        return ApiResponse.success(workorderRecordExtService.userSalaryPage(pageWrap));
    }
    @ApiOperation("工资报表统计分页查询")
    @PostMapping("/salaryStatistic")
    @RequiresPermissions("ext:workorderrecordext:query")
    public ApiResponse<PageData<SalaryStatisticsListVO>> salaryStatistic (@RequestBody PageWrap<QuerySalaryStatisticDTO> pageWrap) {
        return ApiResponse.success(workorderRecordExtService.salaryStatistic(pageWrap));
    }
    @ApiOperation("查询全部")
    @PostMapping("/all")
@@ -163,6 +175,16 @@
    public void exportExcel (@RequestBody PageWrap<QueryWorkorderRecordExtDTO> pageWrap, HttpServletResponse response) {
        workorderRecordExtService.exportExcel(pageWrap,response);
    }
    @ApiOperation("导出员工绩效明细")
    @PostMapping("/exportUserSalary")
    public void exportUserSalary (@RequestBody PageWrap<QueryUserSalaryListDTO> pageWrap, HttpServletResponse response) {
        workorderRecordExtService.exportUserSalary(pageWrap,response);
    }
    @ApiOperation("导出工资报表")
    @PostMapping("/exportSalaryStatistics")
    public void exportSalaryStatistics (@RequestBody PageWrap<QuerySalaryStatisticDTO> pageWrap, HttpServletResponse response) {
        workorderRecordExtService.exportSalaryStatistics(pageWrap,response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
server/src/main/java/doumeemes/api/system/SystemController.java
@@ -8,9 +8,12 @@
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.utils.Constants;
import doumeemes.dao.business.dto.CompanyInitDataDTO;
import doumeemes.dao.ext.dto.WxLoginDTO;
import doumeemes.dao.ext.vo.WxLoginVO;
import doumeemes.dao.system.dto.LoginDTO;
import doumeemes.dao.system.dto.UpdatePwdDto;
import doumeemes.service.system.SystemLoginService;
import doumeemes.service.system.WxLoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -46,22 +49,38 @@
    @Autowired
    private SystemLoginService systemLoginService;
    @Autowired
    private WxLoginService wxLoginService;
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("登录")
    @PostMapping("/login")
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
//        dto.setCompanyId(Constants.de);
        return ApiResponse.success(systemLoginService.loginByPassword(dto, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("平台登录")
    @PostMapping("/platform/login")
    public ApiResponse<String> platformLogin (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
//        dto.setCompanyId(Constants.de);
        return ApiResponse.success(systemLoginService.platformLogin(dto, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("微信登录")
    @GetMapping("/wxLogin")
    public ApiResponse<WxLoginVO> wxLogin (@RequestParam String code, HttpServletRequest request) {
        return ApiResponse.success(wxLoginService.wxLogin(code, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("微信登录账号密码")
    @PostMapping("/wxAccountLogin")
    public ApiResponse<String> wxAccountLogin (@Validated @RequestBody WxLoginDTO dto, HttpServletRequest request) {
        return ApiResponse.success(wxLoginService.wxLoginByPassword(dto, request));
    }
    @ApiOperation("退出登录")
    @PostMapping("/logout")
    public ApiResponse logout () {
server/src/main/java/doumeemes/biz/system/impl/SystemMenuBizImpl.java
@@ -114,6 +114,7 @@
        for (SystemMenu menu : menus) {
            if(Constants.equalsInteger(menu.getType(),Constants.PlatType.companyH5) && StringUtils.isNotBlank(menu.getIcon())){
                menu.setIcon(rPath+menu.getIcon());
                menu.setResourcePath(rPath);
            }
            if (menu.getParentId() == null) {
                SystemMenuListVO rootMenu = new SystemMenuListVO();
@@ -126,6 +127,7 @@
        for (SystemMenuListVO child : rootMenus) {
            if(Constants.equalsInteger(child.getType(),Constants.PlatType.companyH5) && StringUtils.isNotBlank(child.getIcon())){
                child.setIcon(rPath+child.getIcon());
                child.setResourcePath(rPath);
            }
            this.fillChildren(child, menus);
        }
server/src/main/java/doumeemes/config/shiro/ShiroConfig.java
@@ -71,6 +71,8 @@
        Map<String, String> map = new LinkedHashMap<>();
        // è·¯å¾„拦截配置
        map.put("/system/login", "anon");
        map.put("/system/wxLogin", "anon");
        map.put("/system/wxAccountLogin", "anon");
        map.put("/system/initCompany", "anon");
        map.put("/system/logout", "anon");
        map.put("/common/captcha", "anon");
server/src/main/java/doumeemes/config/shiro/ShiroCredentialsMatcher.java
@@ -35,6 +35,9 @@
        if(usernamePasswordToken.getDdLogin()){
            return Boolean.TRUE;
        }
        if(usernamePasswordToken.getWxLogin()){
            return Boolean.TRUE;
        }
        // åŠ å¯†å¯†ç 
        String pwd = Utils.Secure.encryptPassword(new String(usernamePasswordToken.getPassword()), systemUser.getSalt());
        // æ¯”较密码
server/src/main/java/doumeemes/config/shiro/ShiroToken.java
@@ -36,13 +36,15 @@
     */
    Integer companyId;
    Boolean isDdLogin;
    Boolean isWxLogin;
    public ShiroToken() {
    }
    public  ShiroToken(Integer companyId,String username, String password,boolean isDdLogin) {
    public  ShiroToken(Integer companyId,String username, String password,boolean isDdLogin,boolean isWxLogin) {
        super(username,  password, false, (String)null);
        this.companyId = companyId;
        this.isDdLogin = isDdLogin;
        this.isWxLogin = isWxLogin;
    }
    public Boolean getDdLogin() {
@@ -53,6 +55,15 @@
        isDdLogin = ddLogin;
    }
    public Boolean getWxLogin() {
        return isWxLogin;
    }
    public void setWxLogin(Boolean wxLogin) {
        isWxLogin = wxLogin;
    }
    public Integer getCompanyId() {
        return companyId;
    }
server/src/main/java/doumeemes/core/annotation/excel/ExcelExporter.java
@@ -2,6 +2,8 @@
import doumeemes.core.constants.ResponseStatus;
import doumeemes.core.exception.BusinessException;
import doumeemes.dao.ext.vo.UserBaseInfoVO;
import doumeemes.dao.ext.vo.UserSalaryListVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.commons.lang3.BooleanUtils;
@@ -170,6 +172,10 @@
        return new ArrayList<>(sortedFields.values());
    }
    public static void main(String[] args) {
        ExcelExporter m = new ExcelExporter();
        ExcelExporter.build(UserSalaryListVO.class).getColumns();
    }
    /**
     * é…ç½®æ•°æ®å•元格
     */
server/src/main/java/doumeemes/core/utils/Constants.java
@@ -27,6 +27,11 @@
    public static final String ACCESS_ID="ACCESS_ID";
    public static final String BUCKETNAME = "BUCKETNAME";
    public static final String OSS = "OSS";
    public static final String WX_CONFIG = "WX_CONFIG";
    public static final String APPID = "APPID";
    public static final String APPSECRET = "APPSECRET";
    public static final String WX_TOKEN = "WX_TOKEN";
    public static final String ACCESS_KEY = "ACCESS_KEY";
    public static final String ENDPOINT = "ENDPOINT";
    public static final String RESOURCE_PATH = "RESOURCE_PATH";
@@ -265,6 +270,7 @@
       public static final  int baogong= 4;
       public static final  int instock = 5;
       public static final  int cancel = 6;
       public static final  int producing = 7;
        static String getTitleByStatus(WorkorderExtListVO p, int status) {
            String title = "";
            switch (status){
@@ -288,6 +294,9 @@
                    break;
                case cancel:
                    title="工单取消";
                    break;
                case producing:
                    title="工单生产中";
                    break;
                default:
                    break;
@@ -317,6 +326,9 @@
                    break;
                case cancel:
                    title="工单取消";
                    break;
                case producing:
                    title="工单生产中";
                    break;
                default:
                    break;
@@ -378,7 +390,7 @@
        }
    }
    /**
     * å·¥å•状态 0已创建、1已投料、2已完工、3已检验、4已报工、5已入库、6已暂停、7已取消、8已关闭 9已恢复 10更换人员 11 å·²å¤‡æ–™ 12 äº§å‡º"
     * å·¥å•状态 0已创建、1已投料、2已完工、3已检验、4已报工、5已入库、6已暂停、7已取消、8已关闭 9已恢复 10更换人员 11 å·²å¤‡æ–™ 12 äº§å‡º 13生成中"
     */
    public interface WORKORDER_HISTORY_STATUS{
       public static final  int create = 0;
@@ -394,6 +406,7 @@
       public static final  int redistribute = 10;
       public static final  int readyMaterial = 11;
       public static final  int produce = 12;
       public static final  int producing = 13;
        static String getTitleByStatus(WorkorderExtListVO p, int status) {
            String title = "";
            switch (status){
@@ -435,6 +448,9 @@
                    break;
                case produce:
                    title="工单产出";
                    break;
                case producing:
                    title="工单生成中国";
                    break;
                default:
                    break;
@@ -483,6 +499,9 @@
                case produce:
                    title="工单产出";
                    break;
                case producing:
                    title="工单生产中";
                    break;
                default:
                    break;
            }
server/src/main/java/doumeemes/core/utils/HttpsUtil.java
@@ -15,7 +15,12 @@
import org.apache.http.util.EntityUtils;
import org.springframework.web.util.UriComponentsBuilder;
import javax.net.ssl.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -24,6 +29,10 @@
import java.util.Map;
public class HttpsUtil {
    public static String get(String url,boolean ignoreSSL) {
        return connection(url, "GET", null, null,ignoreSSL);
    }
    public static String sendPostByHttps(String url, Map<String, String> body, String token) {
@@ -126,6 +135,64 @@
        return null;
    }
    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
        HttpsURLConnection connection = null;
        try {
            URL _url = new URL(url);
            connection = (HttpsURLConnection) _url.openConnection();
            connection.setRequestMethod(method);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            if(contentType != null){
                connection.setRequestProperty("Content-Type", contentType);
            }
            if(ignoreSSL){
                //信任所有ssl证书和主机
                TrustManager[] trustManagers = {new HttpsTrustManager()};
                SSLContext context = SSLContext.getInstance("TLS");
                context.init(null, trustManagers, new SecureRandom());
                connection.setSSLSocketFactory(context.getSocketFactory());
                connection.setHostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });
            }
            connection.connect();
            if(data != null){
                OutputStream outputStream = connection.getOutputStream();
                outputStream.write(data.getBytes("utf-8"));
                outputStream.close();
            }
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                InputStream is = connection.getInputStream();
                byte[] b = new byte[4096];
                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
                int len;
                while ((len = is.read(b)) != -1) {
                    baos.write(b, 0, len);
                }
                is.close();
                return baos.toString("utf-8");
            }
            return connection.getResponseMessage();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
        }
        return null;
    }
    public static void main(String[] args) {
@@ -136,5 +203,43 @@
    }
}
class HttpsTrustManager implements X509TrustManager {
    private static TrustManager[] trustManagers = {new HttpsTrustManager()};
    @Override
    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
        // TODO Auto-generated method stub
    }
    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
        // TODO Auto-generated method stub
    }
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        // TODO Auto-generated method stub
        return null;
    }
    public static void allowAllSSL() {
        try {
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            e.printStackTrace();
        }
    }
}
server/src/main/java/doumeemes/dao/business/SalaryParamMapper.java
@@ -1,7 +1,11 @@
package doumeemes.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import doumeemes.dao.business.model.SalaryParam;
import doumeemes.dao.business.vo.SalaryParamVO;
import doumeemes.dao.ext.dto.SalaryParamDTO;
import org.apache.ibatis.annotations.Param;
/**
 * @author æ±Ÿè¹„蹄
@@ -9,4 +13,7 @@
 */
public interface SalaryParamMapper extends BaseMapper<SalaryParam> {
    IPage<SalaryParamVO> selectPage(IPage<SalaryParam> page, @Param("model") SalaryParamDTO model);
}
server/src/main/java/doumeemes/dao/business/dto/AutoWorkReportDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package doumeemes.dao.business.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/14 18:35
 */
@Data
public class AutoWorkReportDTO {
    @ApiModelProperty(value = "工序计划主键")
    private Integer plansId;
    @ApiModelProperty(value = "投料记录")
    private List<MaterialListDTO> recordList ;
    @ApiModelProperty(value = "产出记录")
    private CreateWorkorderRecordDTO createWorkorderRecordDTO;
}
server/src/main/java/doumeemes/dao/business/dto/CreateWorkorderRecordDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package doumeemes.dao.business.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/05/12 10:18
 */
@Data
public class CreateWorkorderRecordDTO {
    @ApiModelProperty(value = "工单主键")
    private Integer workorderId;
    @ApiModelProperty(value = "合格数量")
    private BigDecimal qualifiedNum;
    @ApiModelProperty(value = "不合格数量")
    private BigDecimal unQualifiedNum;
    @ApiModelProperty(value = "报工时长(秒)"  )
    private Integer duration;
}
server/src/main/java/doumeemes/dao/business/model/CompanyUser.java
@@ -148,4 +148,10 @@
    @ExcelColumn(name="是否是主账户:0=否;1=是;")
    private Integer isMaster;
    @ApiModelProperty(value = "微信openid")
    private String openid;
    @ApiModelProperty(value = "微信unionid")
    private String unionid;
}
server/src/main/java/doumeemes/dao/business/model/SalaryParam.java
@@ -8,6 +8,11 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -20,69 +25,71 @@
@TableName("`salary_param`")
public class SalaryParam {
    @ApiModelProperty(value = "主键", example = "1")
    @ApiModelProperty(value = "主键")
    @ExcelColumn(name="主键")
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "是否已删除 0未删除 1已删除", example = "1")
    @ApiModelProperty(value = "是否已删除 0未删除 1已删除")
    @ExcelColumn(name="是否已删除 0未删除 1已删除")
    private Byte deleted;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ApiModelProperty(value = "创建人编码")
    @ExcelColumn(name="创建人编码")
    private Integer createUser;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createTime;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ApiModelProperty(value = "更新人编码")
    @ExcelColumn(name="更新人编码")
    private Integer updateUser;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date updateTime;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "主组织编码(关联department表根组织)", example = "1")
    @ApiModelProperty(value = "主组织编码(关联department表根组织)")
    @ExcelColumn(name="主组织编码(关联department表根组织)")
    private Integer rootDepartId;
    @ApiModelProperty(value = "工厂编码(关联department表)", example = "1")
    @ApiModelProperty(value = "工厂编码(关联department表)")
    @ExcelColumn(name="工厂编码(关联department表)")
    @NotEmpty(message = "工厂编码不能为空")
    private Integer departId;
    @ApiModelProperty(value = "工序编码(关联procedure表)", example = "1")
    @ApiModelProperty(value = "工序编码(关联procedure表)")
    @ExcelColumn(name="工序编码(关联procedure表)")
    @NotEmpty(message = "工序编码不能为空")
    private Integer procedureId;
    @ApiModelProperty(value = "bom编码(关联bom表)", example = "1")
    @ApiModelProperty(value = "bom编码(关联bom表)")
    @ExcelColumn(name="bom编码(关联bom表)")
    private Integer bomId;
    @NotEmpty(message = "物料编码不能为空")
    private Integer materialId;
    @ApiModelProperty(value = "工资单价(元)", example = "1")
    @ExcelColumn(name="工资单价(元)")
    private Integer salary;
    private BigDecimal salary;
    @ApiModelProperty(value = "标准数量", example = "1")
    @ApiModelProperty(value = "标准数量")
    @ExcelColumn(name="标准数量")
    private Integer num;
    private BigDecimal num;
    @ApiModelProperty(value = "标准时长(秒)")
    @ExcelColumn(name="标准时长(秒)")
    private String times;
    @ApiModelProperty(value = "不良品是否计入 0否 1是", example = "1")
    @ApiModelProperty(value = "不良品是否计入 0否 1是")
    @ExcelColumn(name="不良品是否计入 0否 1是")
    private Integer unqualified;
    @ApiModelProperty(value = "计价方式 0计件 1计时", example = "1")
    @ApiModelProperty(value = "计价方式 0计件 1计时")
    @ExcelColumn(name="计价方式 0计件 1计时")
    private Integer type;
server/src/main/java/doumeemes/dao/business/model/Workorder.java
@@ -143,8 +143,8 @@
    @ExcelColumn(name="检验人员编码")
    private Integer checkUserId;
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消", example = "1")
    @ExcelColumn(name="工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消")
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消、7生产中", example = "1")
    @ExcelColumn(name="工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消、7生产中")
    private Integer status;
    @ApiModelProperty(value = "是否暂停 0未暂停 1已暂停", example = "1")
    @ExcelColumn(name="是否暂停 0未暂停 1已暂停")
@@ -230,10 +230,12 @@
    @ExcelColumn(name="报工时长(秒)")
    private Integer duration;
    @ApiModelProperty(value = "工资单价(分)", example = "1")
    @ExcelColumn(name="工资单价(分)")
    @ApiModelProperty(value = "工资结果(元)", example = "1")
    @ExcelColumn(name="工资结果(元)")
    private Integer salary;
    @ApiModelProperty(value = "工资单价(元)", example = "1")
    @ExcelColumn(name="工资单价(元)")
    private Integer salaryPrice;
    @ApiModelProperty(value = "标准数量", example = "1")
    @ExcelColumn(name="标准数量")
    private Integer salaryNum;
server/src/main/java/doumeemes/dao/business/model/WorkorderHistory.java
@@ -76,7 +76,7 @@
    @ExcelColumn(name="处理备注")
    private String info;
    @ApiModelProperty(value = "操作类型0已创建、1已投料、2完工、3检验、4已报工、5入库、6暂停、7取消、8关闭", example = "1")
    @ApiModelProperty(value = "操作类型0已创建、1已投料、2完工、3检验、4已报工、5入库、6暂停、7取消、8关闭 13生产中", example = "1")
    @ExcelColumn(name="操作类型0已创建、1已投料、2完工、3检验、4已报工、5入库、6暂停、7取消、8关闭")
    private Integer type;
server/src/main/java/doumeemes/dao/business/model/WorkorderRecord.java
@@ -129,11 +129,11 @@
    @ApiModelProperty(value = "检验合格数量", example = "1")
    @ExcelColumn(name="检验合格数量")
    private Integer qualifiedNum;
    private BigDecimal qualifiedNum;
    @ApiModelProperty(value = "检验不合格数量", example = "1")
    @ExcelColumn(name="检验不合格数量")
    private Integer unqualifiedNum;
    private BigDecimal unqualifiedNum;
    @ApiModelProperty(value = "检验日期")
    @ExcelColumn(name="检验日期")
@@ -151,22 +151,36 @@
    @ApiModelProperty(value = "生产人员编码集合([1],[2],...形式存储,优化查询)"  )
    @ExcelColumn(name="生产人员编码集合([1],[2],...形式存储,优化查询)")
    private String proUserids;
    @ApiModelProperty(value = "工单状态"  )
    @TableField(exist = false)
    private Integer workorderStatus;
    @ApiModelProperty(value = "物料质量属性0合格 1不良 2报废(只有type=1才有值)"  )
    private Integer materialDonetype;
    @ApiModelProperty(value = "物料工序编码(关联procedure表)"  )
    private Integer materialProcedureId;
    @ApiModelProperty(value = "关联票据编码(投料时)"  )
    private Integer relobjId;
    @ApiModelProperty(value = "关联票据类型 0工单 1篮筐更换单记录"  )
    private Integer relobjType;
    //MATERIAL_DONETYPE,MATERIAL_PROCEDURE_ID,RELOBJ_ID、RELOBJ_TYPE
    @ApiModelProperty(value = "报工时长(秒)"  )
    private Integer duration;
    @ApiModelProperty(value = "工资单价(分)"  )
    private BigDecimal salaryPrice;
    @ApiModelProperty(value = "标准数量"  )
    private BigDecimal salaryNum;
    @ApiModelProperty(value = "标准时长(秒)"  )
    private Integer salaryTimes;
    @ApiModelProperty(value = "不良品是否计入 0否 1是"  )
    private Integer salaryUnqualified;
    @ApiModelProperty(value = "计价方式 0计件 1计时"  )
    private Integer salaryType;
    @ApiModelProperty(value = "工资结果(分)"  )
    private BigDecimal salary;
}
server/src/main/java/doumeemes/dao/business/vo/SalaryParamVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package doumeemes.dao.business.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import doumeemes.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel("")
public class SalaryParamVO {
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码")
    @ExcelColumn(name="创建人编码")
    private String createUserName;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    private Date createTime;
    @ApiModelProperty(value = "主组织编码(关联department表根组织)")
    @ExcelColumn(name="主组织编码(关联department表根组织)")
    private Integer rootDepartId;
    @ApiModelProperty(value = "工厂编码(关联department表)")
    @ExcelColumn(name="工厂编码(关联department表)")
    @NotEmpty(message = "工厂编码不能为空")
    private Integer departId;
    @ApiModelProperty(value = "工序编码(关联procedure表)")
    @ExcelColumn(name="工序编码(关联procedure表)")
    @NotEmpty(message = "工序编码不能为空")
    private Integer procedureId;
    @ApiModelProperty(value = "工序编码(关联procedure表)")
    @ExcelColumn(name="工序编码(关联procedure表)")
    @NotEmpty(message = "工序编码不能为空")
    private Integer procedureCode;
    @ApiModelProperty(value = "工序编码(关联procedure表)")
    @ExcelColumn(name="工序编码(关联procedure表)")
    private String procedureName;
    @ApiModelProperty(value = "产品名称" )
    @Excel(name="产品名称",orderNum ="3")
    private String materialName;
    @ApiModelProperty(value = "产品编码" )
    @Excel(name="产品编码",orderNum ="4")
    private String materialCode;
    @ApiModelProperty(value = "物料编码(关联material_distribute表)", example = "1")
    private Integer materialId;
    @ApiModelProperty(value = "工资单价(元)")
    @ExcelColumn(name="工资单价(元)")
    private BigDecimal salary;
    @ApiModelProperty(value = "标准数量")
    @ExcelColumn(name="标准数量")
    private Integer num;
    @ApiModelProperty(value = "标准时长(秒)")
    @ExcelColumn(name="标准时长(秒)")
    private String times;
    @ApiModelProperty(value = "不良品是否计入 0否 1是")
    @ExcelColumn(name="不良品是否计入 0否 1是")
    private Integer unqualified;
    @ApiModelProperty(value = "计价方式 0计件 1计时")
    @ExcelColumn(name="计价方式 0计件 1计时")
    private Integer type;
}
server/src/main/java/doumeemes/dao/ext/WorkorderRecordExtMapper.java
@@ -2,9 +2,9 @@
import doumeemes.dao.business.model.WorkorderRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import doumeemes.dao.ext.vo.WOutboundRecordExtListVO;
import doumeemes.dao.ext.vo.WStockExtListForWorkorderVO;
import doumeemes.dao.ext.vo.WorkorderRecordExtListVO;
import doumeemes.dao.ext.dto.QuerySalaryStatisticDTO;
import doumeemes.dao.ext.dto.QueryUserSalaryListDTO;
import doumeemes.dao.ext.vo.*;
import doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO;
import io.lettuce.core.dynamic.annotation.Param;
@@ -18,6 +18,7 @@
     * @date 2022/04/20 10:56
     */
    List<WorkorderRecordExtListVO> selectListNew(QueryWorkorderRecordExtDTO dto);
    List<SalaryStatisticsListVO> salaryStatistic(QuerySalaryStatisticDTO dto);
    List<WStockExtListForWorkorderVO> choiceWorkorderRecordUseStockList(QueryWorkorderRecordExtDTO dto);
@@ -35,4 +36,5 @@
    List<WorkorderRecordExtListVO> checkIsWork(@Param("ids")String ids);
    List<UserSalaryListVO> userSalaryPage(QueryUserSalaryListDTO model);
}
server/src/main/java/doumeemes/dao/ext/dto/QuerySalaryStatisticDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package doumeemes.dao.ext.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import doumeemes.dao.business.dto.MaterialListDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Data
@ApiModel("工资报表统计分页查询请求参数")
public class QuerySalaryStatisticDTO {
    @ApiModelProperty(value = "生产人员编码", example = "1")
    private Integer userId;
    @ApiModelProperty(value = "根组织编码", example = "1",hidden = true)
    private Integer rootDepartId;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
    @ApiModelProperty(value = "数据权限部门编码集合" ,hidden = true)
    private List<Integer> departIds;
}
server/src/main/java/doumeemes/dao/ext/dto/QueryUserSalaryListDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package doumeemes.dao.ext.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import doumeemes.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Data
@ApiModel("员工绩效分页查询请求参数")
public class QueryUserSalaryListDTO {
    @ApiModelProperty(value = "生产人员编码", example = "1")
    private Integer userId;
    @ApiModelProperty(value = "工序编码", example = "1")
    private Integer procedureId;
    @ApiModelProperty(value = "物料编码", example = "1")
    private Integer materialId;
    @ApiModelProperty(value = "物料名称或物料code编码" )
    private String materialName;
    @ApiModelProperty(value = "根组织编码", example = "1",hidden = true)
    private Integer rootDepartId;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
    @ApiModelProperty(value = "数据权限部门编码集合" ,hidden = true)
    private List<Integer> departIds;
}
server/src/main/java/doumeemes/dao/ext/dto/QueryWorkorderExtDTO.java
@@ -99,9 +99,9 @@
    @ApiModelProperty(value = "检验人员编码", example = "1")
    private Integer checkUserId;
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消", example = "1")
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消、7生产中", example = "1")
    private Integer status;
    @ApiModelProperty(value = "工单状态集合(待生产:[0,1],生产中[2,3],已完成[4,5,6]" )
    @ApiModelProperty(value = "工单状态集合(待生产:[0,1],生产中[2,3,7],已完成[4,5,6]" )
    private List<Integer> statusList;
    @ApiModelProperty(value = "最近状态更新时间")
server/src/main/java/doumeemes/dao/ext/dto/QueryWorkorderRecordExtDTO.java
@@ -644,9 +644,10 @@
    @ApiModelProperty(value = "报工时长(秒)", example = "1")
    private Integer duration;
    @ApiModelProperty(value = "工资单价(分)", example = "1")
    @ApiModelProperty(value = "工资结果(元)", example = "1")
    private Integer salary;
    @ApiModelProperty(value = "工资单价(元)", example = "1")
    private Integer salaryPrice;
    @ApiModelProperty(value = "标准数量", example = "1")
    private Integer salaryNum;
server/src/main/java/doumeemes/dao/ext/dto/SalaryParamDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package doumeemes.dao.ext.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Data
@ApiModel("绩效工资配置")
public class SalaryParamDTO {
    @ApiModelProperty(value = "物料名称或编码")
    private String keyWord;
    @ApiModelProperty(value = "工序名称")
    private String procedureName;
    @ApiModelProperty(value = "计价方式  0计件 1计时")
    private Integer type;
}
server/src/main/java/doumeemes/dao/ext/dto/SalaryParamImportDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package doumeemes.dao.ext.dto;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Data
@ApiModel("绩效工资配置导入")
public class SalaryParamImportDTO {
    @Excel(name="计价方式",orderNum ="1")
    private String type;
    @Excel(name="工厂名称",orderNum ="2")
    private String departName;
    @Excel(name="产品名称",orderNum ="3")
    private String materialName;
    @Excel(name="产品编码",orderNum ="4")
    private String materialCode;
    @Excel(name="工序名称",orderNum ="5")
    private String procedureName;
    @Excel(name="工资单价(元)",orderNum ="6")
    private BigDecimal salary;
    @Excel(name="标准产出",orderNum ="7")
    private Integer NUM;
    @Excel(name="标准工时",orderNum ="8")
    private String timesName;
    @Excel(name="不良是否计入",orderNum ="9")
    private String unqualified;
}
server/src/main/java/doumeemes/dao/ext/dto/WorkPlansSaveDTO.java
@@ -1,5 +1,6 @@
package doumeemes.dao.ext.dto;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -40,4 +41,11 @@
    @ApiModelProperty(value = "优先级")
    private Integer urgent;
    @ApiModelProperty(value = "计划开始日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "销售单号" )
    private String salesorder;
}
server/src/main/java/doumeemes/dao/ext/dto/WxLoginDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package doumeemes.dao.ext.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 10:10
 */
@Data
public class WxLoginDTO {
    @ApiModelProperty(value = "企业编码")
    private Integer companyId;
    @NotBlank(message = "用户名不能为空")
    @ApiModelProperty(value = "用户名")
    private String username;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
    @ApiModelProperty(value = "微信 openid")
    private String openid;
    @ApiModelProperty(value = "微信 unionid")
    private String unionid;
}
server/src/main/java/doumeemes/dao/ext/vo/SalaryStatisticsListVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package doumeemes.dao.ext.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import doumeemes.core.annotation.excel.ExcelColumn;
import doumeemes.dao.business.model.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Data
@ApiModel("工资报表统计分页数据")
public class SalaryStatisticsListVO implements Serializable{
    @ApiModelProperty(value = "生产人员编码", example = "1")
    @ExcelColumn(name="生产人员编码")
    private Integer userId;
    @ApiModelProperty(value = "生成人员信息")
    private UserBaseInfoVO userInfo;
    @ApiModelProperty(value = "生产人员姓名",hidden = true)
    @ExcelColumn(name="生产人员姓名")
    private String userName;
    @ApiModelProperty(value = "所属部门编码", example = "1",hidden = true)
    @ExcelColumn(name="所属部门编码")
    private Integer departId;
    @ApiModelProperty(value = "所属部门名称",hidden = true)
    @ExcelColumn(name="所属部门名称")
    private String departName;
    @ApiModelProperty(value = "计件工资(分)", example = "1")
    @ExcelColumn(name="计件工资(分)")
    private BigDecimal jijianSalary;
    @ApiModelProperty(value = "计时工资(分)", example = "1")
    @ExcelColumn(name="计时工资(分)")
    private BigDecimal jishiSalary;
    @ApiModelProperty(value = "小计工资(分)", example = "1")
    @ExcelColumn(name="小计工资(分)")
    private BigDecimal totalSalary;
    @ApiModelProperty(value = "报工总单数,不包含工资为0的", example = "1")
    @ExcelColumn(name="报工总单数")
    private Integer num;
}
server/src/main/java/doumeemes/dao/ext/vo/UserBaseInfoVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package doumeemes.dao.ext.vo;
import doumeemes.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Data
@ApiModel("用户基本信息数据")
public class UserBaseInfoVO implements Serializable{
    @ApiModelProperty(value = "生产人员编码", example = "1")
    @ExcelColumn(name="生产人员编码")
    private Integer userId;
    @ApiModelProperty(value = "生产人员姓名和部门名称组合")
    @ExcelColumn(name="生产人员姓名和部门名称组合")
    private String nameAndDepart;
    @ApiModelProperty(value = "生产人员姓名")
    @ExcelColumn(name="生产人员姓名")
    private String userName;
    @ApiModelProperty(value = "所属部门编码", example = "1")
    @ExcelColumn(name="所属部门编码")
    private Integer departId;
    @ApiModelProperty(value = "所属部门名称")
    @ExcelColumn(name="所属部门名称")
    private String departName;
}
server/src/main/java/doumeemes/dao/ext/vo/UserSalaryListVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package doumeemes.dao.ext.vo;
import doumeemes.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2022/04/20 10:56
 */
@Data
@ApiModel("员工绩效分页数据")
public class UserSalaryListVO implements Serializable{
    @ApiModelProperty(value = "生产人员编码", example = "1")
    @ExcelColumn(name="生产人员编码")
    private Integer userId;
    @ApiModelProperty(value = "生成人员信息")
    private UserBaseInfoVO userInfo;
    @ApiModelProperty(value = "生产人员姓名",hidden = true)
    @ExcelColumn(name="生产人员姓名")
    private String userName;
    @ApiModelProperty(value = "所属部门编码", example = "1",hidden = true)
    @ExcelColumn(name="所属部门编码")
    private Integer departId;
    @ApiModelProperty(value = "所属部门名称",hidden = true)
    @ExcelColumn(name="所属部门名称")
    private String departName;
    @ApiModelProperty(value = "物料编码", example = "1")
    @ExcelColumn(name="物料编码")
    private String materialCode;
    @ApiModelProperty(value = "物料名称", example = "1")
    @ExcelColumn(name="物料名称")
    private String materialName;
    @ApiModelProperty(value = "物料主键", example = "1")
    @ExcelColumn(name="物料主键")
    private Integer materialId;
    @ApiModelProperty(value = "工单编码", example = "1")
    @ExcelColumn(name="工单编码")
    private String workorderCode;
    @ApiModelProperty(value = "工单料主键", example = "1")
    @ExcelColumn(name="工单主键")
    private Integer workorderId;
    @ApiModelProperty(value = "工序主键", example = "1")
    @ExcelColumn(name="工序主键")
    private Integer procedureId;
    @ApiModelProperty(value = "工序名称")
    @ExcelColumn(name="工序名称")
    private String procedureName;
    @ApiModelProperty(value = "单位")
    @ExcelColumn(name="单位")
    private String unitName;
    @ApiModelProperty(value = "报工数")
    @ExcelColumn(name="报工数")
    private BigDecimal num;
    @ApiModelProperty(value = "良品数")
    @ExcelColumn(name="良品数")
    private BigDecimal qualifiedNum;
    @ApiModelProperty(value = "不良品数")
    @ExcelColumn(name="不良品数")
    private BigDecimal unQualifiedNum;
    @ApiModelProperty(value = "合格率(%)")
    @ExcelColumn(name="合格率(%)")
    private BigDecimal rate;
}
server/src/main/java/doumeemes/dao/ext/vo/WorkPlansExtListVO.java
@@ -74,7 +74,7 @@
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "销售单号" )
    @Excel(name="销售单号",index = 16,width =15)
    @ExcelColumn(name="销售单号",index = 16,width =15)
    private String salesorder;
    @ApiModelProperty(value = "物料编码(关联material_distribute表)", example = "1")
    @ExcelColumn(name="物料编码(关联material_distribute表)")
server/src/main/java/doumeemes/dao/ext/vo/WorkorderExtListVO.java
@@ -114,8 +114,8 @@
    @ApiModelProperty(value = "检验人员编码", example = "1")
    private Integer checkUserId;
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消", example = "1")
    @ExcelColumn(name="工单状态",valueMapping = "0=已创建;1=已备料;2=已完工;3=已检验;4=已报工;5=已入库;6=已取消;",index = 14,width =15)
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消、7生产中", example = "1")
    @ExcelColumn(name="工单状态",valueMapping = "0=已创建;1=已备料;2=已完工;3=已检验;4=已报工;5=已入库;6=已取消;7=生产中;",index = 14,width =15)
    private Integer status;
    @ApiModelProperty(value = "最近状态更新时间")
server/src/main/java/doumeemes/dao/ext/vo/WorkorderListModelVO.java
@@ -63,7 +63,7 @@
    @ApiModelProperty(value = "投料列表")
    private List<MaterialModelVo> materialList;
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消", example = "1")
    @ApiModelProperty(value = "工单状态 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消、7生产中", example = "1")
    private Integer status;
    @ApiModelProperty(value = "优先级(排序码)字段", example = "1")
server/src/main/java/doumeemes/dao/ext/vo/WorkorderRecordExtListVO.java
@@ -230,9 +230,12 @@
    @ExcelColumn(name="报工时长(秒)")
    private Integer duration;
    @ApiModelProperty(value = "工资单价(分)", example = "1")
    @ExcelColumn(name="工资单价(分)")
    @ApiModelProperty(value = "工资结果(元)", example = "1")
    @ExcelColumn(name="工资结果(元)")
    private Integer salary;
    @ApiModelProperty(value = "工资单价(元)", example = "1")
    @ExcelColumn(name="工资单价(元)")
    private Integer salaryPrice;
    @ApiModelProperty(value = "标准数量", example = "1")
    @ExcelColumn(name="标准数量")
server/src/main/java/doumeemes/dao/ext/vo/WxLoginVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package doumeemes.dao.ext.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 11:22
 */
@Data
public class WxLoginVO {
    @ApiModelProperty(value = "登录状态:0=微信登录成功;1=微信登录失败")
    private Integer loginStatus;
    @ApiModelProperty(value = "微信 openid")
    private String openid ;
    @ApiModelProperty(value = "微信 unionid")
    private String unionid ;
    @ApiModelProperty(value = "session")
    private String session ;
}
server/src/main/java/doumeemes/dao/system/model/SystemMenu.java
@@ -75,4 +75,8 @@
    @ApiModelProperty(value = "类型 0平台 1企业PC端 2企业手机端", example = "1")
    private Integer type;
    @ApiModelProperty(value = "文件访问前缀")
    @TableField(exist = false)
    private String resourcePath;
}
server/src/main/java/doumeemes/dao/system/model/SystemUser.java
@@ -37,7 +37,7 @@
    @NotBlank(message = "姓名不能为空", groups = {OperaType.Create.class/*, OperaType.Update.class*/})
    private String realname;
    @NotBlank(message = "工号不能为空", groups = {OperaType.Create.class/*, OperaType.Update.class*/})
//    @NotBlank(message = "工号不能为空", groups = {OperaType.Create.class/*, OperaType.Update.class*/})
    @ApiModelProperty(value = "总账号工号")
    private String empNo;
server/src/main/java/doumeemes/dao/system/vo/SystemMenuListVO.java
@@ -27,4 +27,6 @@
    @ApiModelProperty(value = "更新人信息")
    private SystemUser updateUserInfo;
    @ApiModelProperty(value = "文件访问前缀")
    private String resourcePath;
}
server/src/main/java/doumeemes/service/business/SalaryParamService.java
@@ -3,6 +3,10 @@
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.business.model.SalaryParam;
import doumeemes.dao.business.vo.SalaryParamVO;
import doumeemes.dao.ext.dto.SalaryParamDTO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
@@ -14,7 +18,7 @@
    /**
     * åˆ›å»º
     *
     *
     * @param salaryParam å®žä½“对象
     * @return Integer
     */
@@ -48,6 +52,14 @@
     */
    void updateById(SalaryParam salaryParam);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param salaryParam å®žä½“对象
     */
    void update(SalaryParam salaryParam);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
@@ -78,14 +90,14 @@
     * @return List<SalaryParam>
     */
    List<SalaryParam> findList(SalaryParam salaryParam);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<SalaryParam>
     */
    PageData<SalaryParam> findPage(PageWrap<SalaryParam> pageWrap);
    PageData<SalaryParamVO> findPage(PageWrap<SalaryParamDTO> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
@@ -94,4 +106,10 @@
     * @return long
     */
    long count(SalaryParam salaryParam);
    /**
     *
     * @param file
     */
    void importPlans(MultipartFile file);
}
server/src/main/java/doumeemes/service/business/impl/SalaryParamServiceImpl.java
@@ -1,20 +1,38 @@
package doumeemes.service.business.impl;
import doumeemes.core.constants.ResponseStatus;
import doumeemes.core.exception.BusinessException;
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.core.utils.Constants;
import doumeemes.core.utils.Utils;
import doumeemes.core.utils.excel.EasyExcelUtil;
import doumeemes.dao.business.DepartmentMapper;
import doumeemes.dao.business.MaterialMapper;
import doumeemes.dao.business.ProceduresMapper;
import doumeemes.dao.business.SalaryParamMapper;
import doumeemes.dao.business.model.SalaryParam;
import doumeemes.dao.business.model.*;
import doumeemes.dao.business.vo.SalaryParamVO;
import doumeemes.dao.ext.dto.SalaryParamDTO;
import doumeemes.dao.ext.dto.SalaryParamImportDTO;
import doumeemes.service.business.DepartmentService;
import doumeemes.service.business.SalaryParamService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * è®¾ç½®ç±»-绩效工资配置表Service实现
@@ -27,9 +45,36 @@
    @Autowired
    private SalaryParamMapper salaryParamMapper;
    @Autowired
    private DepartmentMapper departmentMapper;
    @Autowired
    private MaterialMapper materialMapper;
    @Autowired
    private ProceduresMapper proceduresMapper;
    @Override
    public Integer create(SalaryParam salaryParam) {
        salaryParamMapper.insert(salaryParam);
        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        SalaryParam insert = new SalaryParam();
        insert.setDeleted((byte) Constants.ZERO);
        insert.setCreateUser(principal.getId());
        insert.setCreateTime(new Date());
        insert.setUpdateUser(principal.getId());
        insert.setUpdateTime(new Date());
        insert.setRemark(salaryParam.getRemark());
        insert.setRootDepartId(salaryParam.getRootDepartId());
        insert.setDepartId(salaryParam.getDepartId());
        insert.setProcedureId(salaryParam.getProcedureId());
        insert.setMaterialId(salaryParam.getMaterialId());
        insert.setSalary(salaryParam.getSalary());
        insert.setNum(salaryParam.getNum());
        insert.setTimes(salaryParam.getTimes());
        insert.setUnqualified(salaryParam.getUnqualified());
        insert.setType(salaryParam.getType());
        salaryParamMapper.insert(insert);
        return salaryParam.getId();
    }
@@ -58,6 +103,25 @@
    }
    @Override
    public void update(SalaryParam salaryParam) {
        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        UpdateWrapper<SalaryParam> wrapper = new UpdateWrapper<>();
        wrapper.lambda()
                .eq(SalaryParam::getId,salaryParam.getId())
                .set(SalaryParam::getUpdateTime,new Date())
                .set(SalaryParam::getUpdateUser,principal.getId())
                .set(SalaryParam::getType,salaryParam.getType())
                .set(SalaryParam::getDepartId,salaryParam.getDepartId())
                .set(SalaryParam::getMaterialId,salaryParam.getMaterialId())
                .set(SalaryParam::getProcedureId,salaryParam.getProcedureId())
                .set(SalaryParam::getSalary,salaryParam.getSalary())
                .set(SalaryParam::getNum,salaryParam.getNum())
                .set(SalaryParam::getTimes,salaryParam.getTimes())
                .set(SalaryParam::getUnqualified,salaryParam.getUnqualified());
        salaryParamMapper.update(null,wrapper);
    }
    @Override
    public void updateByIdInBatch(List<SalaryParam> salaryParams) {
        if (CollectionUtils.isEmpty(salaryParams)) {
            return;
@@ -83,70 +147,12 @@
        QueryWrapper<SalaryParam> wrapper = new QueryWrapper<>(salaryParam);
        return salaryParamMapper.selectList(wrapper);
    }
    @Override
    public PageData<SalaryParam> findPage(PageWrap<SalaryParam> pageWrap) {
    public PageData<SalaryParamVO> findPage(PageWrap<SalaryParamDTO> pageWrap) {
        IPage<SalaryParam> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<SalaryParam> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(SalaryParam::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getDeleted() != null) {
            queryWrapper.lambda().eq(SalaryParam::getDeleted, pageWrap.getModel().getDeleted());
        }
        if (pageWrap.getModel().getCreateUser() != null) {
            queryWrapper.lambda().eq(SalaryParam::getCreateUser, pageWrap.getModel().getCreateUser());
        }
        if (pageWrap.getModel().getCreateTime() != null) {
            queryWrapper.lambda().ge(SalaryParam::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
            queryWrapper.lambda().le(SalaryParam::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
        }
        if (pageWrap.getModel().getUpdateUser() != null) {
            queryWrapper.lambda().eq(SalaryParam::getUpdateUser, pageWrap.getModel().getUpdateUser());
        }
        if (pageWrap.getModel().getUpdateTime() != null) {
            queryWrapper.lambda().ge(SalaryParam::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
            queryWrapper.lambda().le(SalaryParam::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(SalaryParam::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getRootDepartId() != null) {
            queryWrapper.lambda().eq(SalaryParam::getRootDepartId, pageWrap.getModel().getRootDepartId());
        }
        if (pageWrap.getModel().getDepartId() != null) {
            queryWrapper.lambda().eq(SalaryParam::getDepartId, pageWrap.getModel().getDepartId());
        }
        if (pageWrap.getModel().getProcedureId() != null) {
            queryWrapper.lambda().eq(SalaryParam::getProcedureId, pageWrap.getModel().getProcedureId());
        }
        if (pageWrap.getModel().getBomId() != null) {
            queryWrapper.lambda().eq(SalaryParam::getBomId, pageWrap.getModel().getBomId());
        }
        if (pageWrap.getModel().getSalary() != null) {
            queryWrapper.lambda().eq(SalaryParam::getSalary, pageWrap.getModel().getSalary());
        }
        if (pageWrap.getModel().getNum() != null) {
            queryWrapper.lambda().eq(SalaryParam::getNum, pageWrap.getModel().getNum());
        }
        if (pageWrap.getModel().getTimes() != null) {
            queryWrapper.lambda().eq(SalaryParam::getTimes, pageWrap.getModel().getTimes());
        }
        if (pageWrap.getModel().getUnqualified() != null) {
            queryWrapper.lambda().eq(SalaryParam::getUnqualified, pageWrap.getModel().getUnqualified());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(SalaryParam::getType, pageWrap.getModel().getType());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(salaryParamMapper.selectPage(page, queryWrapper));
        SalaryParamDTO model = pageWrap.getModel();
        return PageData.from(salaryParamMapper.selectPage(page, model));
    }
    @Override
@@ -154,4 +160,81 @@
        QueryWrapper<SalaryParam> wrapper = new QueryWrapper<>(salaryParam);
        return salaryParamMapper.selectCount(wrapper);
    }
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    @Override
    public void importPlans(MultipartFile file) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
        }
        //解析excel
        List<SalaryParamImportDTO> plansList = EasyExcelUtil.importExcel(file, 1, 1, SalaryParamImportDTO.class);
        if(plansList == null || plansList.size()==0){
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!");
        }
        plansList.forEach(s->{
            if (Objects.isNull(s.getType())
                || Objects.isNull(s.getDepartName())
                || Objects.isNull(s.getMaterialCode())
                || Objects.isNull(s.getProcedureName())
                || Objects.isNull(s.getNUM())){
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!");
            }
        });
        for (int i = 0; i < plansList.size(); i++) {
            SalaryParamImportDTO salaryParamImportDTO = plansList.get(i);
            QueryWrapper<Department> wrapper = new QueryWrapper<>();
            wrapper.lambda()
                    .eq(Department::getName,salaryParamImportDTO.getDepartName())
                    .eq(Department::getType,Constants.DEPART_TYPE.factory)
                    .last("limit 1");
            Department department = departmentMapper.selectOne(wrapper);
            if (Objects.isNull(department)){
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【公司名称】有误!");
            }
            QueryWrapper<Material> materialWrapper = new QueryWrapper<>();
            materialWrapper.lambda()
                    .eq(Material::getCode,salaryParamImportDTO.getMaterialCode())
                    .eq(Material::getRootDepartId,department.getRootId())
                    .last("limit 1");
            Material material = materialMapper.selectOne(materialWrapper);
            if (Objects.isNull(material)){
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【产品编码】有误!");
            }
            if (Objects.nonNull(material) && Objects.equals(material.getName(),salaryParamImportDTO.getMaterialName())){
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【产品名称】有误!");
            }
            QueryWrapper<Procedures> proceduresWrapper = new QueryWrapper<>();
            proceduresWrapper.lambda()
                    .eq(Procedures::getName,salaryParamImportDTO.getProcedureName())
                    .eq(Procedures::getRootDepartId,department.getRootId())
                    .eq(Procedures::getDepartId,department.getId())
                    .last("limit 1");
            Procedures procedures = proceduresMapper.selectOne(proceduresWrapper);
            if (Objects.isNull(procedures)){
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【工序名称】有误!");
            }
            SalaryParam salaryParam = new SalaryParam();
            salaryParam.setRootDepartId(department.getRootId());
            salaryParam.setDepartId(department.getId());
            salaryParam.setProcedureId(procedures.getId());
            salaryParam.setMaterialId(material.getId());
            salaryParam.setSalary(salaryParamImportDTO.getSalary());
            salaryParam.setNum(salaryParamImportDTO.getNUM());
            //todo
//            salaryParam.setTimes();
//            salaryParam.setUnqualified(salaryParamImportDTO.getUnqualified() );
//            salaryParam.setType(salaryParamImportDTO.getType());
            create(salaryParam);
        }
    }
}
server/src/main/java/doumeemes/service/business/impl/WorkorderCheckServiceImpl.java
@@ -276,8 +276,11 @@
        //工单对象
        Workorder workorder=workorderExtMapper.selectById(wc.getWorkorderId());
        if(workorder==null || workorder.getStatus()==Constants.WORKORDER_STATUS.done||workorder.getStatus()==Constants.WORKORDER_STATUS.baogong
                ||workorder.getStatus()==Constants.WORKORDER_STATUS.instock ||workorder.getStatus()==Constants.WORKORDER_STATUS.cancel){
        if(workorder==null
                || workorder.getStatus()==Constants.WORKORDER_STATUS.done
                ||workorder.getStatus()==Constants.WORKORDER_STATUS.baogong
                ||workorder.getStatus()==Constants.WORKORDER_STATUS.instock
                ||workorder.getStatus()==Constants.WORKORDER_STATUS.cancel){
            return ApiResponse.failed("工单不允许检验");
        }
        if(workorder.getPlanNum()!=null){
@@ -398,7 +401,7 @@
        //工单对象
        Workorder workorder=workorderExtMapper.selectById(wc.getWorkorderId());
        if(workorder==null || workorder.getStatus()==Constants.WORKORDER_STATUS.done||workorder.getStatus()==Constants.WORKORDER_STATUS.baogong
        if(workorder==null || workorder.getStatus()==Constants.WORKORDER_STATUS.done || workorder.getStatus()==Constants.WORKORDER_STATUS.done||workorder.getStatus()==Constants.WORKORDER_STATUS.baogong
                ||workorder.getStatus()==Constants.WORKORDER_STATUS.instock ||workorder.getStatus()==Constants.WORKORDER_STATUS.cancel){
            return ApiResponse.failed("工单不允许检验");
        }
server/src/main/java/doumeemes/service/ext/PlansExtService.java
@@ -5,6 +5,7 @@
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.business.dto.AutoWorkReportDTO;
import doumeemes.dao.business.model.Plans;
import doumeemes.dao.business.model.Workorder;
import doumeemes.dao.ext.vo.PlansExtListCountVO;
@@ -76,4 +77,11 @@
    void pauseByIdForStandard(Plans model,LoginUserInfo userInfo);
    void regainByIdForStandard(Plans model, LoginUserInfo userInfo);
    List<PlansExtListVO> getListByWorkPlan(Integer workPlanId);
    /**
     * ä¸€é”®æŠ¥å·¥
     * @param user
     * @param autoWorkReportDTO
     */
    void autoWorkReport(LoginUserInfo user, AutoWorkReportDTO autoWorkReportDTO);
}
server/src/main/java/doumeemes/service/ext/WorkorderRecordExtService.java
@@ -6,7 +6,11 @@
import doumeemes.dao.business.model.Workorder;
import doumeemes.dao.business.model.WorkorderRecord;
import doumeemes.dao.ext.bean.EndCheckApBean;
import doumeemes.dao.ext.dto.QuerySalaryStatisticDTO;
import doumeemes.dao.ext.dto.QueryUserSalaryListDTO;
import doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO;
import doumeemes.dao.ext.vo.SalaryStatisticsListVO;
import doumeemes.dao.ext.vo.UserSalaryListVO;
import doumeemes.dao.ext.vo.WorkorderRecordExtListVO;
import javax.servlet.http.HttpServletResponse;
@@ -45,4 +49,11 @@
   void exportExcel(PageWrap<QueryWorkorderRecordExtDTO> pageWrap ,HttpServletResponse response);
   PageData<SalaryStatisticsListVO> salaryStatistic(PageWrap<QuerySalaryStatisticDTO> pageWrap);
    PageData<UserSalaryListVO> userSalaryPage(PageWrap<QueryUserSalaryListDTO> pageWrap);
    void exportUserSalary(PageWrap<QueryUserSalaryListDTO> pageWrap, HttpServletResponse response);
    void exportSalaryStatistics(PageWrap<QuerySalaryStatisticDTO> pageWrap, HttpServletResponse response);
}
server/src/main/java/doumeemes/service/ext/WorkorderRecordStandardService.java
@@ -4,6 +4,7 @@
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.business.dto.CreateMaterialDTO;
import doumeemes.dao.business.dto.CreateWorkorderRecordDTO;
import doumeemes.dao.business.dto.DealWorkorderRecordDTO;
import doumeemes.dao.business.model.Workorder;
import doumeemes.dao.business.model.WorkorderRecord;
@@ -30,6 +31,8 @@
    WorkorderRecord dealWorkorderRecord(DealWorkorderRecordDTO dealWorkorderRecordDTO, LoginUserInfo loginUserInfo);
    WorkorderRecord createWorkorderRecord(CreateWorkorderRecordDTO createWorkorderRecordDTO, LoginUserInfo loginUserInfo);
    List<WorkorderRecord> getWorkorderRecordList(Integer workorderId);
    PageData<WStockExtListVO> choiceStockPageForWorkorder(PageWrap<QueryWStockDto> pageWrap, LoginUserInfo userInfo);
server/src/main/java/doumeemes/service/ext/impl/PlansExtServiceImpl.java
@@ -16,11 +16,13 @@
import doumeemes.core.utils.excel.EasyExcelUtil;
import doumeemes.core.utils.redis.RedisUtil;
import doumeemes.dao.business.PlansMapper;
import doumeemes.dao.business.dto.*;
import doumeemes.dao.business.model.*;
import doumeemes.dao.ext.*;
import doumeemes.dao.ext.dto.*;
import doumeemes.dao.ext.vo.*;
import doumeemes.service.ext.*;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.BeanUtils;
@@ -35,6 +37,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * ç”Ÿäº§è®¡åˆ’Service实现
@@ -84,6 +87,8 @@
    private MaterialDistributeExtMapper materialDistributeExtMapper;
    @Autowired
    private WStockExtService  wStockExtService;
    @Autowired
    private WorkorderRecordStandardService workorderRecordStandardService;
    @Override
    public  PlansExtListVO findById(Integer id){
@@ -565,7 +570,7 @@
        distributeDone(user, param,param.getPlanNum());
    }
    private void distributeDone(LoginUserInfo user,  Workorder param,int thisPlanNum) {
    private Workorder distributeDone(LoginUserInfo user,  Workorder param,int thisPlanNum) {
        if(param.getPlanId()== null
                ||param.getPlanDate() == null
                || param.getProGroupId()==null
@@ -648,7 +653,7 @@
            //生产人员记录
            workorderUserExtMapper.insert(wu);
        }
        return order;
    }
    private void checkUserAndGroup(Workorder param, PlansExtListVO  model,LoginUserInfo user) throws BusinessException{
@@ -1545,4 +1550,62 @@
    }
    /**
     * ä¸€é”®æŠ¥å·¥
     * @param user
     */
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    @Override
    public void autoWorkReport(LoginUserInfo user, AutoWorkReportDTO autoWorkReportDTO){
        //查询工工序计划状态
        Plans plans = plansExtMapper.selectById(autoWorkReportDTO.getPlansId());
        if(Objects.isNull(plans)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到工序计划数据");
        }
        if(plans.getStatus().equals(Constants.PLAN_STATUS.create)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"工序计划已流转,无法操作");
        }
        if(Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"参数错误:产出数据");
        }
        //查询工序计划已分配数量
        List<Workorder> workorderList = workorderExtMapper.selectList(new QueryWrapper<Workorder>().eq("PLAN_ID",plans.getId()));
        //本次产出数量
        BigDecimal num = autoWorkReportDTO.getCreateWorkorderRecordDTO().getQualifiedNum().add(autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum());
        if(num.compareTo(BigDecimal.ZERO)<=Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"参数错误:产出数据");
        }
        //工单已分配数量
        Integer produceNum = workorderList.stream().map(s -> s.getPlanNum()).reduce(Constants.ZERO, Integer::sum);
        Integer surplusNum = plans.getNum() - produceNum;
        if(num.compareTo(BigDecimal.valueOf(surplusNum))>0){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"参数错误:超出工单剩余可分配数量");
        }
        Workorder param = new Workorder();
        param.setPlanId(autoWorkReportDTO.getPlansId());
        param.setPlanDate(new Date());
        List<Integer> proUserList = new ArrayList<Integer>();
        //TODO
        proUserList.add(user.getId());
        param.setProUserList(proUserList);
        param.setPlanNum(plans.getNum());
        //生成工单信息
        Workorder workorder = this.distributeDone(user,param,plans.getNum());
        //工单投料记录
        CreateMaterialDTO createMaterialDTO = new CreateMaterialDTO();
        if(!Objects.isNull(autoWorkReportDTO.getRecordList())&&autoWorkReportDTO.getRecordList().size()>Constants.ZERO){
            createMaterialDTO.setId(workorder.getId());
            createMaterialDTO.setRecordList(autoWorkReportDTO.getRecordList());
            workorderRecordStandardService.createMaterialStandard(createMaterialDTO);
        }
        //工单产出记录
        workorderRecordStandardService.createWorkorderRecord(autoWorkReportDTO.getCreateWorkorderRecordDTO(),user);
        //工单报工
        workorderRecordStandardService.comfirmDone(workorder);
    }
}
server/src/main/java/doumeemes/service/ext/impl/WorkPlansExtServiceImpl.java
@@ -97,7 +97,9 @@
                || Objects.isNull(workPlansSaveDTO.getNum())
                || Objects.isNull(workPlansSaveDTO.getFactoryId())
                || Objects.isNull(workPlansSaveDTO.getUnitId())
                || Objects.isNull(workPlansSaveDTO.getMaterialId())){
                || Objects.isNull(workPlansSaveDTO.getMaterialId())
                || Objects.isNull(workPlansSaveDTO.getStartDate())
                || workPlansSaveDTO.getStartDate().getTime() > workPlansSaveDTO.getPlanDate().getTime()){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        WorkPlans workPlans = new WorkPlans();
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordExtServiceImpl.java
@@ -141,6 +141,52 @@
        }
        return PageData.from(new PageInfo<>(result));
    }
    @Override
    public  PageData<SalaryStatisticsListVO> salaryStatistic(PageWrap<QuerySalaryStatisticDTO> pageWrap) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
        }
        //只能查看当前根组织的数据
        pageWrap.getModel().setRootDepartId(user.getRootDepartment().getId());
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
        List<SalaryStatisticsListVO> result = workorderRecordExtMapper.salaryStatistic(pageWrap.getModel());
        if(result!=null){
            List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class);
            for(SalaryStatisticsListVO model : result){
                //查询生产人员姓名
//                model.setUserName(initProUser(user,model.getUserId(),allDepartList));
                    model.setUserInfo(initProUser(user,model.getUserId(),allDepartList));
            }
        }
        return PageData.from(new PageInfo<>(result));
    }
    @Override
    public  PageData<UserSalaryListVO> userSalaryPage(PageWrap<QueryUserSalaryListDTO> pageWrap) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
        }
        //只能查看当前根组织的数据
        pageWrap.getModel().setRootDepartId(user.getRootDepartment().getId());
        pageWrap.getModel().setRootDepartId(user.getRootDepartment().getId());
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
        //数据权限
//        List<Integer> dataPermission = user.getDepartPermissionList();
        List<UserSalaryListVO> result = workorderRecordExtMapper.userSalaryPage(pageWrap.getModel());
        if(result!=null){
            List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class);
            for(UserSalaryListVO model : result){
                //查询生产人员姓名
                model.setUserInfo(initProUser(user,model.getUserId(),allDepartList));
                if(Constants.formatBigdecimal4Float(model.getNum()).compareTo(new BigDecimal(0))>0){
                    model.setRate(Constants.formatBigdecimal4Float(model.getQualifiedNum()).divide(model.getNum(),4).multiply(new BigDecimal(100)));
                }
            }
        }
        return PageData.from(new PageInfo<>(result));
    }
    private void initProUser(LoginUserInfo user, WorkorderRecordExtListVO data, List<DepartmentExtListVO> allDepartList) {
        if(data.getCreateUser() ==null){
@@ -156,6 +202,29 @@
            String dName =d==null?"":StringUtils.defaultString(d.getName(),"");
            data.setProcedureName(comp.getName()+"-"+dName);
        }
    }
    private UserBaseInfoVO initProUser(LoginUserInfo user, Integer userId, List<DepartmentExtListVO> allDepartList) {
        if(userId ==null){
            return null;
        }
        CompanyUser query=new CompanyUser();
        query.setUserId(userId);
        query.setRootDepartId(user.getRootDepartment().getId());
        query.setDeleted(Constants.ZERO);
        CompanyUser comp= companyUserExtMapper.selectOne(new QueryWrapper<>(query).last(" limit 1"));
        if(comp!=null){
            UserBaseInfoVO userinfo = new UserBaseInfoVO();
            DepartmentExtListVO d = departmentExtService.getModelById(user.getCompany().getId(),comp.getDepartmentId(),allDepartList);
            String dName =d==null?"":StringUtils.defaultString(d.getName(),"");
            userinfo.setNameAndDepart (comp.getName()+"-"+dName);
            userinfo.setDepartId(d.getId());
            userinfo.setUserId(userId);
            userinfo.setUserName(comp.getName());
            userinfo.setDepartName(d.getName());
            return  userinfo;
        }
        return null;
    }
    @Override
    public List<WorkorderRecordExtListVO> findAll(QueryWorkorderRecordExtDTO pageWrap) {
@@ -1338,6 +1407,13 @@
            order.setStatus(Constants.WORKORDER_STATUS.material);
        }else if(status ==Constants.WORKORDER_HISTORY_STATUS.done){
            order.setStatus(Constants.WORKORDER_STATUS.done);
        }else if(status ==Constants.WORKORDER_HISTORY_STATUS.produce){
            //投料操作
            if(Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create)
                    ||Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.material)){
                //如果是已创建或者已备料状态的工单,修改其状态为【生产中】
                order.setStatus(Constants.WORKORDER_STATUS.producing);
            }
        }
        workorderExtMapper.updateById(order);
        workorderHistoryExtMapper.insertBatch(whList);
@@ -1597,6 +1673,30 @@
    @Override
    public void exportUserSalary(PageWrap<QueryUserSalaryListDTO> pageWrap, HttpServletResponse response) {
        List<UserSalaryListVO> result=this.userSalaryPage(pageWrap).getRecords();
        for(UserSalaryListVO model : result) {
            if(model.getUserInfo()!=null){
                model.setUserName(model.getUserInfo().getUserName());
                model.setDepartName(model.getUserInfo().getDepartName());
            }
        }
        ExcelExporter.build(UserSalaryListVO.class).export(result, "员工绩效明细"+System.currentTimeMillis(), response);
    }
    @Override
    public void exportSalaryStatistics(PageWrap<QuerySalaryStatisticDTO> pageWrap, HttpServletResponse response){
        List<SalaryStatisticsListVO> result=this.salaryStatistic(pageWrap).getRecords();
        for(SalaryStatisticsListVO model : result) {
            if(model.getUserInfo()!=null){
                model.setUserName(model.getUserInfo().getUserName());
                model.setDepartName(model.getUserInfo().getDepartName());
            }
        }
        ExcelExporter.build(SalaryStatisticsListVO.class).export(result, "工资报表"+System.currentTimeMillis(), response);
    }
    @Override
    public void exportExcel(PageWrap<QueryWorkorderRecordExtDTO> pageWrap, HttpServletResponse response) {
        List<WorkorderRecordExtListVO> result=this.findPage(pageWrap).getRecords();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java
@@ -16,7 +16,9 @@
import doumeemes.core.utils.redis.RedisUtil;
import doumeemes.dao.business.BackOrderDetailMapper;
import doumeemes.dao.business.BackorderMapper;
import doumeemes.dao.business.SalaryParamMapper;
import doumeemes.dao.business.dto.CreateMaterialDTO;
import doumeemes.dao.business.dto.CreateWorkorderRecordDTO;
import doumeemes.dao.business.dto.DealWorkorderRecordDTO;
import doumeemes.dao.business.dto.MaterialListDTO;
import doumeemes.dao.business.model.*;
@@ -79,6 +81,8 @@
    private WOutboundRecordExtMapper wOutboundRecordExtMapper;
    @Autowired
    private MaterialExtMapper materialExtMapper;
    @Autowired
    private SalaryParamMapper salaryParamMapper;
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    @Override
@@ -142,9 +146,10 @@
                recordList.add(getWorkrecordModel(user,wStock,mp,materialListDTO.getNum()));
            }
        }
        //批量插入投料记录
        workorderRecordExtMapper.insertBatch(recordList);
        //单添加历史记录(不更新状态)
        //单添加历史记录(判断更新为生产中)
        updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.material);
        return param.getId();
    }
@@ -294,6 +299,13 @@
            order.setStatus(Constants.WORKORDER_STATUS.material);
        }else if(status ==Constants.WORKORDER_HISTORY_STATUS.done){
            order.setStatus(Constants.WORKORDER_STATUS.done);
        }else if(status ==Constants.WORKORDER_HISTORY_STATUS.material){
            //投料操作
            if(Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create)
                    ||Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.material)){
                //如果是已创建或者已备料状态的工单,修改其状态为【生产中】
                order.setStatus(Constants.WORKORDER_STATUS.producing);
            }
        }
        workorderExtMapper.updateById(order);
        workorderHistoryExtMapper.insertBatch(whList);
@@ -381,9 +393,6 @@
            dealAppliancePro(mp,user,allRecordList,updateApplianceList,updateApplianceProList, outboundDetailList,stockList);
        }
        if(1==1){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"123");
        }
        //如果有没bom配置,检查产出(包含检验的不良和报废品)和投料数量是否相等匹配,不一致提示错误
        if(bdparam==null){
@@ -504,6 +513,7 @@
            //如果需要投料的物料集合,在库存中寻找投料来源
            for(WStock model : materialList){
                for(WStock ts : allList){
                    if(Constants.equalsInteger(model.getMaterialId(),ts.getMaterialId())){
                        //还需要投料数量
                        BigDecimal actNum = Constants.formatBigdecimal(model.getNum()).subtract(Constants.formatBigdecimal(model.getTNum()));
@@ -519,6 +529,10 @@
                            //如果已经满足剩余需求量
                            isfull =true;
                        }
                        //添加投料记录
                        workorderRecordExtMapper.insert(getWorkrecordModel(user,ts,mp,actNum));
                        //更新已经投料数量
                        model.setTNum(Constants.formatBigdecimal(model.getTNum()).add(actNum));
                        WOutbound outbound = getFromOutboundList(ts.getWarehouseId(),outboundList);
@@ -971,15 +985,15 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单信息!");
        }
        if(Objects.isNull(dealWorkorderRecordDTO.getDownType())
            ||Objects.isNull(dealWorkorderRecordDTO.getWorkorderId())
            ||Objects.isNull(dealWorkorderRecordDTO.getNum())
                ||Objects.isNull(dealWorkorderRecordDTO.getWorkorderId())
                ||Objects.isNull(dealWorkorderRecordDTO.getNum())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        WorkorderRecord workorderRecord = new WorkorderRecord();
        if(Objects.isNull(dealWorkorderRecordDTO.getRecordId())){
            //查询工单下是否存在对应记录
             workorderRecord = workorderRecordExtMapper.selectOne(new QueryWrapper<WorkorderRecord>()
            workorderRecord = workorderRecordExtMapper.selectOne(new QueryWrapper<WorkorderRecord>()
                    .eq("WORKORDER_ID",dealWorkorderRecordDTO.getWorkorderId())
                    .eq("DONE_TYPE",dealWorkorderRecordDTO.getDownType())
                    .eq("TYPE",Constants.ONE)
@@ -1098,4 +1112,76 @@
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public WorkorderRecord createWorkorderRecord(CreateWorkorderRecordDTO createWorkorderRecordDTO, LoginUserInfo loginUserInfo){
        Workorder workorder  = workorderExtMapper.selectById(createWorkorderRecordDTO.getWorkorderId());
        if(Objects.isNull(workorder)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未查询到该工单信息!");
        }
        if(Objects.isNull(createWorkorderRecordDTO.getUnQualifiedNum())
                ||Objects.isNull(createWorkorderRecordDTO.getUnQualifiedNum())
                ||Objects.isNull(createWorkorderRecordDTO.getWorkorderId())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        BigDecimal num = createWorkorderRecordDTO.getQualifiedNum().add(createWorkorderRecordDTO.getUnQualifiedNum());
        WorkorderRecord workorderRecord = new WorkorderRecord();
        //查询工单下是否存在对应记录
        workorderRecord = workorderRecordExtMapper.selectOne(new QueryWrapper<WorkorderRecord>()
                .eq("WORKORDER_ID",createWorkorderRecordDTO.getWorkorderId())
                .eq("TYPE",Constants.ONE)
                .eq("DELETED",Constants.ZERO)
                .last(" limit 1  ")
        );
        if(!Objects.isNull(workorderRecord)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的该类产出记录已存在!");
        }
        if(num.compareTo(BigDecimal.valueOf(workorder.getPlanNum()))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的产出数量不能大于工单计划数量!");
        }
        //数据存储
        workorderRecord = new WorkorderRecord();
        workorderRecord.setDeleted(Constants.ZERO);
        workorderRecord.setCreateUser(loginUserInfo.getId());
        workorderRecord.setCreateTime(new Date());
        workorderRecord.setNum(num);
        workorderRecord.setRootDepartId(loginUserInfo.getRootDepartment().getId());
        workorderRecord.setDepartId(loginUserInfo.getCurComDepartment().getId());
        workorderRecord.setPlanId(workorder.getPlanId());
        workorderRecord.setWorkorderId(createWorkorderRecordDTO.getWorkorderId());
        workorderRecord.setBatch(workorder.getBatch());
        workorderRecord.setFactoryId(workorder.getFactoryId());
        workorderRecord.setProcedureId(workorder.getProcedureId());
        workorderRecord.setProDate(new Date());
        workorderRecord.setType(Constants.ONE);
        workorderRecord.setMaterialId(workorder.getMaterialId());
        workorderRecord.setUnitId(workorder.getUnitId());
        workorderRecord.setMaterialBatch(workorder.getBatch());
        workorderRecord.setUnqualifiedNum(createWorkorderRecordDTO.getUnQualifiedNum());
        workorderRecord.setQualifiedNum(createWorkorderRecordDTO.getQualifiedNum());
        //计算工资信息
        SalaryParam salaryParam = salaryParamMapper.selectOne(new QueryWrapper<SalaryParam>().eq("DELETED",Constants.ZERO).eq("MATERIAL_ID",workorderRecord.getMaterialId())
                .eq("DEPART_ID",workorderRecord.getFactoryId()).eq("PROCEDURE_ID",workorderRecord.getProcedureId()).last(" limit 1  "));
        if(Objects.isNull(salaryParam)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未配置工资绩效配置!");
        }
        workorderRecord.setSalaryPrice(salaryParam.getSalary());
        workorderRecord.setSalaryType(salaryParam.getType());
        workorderRecord.setSalaryUnqualified(salaryParam.getUnqualified());
        //计件工资
        if(salaryParam.getType().equals(Constants.ZERO)){
            workorderRecord.setSalaryNum(salaryParam.getNum());
            workorderRecord.setSalary(salaryParam.getSalary().multiply(salaryParam.getUnqualified()==Constants.ZERO?num:createWorkorderRecordDTO.getUnQualifiedNum()));
        }else{
            workorderRecord.setDuration(createWorkorderRecordDTO.getDuration());
            workorderRecord.setSalary(BigDecimal.valueOf(createWorkorderRecordDTO.getDuration()).multiply(salaryParam.getSalary()).divide(new BigDecimal(3600)));
        }
        workorderRecordExtMapper.insert(workorderRecord);
        return workorderRecord;
    }
}
server/src/main/java/doumeemes/service/system/SystemLoginService.java
@@ -18,6 +18,7 @@
     * @date 2022/04/18 18:12
     */
    String loginByPassword (LoginDTO dto, HttpServletRequest request);
    String platformLogin(LoginDTO dto, HttpServletRequest request);
    String loginByDingdingCode(Integer companyId ,String code, HttpServletRequest request);
    String loginAutoBylingyangToken(  String token, HttpServletRequest request,boolean isDemo);
server/src/main/java/doumeemes/service/system/WxLoginService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package doumeemes.service.system;
import doumeemes.dao.ext.dto.WxLoginDTO;
import doumeemes.dao.ext.vo.WxLoginVO;
import doumeemes.dao.system.dto.LoginDTO;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 10:13
 */
public interface WxLoginService {
    WxLoginVO wxLogin(String code, HttpServletRequest request);
    String wxLoginByPassword (WxLoginDTO dto, HttpServletRequest request);
}
server/src/main/java/doumeemes/service/system/impl/SystemLoginServiceImpl.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.iflytek.antelope.other.client.dto.resp.UserDTO;
import doumeemes.biz.system.SystemDictDataBiz;
import doumeemes.config.shiro.ShiroToken;
@@ -93,9 +94,10 @@
                throw e;
            }
        }
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false);
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false,false);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
@@ -149,7 +151,7 @@
        }
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false);
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false,false);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
@@ -229,7 +231,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken token = new ShiroToken(companyId,mobile, null,true);
            ShiroToken token = new ShiroToken(companyId,mobile, null,true,false);
            subject.login(token);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
@@ -295,7 +297,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true);
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginUser.getCompanyUser().setName(user.getName());
@@ -366,7 +368,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true);
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginLog.setUserId(loginUser.getId());
@@ -451,7 +453,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true);
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginUser.getCompanyUser().setName(user.getName());
@@ -522,7 +524,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true);
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginUser.getCompanyUser().setName(user.getName());
@@ -554,4 +556,7 @@
        }
    }
}
server/src/main/java/doumeemes/service/system/impl/SystemPermissionServiceImpl.java
@@ -116,7 +116,11 @@
        if(Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
            pageWrap.getModel().setType(Constants.USERTYPE.COM);
        }else{
            pageWrap.getModel().setType(Constants.USERTYPE.PLAT);
            if(pageWrap.getModel().getType()!=null){
                //走查询
            }else{
                pageWrap.getModel().setType(Constants.USERTYPE.PLAT);
            }
        }
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
        return PageData.from(new PageInfo<>(systemPermissionMapper.selectManageList(pageWrap.getModel(), pageWrap.getOrderByClause())));
server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,215 @@
package doumeemes.service.system.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import doumeemes.biz.system.SystemDictDataBiz;
import doumeemes.config.shiro.ShiroToken;
import doumeemes.core.constants.ResponseStatus;
import doumeemes.core.exception.BusinessException;
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.utils.Constants;
import doumeemes.core.utils.HttpsUtil;
import doumeemes.core.utils.Utils;
import doumeemes.dao.business.model.CompanyUser;
import doumeemes.dao.business.model.Department;
import doumeemes.dao.ext.CompanyExtMapper;
import doumeemes.dao.ext.CompanyUserExtMapper;
import doumeemes.dao.ext.DepartmentExtMapper;
import doumeemes.dao.ext.dto.QueryCompanyUserExtDTO;
import doumeemes.dao.ext.dto.WxLoginDTO;
import doumeemes.dao.ext.vo.CompanyUserExtListVO;
import doumeemes.dao.ext.vo.WxLoginVO;
import doumeemes.dao.system.SystemUserMapper;
import doumeemes.dao.system.dto.LoginDTO;
import doumeemes.dao.system.model.SystemLoginLog;
import doumeemes.dao.system.model.SystemUser;
import doumeemes.service.common.CaptchaService;
import doumeemes.service.ext.CompanyExtService;
import doumeemes.service.ext.CompanyUserExtService;
import doumeemes.service.system.SystemLoginLogService;
import doumeemes.service.system.WxLoginService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Objects;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 10:14
 */
@Slf4j
@Service
public class WxLoginServiceImpl implements WxLoginService {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Value("${project.version}")
    private String systemVersion;
    @Autowired
    private CompanyUserExtMapper companyUserExtMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private DepartmentExtMapper departmentExtMapper;
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    /**
     * å¾®ä¿¡å…¬ä¼—号获取TOKEN地址
     */
    public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    /**
     * å¾®ä¿¡å…¬ä¼—号获取USERINFO信息地址
     */
    public static final String GET_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    @Override
    public WxLoginVO wxLogin(String code, HttpServletRequest request) {
        WxLoginVO wxLoginVO = new WxLoginVO();
        String appId = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPID).getCode();
        String appSecret = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPSECRET).getCode();
        String getTokenUrl = GET_ACCESS_TOKEN_URL.replace("CODE", code).replace("APPID", appId).replace("SECRET", appSecret);
        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
        if(Objects.isNull(tokenJson.get("access_token"))){
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),tokenJson.getString("errmsg"));
        }
        String accessToken = tokenJson.getString("access_token");
        String openId = tokenJson.getString("openid");
        String getUserInfoUrl = GET_USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
        JSONObject userInfoJson = JSONObject.parseObject(HttpsUtil.get(getUserInfoUrl,true));
        wxLoginVO.setOpenid(openId);
        wxLoginVO.setUnionid(userInfoJson.getString("unionid"));
        CompanyUser companyUser = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>().eq("openid",openId).last(" limit 1 "));
        if(Objects.isNull(companyUser)){
            wxLoginVO.setLoginStatus(Constants.ONE);
            return wxLoginVO;
        }
        Department department = departmentExtMapper.selectById(companyUser.getRootDepartId());
        if(Objects.isNull(department)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到绑定部门信息");
        }
        SystemUser systemUser = systemUserMapper.selectById(companyUser.getUserId());
        //查询用户数据
        LoginDTO dto = new LoginDTO();
        dto.setCompanyId(department.getCompanyId());
        dto.setUsername(systemUser.getUsername());
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getUsername());
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setIp(Utils.User_Client.getIP(request));
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        loginLog.setPlatform(Utils.User_Client.getPlatform(request));
        loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), null,false,true);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
            loginLog.setUserId(loginUser.getId());
            loginLog.setCompanyId(loginUser.getCompany()!=null?loginUser.getCompany().getId():null);
            loginLog.setCompanyUserId(loginUser.getCompanyUser()!=null?loginUser.getCompanyUser().getId():null);
            loginLog.setSuccess(Boolean.TRUE);
            systemLoginLogService.create(loginLog);
            String session = (String)subject.getSession().getId();
            wxLoginVO.setLoginStatus(Constants.ONE);
            wxLoginVO.setSession(session);
            return wxLoginVO;
        }catch (AuthenticationException e) {
            BusinessException ee = null;
            loginLog.setSuccess(Boolean.FALSE);
            if(e.getCause()!=null && e.getCause() instanceof  BusinessException){
                ee =   (BusinessException)e.getCause();
                loginLog.setReason(ee.getMessage().length() > 200 ? (ee.getMessage().substring(0, 190) + "...") : ee.getMessage());
                log.error(ee.getMessage(), e);
            }else{
                log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
                loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
                ee = new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            }
            systemLoginLogService.create(loginLog);
            throw  ee;
        }
    }
    @Override
    public String wxLoginByPassword(WxLoginDTO dto, HttpServletRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getUsername());
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setIp(Utils.User_Client.getIP(request));
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        loginLog.setPlatform(Utils.User_Client.getPlatform(request));
        loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false,false);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
            loginLog.setUserId(loginUser.getId());
            loginLog.setCompanyId(loginUser.getCompany()!=null?loginUser.getCompany().getId():null);
            loginLog.setCompanyUserId(loginUser.getCompanyUser()!=null?loginUser.getCompanyUser().getId():null);
            loginLog.setSuccess(Boolean.TRUE);
            systemLoginLogService.create(loginLog);
            //登录携带微信openid信息
            if(StringUtils.isNotBlank(dto.getOpenid())){
                CompanyUser companyUser = companyUserExtMapper.selectById(loginLog.getCompanyUserId());
                if(StringUtils.isBlank(companyUser.getOpenid())||!companyUser.getOpenid().equals(dto.getOpenid())){
                    //1、绑定微信openid到companyUser表信息
                    companyUser.setOpenid(dto.getOpenid());
                    companyUser.setUnionid(dto.getUnionid());
                    companyUserExtMapper.updateById(companyUser);
                    //2、清空同用户其余companyUser表openid与 unionid
                    companyUserExtMapper.update(null,new UpdateWrapper<CompanyUser>()
                            .ne("ID",companyUser.getId()).set("UNIONID","").set("OPENID","")
                            .eq("USER_ID",companyUser.getUserId())
                    );
                }
            }
            return (String)subject.getSession().getId();
        }catch (AuthenticationException e) {
            BusinessException ee = null;
            loginLog.setSuccess(Boolean.FALSE);
            if(e.getCause()!=null && e.getCause() instanceof  BusinessException){
                ee =   (BusinessException)e.getCause();
                loginLog.setReason(ee.getMessage().length() > 200 ? (ee.getMessage().substring(0, 190) + "...") : ee.getMessage());
                log.error(ee.getMessage(), e);
            }else{
                log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
                loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
                ee = new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            }
            systemLoginLogService.create(loginLog);
            throw  ee;
        }
    }
}
server/src/main/resources/application.yml
@@ -10,7 +10,7 @@
#  application:
#    name: doumeemes
  profiles:
    active: standardPro
    active: standard
  # JSON返回配置
  jackson:
    # é»˜è®¤æ—¶åŒº
server/src/main/resources/mappers/SalaryParamMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="doumeemes.dao.business.SalaryParamMapper">
    <select id="selectPage" resultType="doumeemes.dao.business.vo.SalaryParamVO">
        SELECT
            sp.*,
            m.`NAME` as materialName,
            m.`CODE` as materialCode,
            p.`NAME` as procedureName,
            su.REALNAME as createUserName
        from
            salary_param sp
        LEFT JOIN procedures p on p.ID = sp.PROCEDURE_ID
        LEFT JOIN material m on m.ID = sp.MATERIAL_ID
        LEFT JOIN `system_user` su  on su.ID = sp.CREATE_USER
        where
        sp.DELETED = 0
        <if test="model.keyWord != null and model.keyWord != ''">
           ( and  p`NAME` like concat('%',#{model.keyWord},'%')
            or   p.`CODE` = #{model.keyWord})</if>
        <if test="model.procedureName != null and model.procedureName != ''"> and p.`NAME` like concat('%',#{model.procedureName},'%')</if>
        <if test="model.type != null"> and sp.`TYPE` = #{model.type}</if>
    </select>
</mapper>
server/src/main/resources/mappers/WorkorderRecordExtMapper.xml
@@ -431,6 +431,62 @@
    </where>
    limit 1
  </select>
  <select id="userSalaryPage" parameterType="doumeemes.dao.ext.dto.QueryUserSalaryListDTO" resultType="doumeemes.dao.ext.vo.UserSalaryListVO">
    select a.WORKORDER_ID,b.`CODE` as workorderCode,c.`NAME` as materialName,c.code as materialCode
    ,d.name as unitName,a.PROCEDURE_ID,f.`NAME` as procedureName,a.CREATE_USER as userId
    ,sum(a.QUALIFIED_NUM) as qualifiedNum
    ,sum(a.UNQUALIFIED_NUM) as unQualifiedNum
    ,sum(a.num) as NUM
    from `workorder_record` a
    left join workorder b on a.WORKORDER_ID=b.id
    left join material_distribute m on b.MATERIAL_ID = m.ID
    left join material c on m.MATERIAL_ID = c.ID
    left join unit d on a.UNIT_ID = d.ID
    left join procedures f on a.PROCEDURE_ID =f.ID
    where a.DELETED = 0
    <if test="rootDepartId != null">
      AND  a.`ROOT_DEPART_ID` = #{rootDepartId}
    </if>
    <if test="procedureId != null">
      AND  a.`PROCEDURE_ID` = #{procedureId}
    </if>
    <if test="materialName != null and materialName !=''">
      AND  (c.`name` like concat('%', #{materialName},'%') or c.`code` like concat('%', #{materialName},'%'))
    </if>
    <if test="startDate != null">
      AND  a.`CREATE_TIME` >= #{startDate}
    </if>
    <if test="endDate != null">
      AND   #{endDate} >= a.`CREATE_TIME`
    </if>
    <if test="userId != null">
      AND  a.`CREATE_USER` = #{userId}
    </if>
    group by  a.`WORKORDER_ID`
    order by a.CREATE_TIME desc
  </select>
  <select id="salaryStatistic" parameterType="doumeemes.dao.ext.dto.QuerySalaryStatisticDTO" resultType="doumeemes.dao.ext.vo.SalaryStatisticsListVO">
    select `CREATE_USER` as userId ,sum(CASE  WHEN salary_type=0 THEN salary ELSE 0 END ) as jijianSalary
    ,sum(CASE  WHEN salary_type=0 THEN  0 ELSE salary  END ) as jishiSalary
    ,count(id) as num
    ,sum(salary) as totalSalary
    from `workorder_record`
    where `DELETED` =0 and `SALARY` >0
    <if test="rootDepartId != null">
      AND  `ROOT_DEPART_ID` = #{rootDepartId}
    </if>
    <if test="userId != null">
      AND  `CREATE_USER` = #{userId}
    </if>
    <if test="startDate != null">
      AND  a.`CREATE_TIME` >= #{startDate}
    </if>
    <if test="endDate != null">
      AND   #{endDate} >= a.`CREATE_TIME`
    </if>
    group by  `CREATE_USER`
   <!-- order by `CREATE_TIME` desc-->
  </select>
  <select id="selectListNew" parameterType="doumeemes.dao.ext.dto.QueryWorkorderRecordExtDTO" resultMap="WorkorderRecordExtListVO">
    SELECT
      `a`.`ID`,
@@ -1427,6 +1483,7 @@
    RELOBJ_TYPE,
    `DURATION`,
    `SALARY`,
    `SALARY_PRICE`,
    `SALARY_NUM`,
    `SALARY_TIMES`,
    `SALARY_UNQUALIFIED`,
@@ -1471,6 +1528,7 @@
            #{item.relobjType},
            #{item.duration},
            #{item.salary},
            #{item.salaryPrice},
            #{item.salaryNum},
            #{item.salaryTimes},
            #{item.salaryUnqualified},
web_standard/.env.development
@@ -18,16 +18,8 @@
# æ±‡æ™º
# VUE_APP_BASE_URL = 'https://106.14.220.133:10012/'
# ä»»åº·æœ¬åœ°
# VUE_APP_BASE_URL = 'http://192.168.0.15:10021/'
# ç„¦æ¾
VUE_APP_BASE_URL = 'http://192.168.0.36:10021/'
VUE_APP_BASE_URL = 'https://dmtest.ahapp.net/doumeeplant_api/'
# VUE_APP_BASE_URL = 'https://dmtest.ahapp.net/doumeeplant_api/'
# VUE_APP_BASE_URL = 'https://hsky.doumee.com/doumeeplant_api/'
# æ±Ÿèæœ¬åœ°
#VUE_APP_BASE_URL = 'http://192.168.0.12:10012/'
# åˆ˜ç£Šç£Šæœ¬åœ°
# VUE_APP_BASE_URL = 'http://192.168.0.18:10012/'
# VUE_APP_BASE_URL = 'http://192.168.0.176:10012/'
# VUE_APP_BASE_URL = 'http://6201h1b706.zicp.fun:19470/'
web_standard/.env.staging
@@ -1,2 +1,11 @@
# æµ‹è¯•环境配置
NODE_ENV = 'production'
# è·¯ç”±æ–¹å¼
VUE_APP_ROUTER_MODE = 'hash'
VUE_APP_CONTEXT_PATH = '/doumeeplant_web'
# æŽ¥å£å‰ç¼€
VUE_APP_API_PREFIX = '/doumeeplant_api'
VUE_APP_BASE_URL = 'https://dmtest.ahapp.net/doumeeplant_api/'
web_standard/package-lock.json
ÎļþÌ«´ó
web_standard/package.json
@@ -38,7 +38,6 @@
    "@vue/cli-service": "~4.5.0",
    "@vue/eslint-config-standard": "^5.1.2",
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-import": "^2.20.2",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^4.2.1",
web_standard/src/App.vue
@@ -10,10 +10,20 @@
</script>
<style lang="scss">
@import "assets/style/lib.css";
// å¼•入全局样式
@import "assets/style/style";
// å¼•入系统内置图标
@import "assets/icons/system/index";
// å¼•入自定义图标
@import "assets/icons/ext/index";
.long-title-style {
  white-space: nowrap;
  text-overflow: ellipsis;
  -webkit-text-overflow: ellipsis;
  overflow: hidden;
}
.el-tooltip__popper.is-dark {
  max-width: 400px;
}
</style>
web_standard/src/assets/js/validate.js
@@ -13,7 +13,7 @@
// ç‰¹æ®Šå­—符交验
export function validateSpecialKey(rule, value, callback) {
  if (!checkSpecialKey(value)) {
    callback(new Error(`只可以输入数字、字母和符号`));
    callback(new Error(`只可以输入数字、字母和英文符号`));
  } else {
    callback();
  }
web_standard/src/assets/style/lib.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
/*-----------------[初始化]--------------*/
*{ font-family: PingFang SC;}
/* æ¸…理浮动 */
.cle:after {visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0;}
.cle:after{zoom:1;}
.clear{clear: both;}
.tc{text-align:center;}
.tl{text-align:left}
.tr{text-align:right}
.fl{float: left;}
.fr{float: right;}
.wp{ width: 94%; margin: 0 auto;}
.w30{ width: 30%;}.w40{ width: 40%;}.w47{ width: 47%;}.w48{ width: 48%;}.w49{ width: 49%;}.w50{ width: 50%;}.w60{ width: 60%;}.w80{ width: 80%;}.w90{ width: 90%;}
.bg_fa{ background-color: #fafafa;}.bg_f2{ background-color: #f2f2f2;}.bg_f1{ background-color: #f1f1f1;}.bg_f5{ background-color: #f5f5f5;}.bg_f6{ background-color: #f6f6f6;}.bg_f7{ background-color: #f7f7f7;}.bg_f8{ background-color: #f8f8f8;}.bg_e{ background-color: #eee;}.bg_d{ background-color: #ddd;}.bg_w{ background-color: #fff;}.bg_3{ background-color: #333;}.bcf{ color: #fff;}.bc3{ color: #333;}.bcc{ color: #ccc;}.bc9{ color: #999;}.bc6{ color: #666;}
.rd4{border-radius: 4px;}.rd5{border-radius: 5px;}.rd6{border-radius: 6px;}.rd8{border-radius: 8px;}.rd10{border-radius: 10px;}.rd15{border-radius: 15px;}.rd20{border-radius: 20px;}.rd30{border-radius: 30px;}.rd40{border-radius: 40px;}.rd50{border-radius: 50px;}.rd60{border-radius: 60px;}.rd70{border-radius: 70px;}.rd80{border-radius: 80px;}.rd90{border-radius: 90px;}.rd100{border-radius: 100px;}.rd120{border-radius: 120px;}.rdhalf{  border-radius:50%}
.ml5{ margin-left: 5px;}.ml10{ margin-left: 10px;}.ml15{ margin-left: 15px;}.ml20{ margin-left: 20px;}.ml25{ margin-left: 25px;}.ml30{ margin-left: 30px;}.ml40{ margin-left: 40px;}.ml50{ margin-left: 50px;}.ml60{ margin-left: 60px;}
.mt5{ margin-top: 5px;}.mt10{ margin-top: 10px;}.mt15{ margin-top: 15px;}.mt20{ margin-top: 20px;}.mt25{ margin-top: 25px;}.mt30{ margin-top: 30px;}.mt35{ margin-top: 35px;}.mt40{ margin-top: 40px;}.mt45{ margin-top: 45px;}.mt50{ margin-top: 50px;}.mt60{ margin-top: 60px;}.mt70{ margin-top: 70px;}.mt80{ margin-top: 80px;}.mt90{ margin-top: 90px;}.mt100{ margin-top:100px;}.mt150{ margin-top:150px;}.mt200{ margin-top:200px;}.mt-20{ margin-top: -20px;}.mt-30{ margin-top: -30px;}.mt-40{ margin-top: -40px;}
.mb5{ margin-bottom: 5px;}.mb10{ margin-bottom: 10px;}.mb15{ margin-bottom: 15px;}.mb20{ margin-bottom: 20px;}.mb25{ margin-bottom: 25px;}.mb30{ margin-bottom: 30px;}.mb40{ margin-bottom: 40px;}.mb50{ margin-bottom: 50px;}.mb60{ margin-bottom: 60px;}.mb80{ margin-bottom: 80px;}
.mr5{ margin-right: 5px;}.mr10{ margin-right: 10px;}.mr15{ margin-right: 15px;}.mr20{ margin-right: 20px;}.mr25{ margin-right: 25px;}.mr30{ margin-right: 30px;}.mr40{ margin-right: 40px;}.mr60{ margin-right: 60px;}.mr80{ margin-right: 80px;}.mr100{ margin-right: 100px;}
.pl10{ padding-left: 10px;}.pl20{ padding-left: 20px;}.pl25{ padding-left: 25px;}.pl30{ padding-left: 30px;}.pl40{ padding-left: 40px;}.pl50{ padding-left: 50px;}.pl60{ padding-left: 60px;}.pl80{ padding-left: 80px;}.pl100{ padding-left: 100px;}
.pr10{ padding-right: 10px;}.pr20{ padding-right: 20px;}.pr25{ padding-right: 25px;}.pr30{ padding-right: 30px;}.pr40{ padding-right: 40px;}.pr50{ padding-right: 50px;}.pr60{ padding-right: 60px;}.pr80{ padding-right: 80px;}.pr100{ padding-right: 100px;}
.pb10{ padding-bottom: 10px;}.pb20{ padding-bottom: 20px;}.pb25{ padding-bottom: 25px;}.pb30{ padding-bottom: 30px;}.pb40{ padding-bottom: 40px;}.pb50{ padding-bottom: 50px;}.pb100{ padding-bottom: 100px;}
.pt10{ padding-top: 10px;}.pt20{ padding-top: 20px;}.pt25{ padding-top: 25px;}.pt30{ padding-top: 30px;}.pt40{ padding-top: 40px;}.pt50{ padding-top: 50px;}.pt100{ padding-top: 100px;}
.plr{ padding-left: 10px; padding-right: 10px;}.plr20{ padding-left: 20px; padding-right: 20px;}.plr25{ padding-left: 25px; padding-right: 25px;}.plr30{ padding-left: 30px; padding-right: 30px;}.plr40{ padding-left: 40px; padding-right: 40px;}.plr50{ padding-left: 50px; padding-right: 50px;}.plr60{ padding-left: 60px; padding-right: 60px;}
.ptb10{padding-bottom: 10px; padding-top: 10px;} .ptb15{padding-bottom: 15px; padding-top: 15px;} .ptb20{padding-bottom: 20px; padding-top: 20px;}.ptb25{padding-bottom: 25px; padding-top: 25px;}.ptb30{padding-bottom: 30px; padding-top: 30px;}.ptb35{padding-bottom: 35px; padding-top: 35px;}.ptb40{padding-bottom: 40px; padding-top: 40px;}.ptb50{padding-bottom: 50px; padding-top: 50px;}.ptb60{padding-bottom: 60px; padding-top: 60px;}.ptb80{padding-bottom: 80px; padding-top: 80px;}.ptb100{padding-bottom: 100px; padding-top: 100px;}.ptb150{padding-bottom: 150px; padding-top: 150px;}.ptb200{padding-bottom: 200px; padding-top: 200px;}
.p5{ padding:5px}.p10{ padding:10px} .p20{ padding:20px}.p30{ padding:30px}.p2030{ padding:20px 30px}.p40{ padding:40px}.p3040{ padding:30px 40px}
.f0{ font-size: 0px;} .f11{ font-size: 11px;}.f12{ font-size: 12px;}.f13{ font-size: 13px;}.f14{ font-size: 14px;}.f16{ font-size: 16px;}.f18{ font-size: 18px;}.f20{ font-size: 20px;}.f26{ font-size: 26px;}.f28{ font-size: 28px;}.f30{ font-size: 30px;}.f32{ font-size: 32px;}.f34{ font-size: 34px;} .f38{ font-size: 38px;}.f40{ font-size: 40px;} .f42{ font-size: 42px;}.f44{ font-size: 44px;}.f48{ font-size: 48px;}.f50{ font-size: 50px;}.f60{ font-size: 60px;}.f64{ font-size: 64px;}.f70{ font-size: 70px;}.f80{ font-size: 80px;}.f90{ font-size: 90px;}.f100{ font-size: 100px;}
.img16{ width: 16px; height: 16px;}
.img20{ width: 20px; height: 20px;}
.img24{ width: 24px; height: 24px;}
.img26{ width: 26px; height: 26px;}
.img30{ width: 30px; height: 30px;}
.img32{ width: 32px; height: 32px;}
.img36{ width: 36px; height: 36px;}
.img40{ width: 40px; height: 40px;}
.img48{ width: 48px; height: 48px;}
.img60{ width: 60px; height: 60px;}
.img66{ width: 66px; height: 66px;}
.img80{ width: 80px; height: 80px;}
.img86{ width: 86px; height: 86px;}
.img90{ width: 90px; height: 90px;}
.img100{ width: 100px; height: 100px;}
.img110{ width: 110px; height: 110px;}
.img120{ width: 120px; height: 120px;}
.img150{ width: 150px; height: 150px;}
.img180{ width: 180px; height: 180px;}
.img200{ width: 200px; height: 200px;}
.imgfull{ width: 100%;}
.rimb{ border-bottom: 1px solid #F1F1F1;}
.rimt{ border-top: 1px solid #F1F1F1;}
.bcover{  background-size: cover; background-position: center center; background-repeat:  no-repeat;}
.bfull{ background-size: 100% 100%; background-position: center center; background-repeat:  no-repeat;}
.b{ font-weight: bold;}
.ibm{ display: inline-block; vertical-align: middle;}
.bbox{ box-sizing: border-box;}
.rauto{ margin-left:auto; margin-right:auto}
.fixedBottom{position: fixed;        left: 0;        bottom: 0;        width: 100%;}
.lh1-6{line-height: 1.6;}
.lh1-6{line-height: 1.6;}
.lh1-8{line-height: 1.8;}
.lh2{line-height: 2;}
.sbtn{ display: inline-block; padding: 0.7em 2em;  border: 1px solid transparent; box-sizing: border-box; text-align: center;}
.mini{ font-size: 18px;}
.med{ font-size: 26px;}
.def{ font-size: 34px;}
.sbtn_w100{ width: 100%; padding-left: 0; padding-right: 0;}
.sbtn_green{ color: #fff; background:#65C35D; }
.sbtn_green_rim{ color: #65C35D; border-color:#65C35D; }
.sbtn_black{ color: #fff; background:#333; }
.sbtn_gray{ color: #333; background:#F7F7F7; }
.sbtn_black_rim{ color: #333; border-color:#eee; }
.sbtn_gray_rim{ color: #999; border-color:#ccc; }
/* flex */
.flex{ display: flex; flex-wrap: wrap; justify-content: space-between;}
.cXY{ display: flex;  align-items: center;justify-content: center;}
.cY{ display: flex; align-items: center;}
.cX{display: flex; justify-content: center}
.rowW{ display: flex; flex-wrap: wrap;}
.bX{ display: flex;   flex-direction: row; justify-content: space-between;}
.bY{ display: flex;   flex-direction:column; justify-content: space-between;}
.bcX{ display: flex; justify-content: space-between; align-items: center;}
.fx1{ flex: 1; overflow: hidden; }
.cAXY{ position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);}
.shadowA{box-shadow: 0 0 5px 0 #ddd;}
.shadowB{ position: relative;}
.shadowB::after{ content: ""; display: block; width: 100%; height: 8px; box-shadow: 0 6px 12px rgba(0,0,0,.08); top: -8px; left: 0; position: absolute; }
.orange{ color: #EA531B;}
.green{ color: #65C35D;}
.blue{ color: #3C77DA;}
.red{ color: #f00;}
.success{ color: #70B603; }
.waring{ color: #F59A23; }
.error{ color: #f00; }
/* /deep/ .uicon-close .u-icon--right{ position: absolute; right: 30px; top: 30px; z-index: 999;} */
.popCloseBtn{ position: absolute; width:50px; height:50px; right: 20px; top: 20px;}
.fixedHeader{ position: absolute; left: 0; top: 0;}
web_standard/src/components/business/OperaCategoryExtWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="分类编码:" prop="code">
        <el-input v-model="form.code" :disabled="form.id" placeholder="可填写,忽略将自动生成" v-trim/>
      </el-form-item>
      <el-form-item label="分类名称:" prop="name">
        <el-input v-model="form.name" placeholder="请输入分类名称" v-trim/>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { getListByType } from '@/api/ext/categoryExt'
import { validateSpecialKey } from '@/assets/js/validate'
export default {
  name: 'OperaCategoryExtWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      // è¡¨å•数据
      form: {
        id: null,
        cateType: 0,
        code: '',
        name: '',
      },
      parent: [],
      // isShow: false,
      // éªŒè¯è§„则
      rules: {
        code: [
          { required: true, message: '请输入分类编码', trigger: 'blur' },
          { max: 10, message: '输入字数不超过10', trigger: 'change' },
          { validator: validateSpecialKey, trigger: 'blur' }
        ],
        name: [
          { max: 10, message: '输入字数不超过10', trigger: 'change' },
          { required: true, message: '请输入分类名称', trigger: 'blur' }
        ]
      }
    }
  },
  computed: {
    isShow: {
      get () {
        return this.form.type !== '0'
      }
    }
  },
  methods: {
    open (title, target, cateType) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
          this.form.cateType = cateType
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.form.cateType = cateType
        // this.form.cateType = parseInt(this.form.cateType)
        // this.getParent()
      })
    },
    changeModel (item) {
      this.getParent()
    },
    getParent () {
      if (!this.isShow) {
        return
      }
      const qurey = '?cateType=' + this.form.cateType + '&' + 'type=' + (this.form.type - 1)
      getListByType(
        qurey
      ).then(res => {
        // console.log(res)
        this.parent = res
      }).catch(err => {
        console.log(err)
      })
    }
  },
  created () {
    this.config({
      api: '/ext/categoryExt',
      'field.id': 'id'
    })
  }
}
</script>
web_standard/src/components/business/OperaWorkPlansWindow.vue
@@ -5,8 +5,8 @@
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="工厂:" prop="factoryId">
    <el-form :model="form" ref="form" label-suffix=":" :rules="rules">
      <el-form-item label="工厂" prop="factoryId">
        <el-select v-model="form.factoryId" placeholder="请选择工厂" :disabled="isEdit" filterable clearable @change="selectFactoey(form.factoryId, false)">
          <el-option
            v-for="item in factories()"
@@ -17,7 +17,7 @@
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="物料信息:" prop="materialId">
      <el-form-item label="物料信息" prop="materialId">
        <!-- @change="selectMaterial(form.materialId, false)" -->
        <el-select v-model="form.materialId" clearable filterable placeholder="请选择">
          <el-option
@@ -28,21 +28,32 @@
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="计划日期:" prop="planDate">
      <el-form-item label="计划开始日期" prop="startDate">
        <el-date-picker
          v-model="form.planDate"
          v-model="form.startDate"
          value-format="yyyy-MM-dd"
          placeholder="请选择计划日期"
          placeholder="请选择计划开始日期"
          :picker-options="pickerOptions"
        ></el-date-picker>
      </el-form-item>
      <el-form-item label="计划数量:" prop="num">
      <el-form-item label="计划结束日期" prop="planDate">
        <el-date-picker
          v-model="form.planDate"
          value-format="yyyy-MM-dd"
          placeholder="请选择计划结束日期"
          :picker-options="pickerOptions"
        ></el-date-picker>
      </el-form-item>
      <el-form-item label="计划数量" prop="num">
        <el-input v-model="form.num" placeholder="请输入" max="10" v-trim/>
      </el-form-item>
      <el-form-item label="生产批次号" prop="batch">
        <el-input v-model="form.batch" placeholder="请输入" max="30" v-trim/>
      </el-form-item>
      <el-form-item label="优先级:" prop="urgent">
      <el-form-item label="销售订单" prop="salesorder">
        <el-input v-model="form.salesorder" placeholder="请输入" v-trim/>
      </el-form-item>
      <el-form-item label="优先级" prop="urgent">
        <el-input v-model="form.urgent" placeholder="请输入" max="4" v-trim/>
      </el-form-item>
    </el-form>
@@ -75,7 +86,9 @@
        num: null,
        batch: null,
        unitId: '',
        startDate: '',
        planDate: '',
        salesorder: '',
        urgent: ''
      },
      materials: [],
@@ -108,6 +121,8 @@
      api: '/business/workPlans',
      'field.id': 'id'
    })
    let tempDate = new Date()
    this.form.startDate = `${tempDate.getFullYear()}-${tempDate.getMonth() + 1}-${tempDate.getDate()}`
    this.pickerOptions.disabledDate = (time) => {
        // ä¸€å¤©
      let tempTime = 3600 * 1000 * 24 
@@ -237,4 +252,7 @@
    }
  }
}
/**
 *
 */
</script>
web_standard/src/components/common/Header.vue
@@ -12,9 +12,10 @@
            <img src="@/assets/images/ic_help@2x.png" alt="" />
            <span>帮助文档</span>
          </div>
          <div style="margin-right: 10px;">企业代码: {{ tempId }}</div>
          <el-dropdown trigger="click" style="margin-right: 20px;" v-userState @command="select">
            <span class="el-dropdown-link">
              {{ tempC }}<i class="el-icon-arrow-down el-icon--right"></i>
            {{ tempC }}<i class="el-icon-arrow-down el-icon--right"></i>
            </span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item v-for="(item, index) in cList" :key="index" :command='item.id'>{{ item.name }}</el-dropdown-item>
@@ -73,6 +74,7 @@
  data () {
    return {
      tempC: '',
      tempId: '',
      cList: '',
      visible: {
        // ä¿®æ”¹å¯†ç 
@@ -127,7 +129,10 @@
    }
  },
  created () {
    this.tempC = this.userInfo.curComDepartment ? this.userInfo.curComDepartment.name : ''
    if (this.userInfo.curComDepartment) {
      this.tempC = this.userInfo.curComDepartment.name
      this.tempId = this.userInfo.curComDepartment.id
    }
    getDepartmentListByConditon({
      type: 0
    })
web_standard/src/components/common/Menu.vue
@@ -2,7 +2,7 @@
  <div class="menu" :class="{collapse: menuData.collapse}">
    <div class="logo">
      <div><img src="@/assets/logo_v2.png"></div>
      <h1 :class="{hidden: menuData.collapse}">{{ rootName() }}</h1>
      <h1 :class="{hidden: menuData.collapse}">DM云工厂</h1>
    </div>
    <scrollbar>
      <!--   :default-openeds="defaultOpeneds"   -->
web_standard/src/components/ext/OperaCompanyUserExtWindow.vue
@@ -45,7 +45,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { treeComList, allList } from '@/api/ext/companyUserExt'
import { validateSpecialKey } from '@/assets/js/validate'
export default {
  name: 'OperaCompanyUserExtWindow',
  extends: BaseOpera,
@@ -71,9 +71,10 @@
          { pattern: /^[0-9]+$/, message: '只可以输入数字', trigger: 'change' }
        ],
        empNo: [
          { required: true, message: '请输入工号', trigger: 'blur' },
          // { required: true, message: '请输入工号', trigger: 'blur' },
          { max: 20, message: '输入字数不超过20', trigger: 'blur' },
          { pattern: /^[0-9a-zA-Z]+$/, message: '只可以输入数字和字母', trigger: 'change' }
          { validator: validateSpecialKey,  message: '只可以输入数字、字母或者英文字符', trigger: 'blur' },
          // { pattern: /^[0-9a-zA-Z]+$/, trigger: 'change' }
        ],
        departmentId: [
          { required: true, message: '请选择部门', trigger: 'blur' }
web_standard/src/components/ext/OperaPlansDetailExtWindow.vue
@@ -49,7 +49,10 @@
              <span v-else style="color: #03AF76;" class="status-log">{{ item.status==1 ? '已备料' : item.status==2 ? '已完工' : item.status==3 ? '已检验' : '已报工' }}</span>
            </div>
          </div>
          <div style="color: #777; font-size: 11px; margin-bottom: 15px;">{{ '生产人员:' + proUserStr(item) }}</div>
          <div class="c3 mt10 mb10 f12" style="display: flex;">
            <div>计划数量:{{ form.num }}</div>
            <div class="ml10">计划开工日期:{{ form.num }}</div>
          </div>
          <div v-if="item.produceDate" class="order-setup">
            <!-- æŠ¥å·¥ä¿¡æ¯ -->
            <div class="line-style">
@@ -59,23 +62,20 @@
            </div>
            <div class="setup-content">
              <div class="left-message">
                <div class="message-title-temp">
                  äº§å‡º
                </div>
                <p class="time-style">
                  {{ item.produceDate }}
                </p>
                <div class="message-title-temp">产出</div>
              </div>
              <div class="right-message">
                <div style="margin-left: 30px">
                  <span style="color:#666;">物料:</span>
              <div class="right-message ml30">
                <div style="display: flex;">
                  <div class="time-style">操作人:{{ item.createUserName }}</div>
                  <div class="time-style ml50">操作时间:{{ item.produceDate }}</div>
                </div>
                <div>
                <div style="display: flex;" class="mt10">
                  <span style="color:#666;">产品:</span>
                  <div v-if="item.qualifiedNum">
                    <span style="color:#03AF76">[合格品] </span>
                    <span style="color:#333333">{{ item.qualifiedNum + (form.umodel && form.umodel.name) }}</span>
                  </div>
                  <div v-if="item.unqualifiedNum">
                  <div v-if="item.unqualifiedNum" class="ml20">
                    <span style="color:#F5A400">[不良品] </span>
                    <span style="color:#333333">{{ item.unqualifiedNum + (form.umodel && form.umodel.name) }}</span>
                  </div>
@@ -95,17 +95,18 @@
                <div :class="item.produceDate ? 'message-title' : 'message-title-temp'">
                  æŠ•æ–™
                </div>
                <p class="time-style">
                  {{ item.materialDate }}
                </p>
              </div>
              <div class="right-message">
                <div style="margin-left: 30px">
                  <span style="color:#666;">物料:</span>
              <div class="right-message ml30">
                <div style="display: flex;">
                  <div class="time-style">操作人:{{ item.createUserName }}</div>
                  <div class="time-style ml50">操作时间:{{ item.materialDate }}</div>
                </div>
                <div>
                  <div v-for="(sItem, sIndex) in item.materialList" :key="sIndex">
                    <span style="color:#333333">{{ sItem.name + ' / ' + sItem.num + sItem.unitName }}</span>
                <div style="display: flex" class="mt10">
                  <div style="color:#666;">物料:</div>
                  <div>
                    <div v-for="(sItem, sIndex) in item.materialList" :key="sIndex">
                      <span style="color:#333333">{{ sItem.name + ' / ' + sItem.num + sItem.unitName }}</span>
                    </div>
                  </div>
                </div>
              </div>
@@ -122,17 +123,17 @@
                <div :class="item.materialDate ? 'message-title' : 'message-title-temp'">
                  åˆ†é…
                </div>
                <p class="time-style">
                  {{ item.distributeDate }}
                </p>
              </div>
              <div class="right-message">
                <div style="margin-left: 30px">
                  <span style="color:#666;">分配数量:</span>
              <div class="right-message ml30">
                <div style="display: flex;">
                  <div class="time-style">操作人:{{ item.createUserName }}</div>
                  <div class="time-style ml50">操作时间:{{ item.distributeDate }}</div>
                </div>
                <div>
                  <span style="color:#333333">{{ item.planNum + (form.umodel && form.umodel.name) }}</span>
                <div class="mt10">
                  <span style="color:#666;">分配数量:{{ item.planNum + (form.umodel && form.umodel.name) }}</span>
                </div>
              </div>
            </div>
          </div>
@@ -341,9 +342,9 @@
      flex: 1;
      // background-color: #f7f7f7;
      display: flex;
      justify-content: space-between;
      .left-message {
        width: 62px;
        display: flex;
        line-height: 20px;
        .message-title {
          color: #333;
          font-weight: 500;
@@ -356,14 +357,11 @@
        }
        .time-style {
          color: #999999;
          font-size: 11px;
          max-lines: 2;
        }
      }
      .right-message {
        flex: 1;
        font-size: 13px;
        display: flex;
        // display: flex;
        flex-direction: row;
      }
    }
web_standard/src/components/ext/OperaProceduresExtWindow.vue
@@ -156,7 +156,7 @@
        // tobescrappedWarehouseId: '',
        iscalculate: 1,
        level: 0,
        needcheck: 0,
        needcheck: 1,
        sortnum: ''
      },
      iscalculates: [
web_standard/src/components/ext/OrderDistrubution.vue
@@ -193,13 +193,13 @@
        return date2
      }
    },
    pickerOptions(data) {
      let time = new Date(data);
      let tempTime = 3600 * 1000 * 24
      return {
       disabledDate: time.getTime() < new Date(data)-tempTime
      }
    }
    // pickerOptions(data) {
    //   let time = new Date(data);
    //   let tempTime = 3600 * 1000 * 24
    //   return {
    //    disabledDate: time.getTime() < new Date(data)-tempTime
    //   }
    // }
  },
  created () {
    this.config({
web_standard/src/components/system/OperaSystemRolePowerWindow.vue
@@ -50,7 +50,7 @@
    open (role) {
      const formData = new FormData()
      formData.append('type', 1)
      formData.append('moduleId', 1)
      // formData.append('moduleId', 1)
      fetchMenuList(formData)
        .then(records => {
          this.role = role
web_standard/src/components/system/menu/MenuSelect.vue
@@ -51,7 +51,7 @@
    fetchData () {
      const formData = new FormData()
      formData.append('type', 1)
      formData.append('moduleId', 1)
      // formData.append('moduleId', 1)
      fetchTree(formData)
        .then(records => {
          this.data = []
web_standard/src/components/system/role/MenuConfigWindow.vue
@@ -61,7 +61,8 @@
      // const formData = new FormData()
      // formData.append('type', role.type)
      // formData.append('moduleId', 1)
      fetchMenuList({ type: type, moduleId: 1 })
      // , moduleId: 1
      fetchMenuList({ type: type })
        .then(records => {
          this.menus = records
          // å¦‚果为固定角色,则固定菜单不可更改
web_standard/src/views/business/badCategory.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,151 @@
<template>
  <TableLayout v-permissions="['ext:categoryext:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form slot="search-form" ref="searchForm" :model="searchForm" label-width="100px" inline>
        <el-form-item label="分类名称:" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <!-- <el-form-item label="分类编码:" prop="code">
        <el-input v-model="searchForm.code" placeholder="请输入" @keypress.enter.native="search"></el-input>
      </el-form-item> -->
      <!-- <el-form-item label="分类类型:" prop="cateType">
        <el-select v-model="searchForm.cateType" clearable filterable placeholder="全部">
          <el-option
            v-for="item in types"
            :key="item.id"
            :value="item.id"
          ></el-option>
        </el-select>
      </el-form-item> -->
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar">
        <li v-permissions="['ext:categoryext:create']"><el-button type="primary" @click="$refs.operaCategoryExtWindow.open('新增分类', null, 3)" >新建</el-button></li>
        <!-- <li v-permissions="['ext:categoryext:importExcel']">
          <ImportButton
            text="导入"
            template-name="category_import_template.xlsx"
            template-path="/template/category_import_template.xlsx"
            action="/ext/categoryExt/importExcel"
            @success="search"
          />
        </li>
        <li><el-button @click="deleteByIdInBatch" v-permissions="['ext:categoryext:delete']" type="danger" plain>删除</el-button></li> -->
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        border
        @selection-change="handleSelectionChange"
      >
        <!-- <el-table-column type="selection" width="55"></el-table-column> -->
        <!-- <el-table-column prop="cateType" label="分类类型" min-width="100px">
          <template slot-scope="{row}">
            {{ cateTypeToStr(row.cateType) }}
          </template>
        </el-table-column>
        <el-table-column prop="type" label="分类属性" min-width="100px">
          <template slot-scope="{row}">
            {{ typeToStr(row.type) }}
          </template>
        </el-table-column> -->
        <el-table-column prop="code" label="分类编码" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="分类名称" min-width="100px"></el-table-column>
        <!-- <el-table-column label="从属分类类型" min-width="100px">
          <template slot-scope="{row}">
            {{ row.pmodel ? typeToStr(row.pmodel.type) : '-' }}
          </template>
        </el-table-column> -->
        <!-- <el-table-column label="从属分类名称" min-width="100px">
           <template slot-scope="{row}">
            {{ row.pmodel ? row.pmodel.name : '-' }}
          </template>
        </el-table-column> -->
        <el-table-column prop="createTime" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column
          label="操作"
          min-width="120"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button v-permissions="['ext:categoryext:update']"  type="text" @click="$refs.operaCategoryExtWindow.open('编辑', row)">编辑</el-button>
            <span v-permissions="['ext:categoryext:delete']" style="margin-left:8px">
              <el-button type="text" @click="deleteById(row)">删除</el-button>
            </span>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      ></pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaCategoryExtWindow ref="operaCategoryExtWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
// import SearchFormCollapse from '@/components/common/SearchFormCollapse'
import Pagination from '@/components/common/Pagination'
import OperaCategoryExtWindow from '@/components/business/OperaCategoryExtWindow'
export default {
  name: 'CategoryExt',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaCategoryExtWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        code: '',
        cateType: '3'
      },
      types: [
        //  0物料 1客户 2工装器具 3不良品
        { name: '物料', id: 0 },
        // { name: '客户', id: 1 },
        // { name: '工装器具', id: 2 },
        { name: '不良原因', id: 3 }
      ]
    }
  },
  created () {
    this.config({
      module: '设置类分类信息表',
      api: '/ext/categoryExt',
      'field.id': 'id',
      'field.main': 'name',
      sorts: [{ direction: 'DESC', property: 'CREATE_TIME' }]
    })
    this.search()
  },
  methods: {
    typeToStr (type) {
      switch (type) {
      case '0': return '大类'
      case '1': return '中类'
      case '2': return '小类'
      default: return '-'
      }
    },
    cateTypeToStr (cateType) {
      for (const item of this.types) {
        // console.log(item.id, parseInt(cateType), item.id === parseInt(cateType))
        if (item.id === parseInt(cateType)) {
          return item.name
        }
      }
    }
  }
}
</script>
web_standard/src/views/business/materialCategory.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
<template>
  <TableLayout v-permissions="['ext:categoryext:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form slot="search-form" ref="searchForm" :model="searchForm" label-width="100px" inline>
        <el-form-item label="分类名称:" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <!-- <el-form-item label="分类编码:" prop="code">
        <el-input v-model="searchForm.code" placeholder="请输入" @keypress.enter.native="search"></el-input>
      </el-form-item> -->
      <!-- <el-form-item label="分类类型:" prop="cateType">
        <el-select v-model="searchForm.cateType" clearable filterable placeholder="全部">
          <el-option
            v-for="item in types"
            :key="item.id"
            :value="item.id"
          ></el-option>
        </el-select>
      </el-form-item> -->
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar">
        <li v-permissions="['ext:categoryext:create']"><el-button type="primary" @click="$refs.operaCategoryExtWindow.open('新增分类', null, 0)" >新建</el-button></li>
        <!-- <li v-permissions="['ext:categoryext:importExcel']">
          <ImportButton
            text="导入"
            template-name="category_import_template.xlsx"
            template-path="/template/category_import_template.xlsx"
            action="/ext/categoryExt/importExcel"
            @success="search"
          />
        </li>
        <li><el-button @click="deleteByIdInBatch" v-permissions="['ext:categoryext:delete']" type="danger" plain>删除</el-button></li> -->
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        border
        @selection-change="handleSelectionChange"
      >
        <!-- <el-table-column type="selection" width="55"></el-table-column> -->
        <!-- <el-table-column prop="cateType" label="分类类型" min-width="100px">
          <template slot-scope="{row}">
            {{ cateTypeToStr(row.cateType) }}
          </template>
        </el-table-column>
        <el-table-column prop="type" label="分类属性" min-width="100px">
          <template slot-scope="{row}">
            {{ typeToStr(row.type) }}
          </template>
        </el-table-column> -->
        <el-table-column prop="code" label="分类编码" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="分类名称" min-width="100px"></el-table-column>
        <!-- <el-table-column label="从属分类类型" min-width="100px">
          <template slot-scope="{row}">
            {{ row.pmodel ? typeToStr(row.pmodel.type) : '-' }}
          </template>
        </el-table-column> -->
        <!-- <el-table-column label="从属分类名称" min-width="100px">
           <template slot-scope="{row}">
            {{ row.pmodel ? row.pmodel.name : '-' }}
          </template>
        </el-table-column> -->
        <el-table-column prop="createTime" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column
          label="操作"
          min-width="120"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button v-permissions="['ext:categoryext:update']"  type="text" @click="$refs.operaCategoryExtWindow.open('编辑', row)">编辑</el-button>
            <span v-permissions="['ext:categoryext:delete']" style="margin-left:8px">
              <el-button type="text" @click="deleteById(row)">删除</el-button>
            </span>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      ></pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaCategoryExtWindow ref="operaCategoryExtWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
// import SearchFormCollapse from '@/components/common/SearchFormCollapse'
import Pagination from '@/components/common/Pagination'
import OperaCategoryExtWindow from '@/components/business/OperaCategoryExtWindow'
export default {
  name: 'CategoryExt',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaCategoryExtWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        cateType: '0'
      },
      types: [
        //  0物料 1客户 2工装器具 3不良品
        { name: '物料', id: 0 },
        // { name: '客户', id: 1 },
        // { name: '工装器具', id: 2 },
        { name: '不良原因', id: 3 }
      ]
    }
  },
  created () {
    this.config({
      module: '设置类分类信息表',
      api: '/ext/categoryExt',
      'field.id': 'id',
      'field.main': 'name',
      sorts: [{ direction: 'DESC', property: 'CREATE_TIME' }]
    })
    this.search()
  },
  methods: {
    typeToStr (type) {
      switch (type) {
      case '0': return '大类'
      case '1': return '中类'
      case '2': return '小类'
      default: return '-'
      }
    },
    cateTypeToStr (cateType) {
      for (const item of this.types) {
        // console.log(item.id, parseInt(cateType), item.id === parseInt(cateType))
        if (item.id === parseInt(cateType)) {
          return item.name
        }
      }
    }
  }
}
</script>
web_standard/src/views/business/workPlans.vue
@@ -55,7 +55,7 @@
        <!-- deleteByIdInBatch -->
        <li><el-button type="danger" @click="deleteByIds" icon="el-icon-delete" v-permissions="['ext:workplans:delete']">批量删除</el-button></li>
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
      <el-table v-loading="isWorking.search" :data="tableData.list" border stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="planCode" label="成品计划编码" min-width="150px">
          <template slot-scope="{row}">
@@ -66,7 +66,8 @@
        </el-table-column>
        <el-table-column prop="materialName" label="物料名称" min-width="100px"></el-table-column>
        <el-table-column prop="materialCode" label="物料编码" min-width="100px"></el-table-column>
        <el-table-column prop="planDate" label="计划日期" min-width="100px"></el-table-column>
        <el-table-column prop="startDate" label="计划开始日期" min-width="100px"></el-table-column>
        <el-table-column prop="planDate" label="计划完成日期" min-width="100px"></el-table-column>
        <el-table-column prop="factoryName" label="工厂" min-width="100px"></el-table-column>
        <el-table-column prop="batch" label="生产批次号" min-width="100px"></el-table-column>
        <el-table-column prop="num" label="计划数量" min-width="100px"></el-table-column>
@@ -81,12 +82,6 @@
            <span v-else-if="row.status == 6">已完工</span>
            <!-- <span v-else-if="row.status == 7">已入库</span> -->
            <span v-else-if="row.status == 8">已关闭</span>
          </template>
        </el-table-column>
        <el-table-column label="暂停" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.paused == 1">是</span>
            <span v-else>否</span>
          </template>
        </el-table-column>
        <el-table-column label="完工数" min-width="100px">
@@ -107,7 +102,27 @@
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column label="发布时间" min-width="100px">
        <el-table-column label="销售订单" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.salesorder">{{ row.salesorder }}</span>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column label="优先级" min-width="80px">
          <template slot-scope="{row}">
            <span v-if="row.urgent">{{ row.urgent }}</span>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column label="暂停" min-width="80px">
          <template slot-scope="{row}">
            {{ row.paused==0?'否':'是' }}
          </template>
        </el-table-column>
        <el-table-column label="发布日期" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.publishDate">{{ row.publishDate }}</span>
            <span v-else>-</span>
web_standard/src/views/ext/plansExt.vue
@@ -104,7 +104,7 @@
        <el-table-column prop="mmodel.name" fixed="left" label="物料名称" show-overflow-tooltip min-width="140px">
          <template slot-scope="{row}">
            <el-button type="text" class="materail" @click="showPlan(row.id)">
              <span class="long-title-style">{{ row.mmodel.name }}</span>
              <div class="long-title-style">{{ row.mmodel.name }}</div>
            </el-button>
          </template>
        </el-table-column>
web_standard/src/views/login.vue
@@ -12,7 +12,6 @@
        <img :src="$store.state.VUE_APP_CONFIG.LOGO" alt="">
      </div>
      <h2>{{ $store.state.VUE_APP_CONFIG.COMPANY_NAME }}</h2>
    </div>
    <div class="login">
      <h1>系统登录&nbsp;/&nbsp;LOGIN IN</h1>
web_standard/src/views/system/menu.vue
@@ -84,7 +84,7 @@
    handlePageChange () {
      const formData = new FormData()
      formData.append('type', 1)
      formData.append('moduleId', 1)
      // formData.append('moduleId', 1)
      this.isWorking.search = true
      fetchTree(formData)
        .then(records => {
web_standard/vue.config.js
@@ -1,17 +1,14 @@
// è¯¦ç»†é…ç½®è¯·å‚考https://cli.vuejs.org/zh/config/#vue-config-js
// const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length - 1)
const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length)
module.exports = {
  publicPath: process.env.VUE_APP_CONTEXT_PATH,
  // publicPath: './',
  outputDir: 'doumeeplant_web',
  // outputDir: 'web',
  outputDir: outputDir || 'web',
  assetsDir: 'static',
  lintOnSave: false,
  devServer: {
    disableHostCheck: true,
    host: '0.0.0.0',
    port: 10086,
    // port: 10086,
    proxy: {
      [process.env.VUE_APP_API_PREFIX]: {
        target: process.env.VUE_APP_BASE_URL,
web_standard/yarn.lock
@@ -1766,7 +1766,7 @@
"ansi-styles@^4.1.0":
  "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
  "resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz"
  "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
  "version" "4.3.0"
  dependencies:
    "color-convert" "^2.0.1"
@@ -2564,7 +2564,7 @@
"chalk@^4.1.0":
  "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
  "resolved" "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz"
  "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
  "version" "4.1.2"
  dependencies:
    "ansi-styles" "^4.1.0"
@@ -2793,7 +2793,7 @@
"color-convert@^2.0.1":
  "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
  "resolved" "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz"
  "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
  "version" "2.0.1"
  dependencies:
    "color-name" "~1.1.4"
@@ -2805,7 +2805,7 @@
"color-name@~1.1.4":
  "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
  "resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
  "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
  "version" "1.1.4"
"color-string@^1.5.4":
@@ -4003,7 +4003,7 @@
  "resolved" "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1620088667316&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz"
  "version" "1.3.0"
"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^5.0.0 || ^6.0.0", "eslint@^6.7.2", "eslint@>= 1.6.0 < 7.0.0", "eslint@>= 4.12.1", "eslint@>=1.6.0 <7.0.0", "eslint@>=4.19.1", "eslint@>=5.0.0", "eslint@>=5.16.0", "eslint@>=6.2.2":
"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^5.0.0 || ^6.0.0", "eslint@>= 1.6.0 < 7.0.0", "eslint@>= 4.12.1", "eslint@>=1.6.0 <7.0.0", "eslint@>=4.19.1", "eslint@>=5.0.0", "eslint@>=5.16.0", "eslint@>=6.2.2":
  "integrity" "sha1-YiYtZylzn5J1cjgkMC+yJ8jJP/s="
  "resolved" "https://registry.nlark.com/eslint/download/eslint-6.8.0.tgz?cache=0&sync_timestamp=1620440445769&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint%2Fdownload%2Feslint-6.8.0.tgz"
  "version" "6.8.0"
@@ -4873,7 +4873,7 @@
"has-flag@^4.0.0":
  "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
  "resolved" "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz"
  "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
  "version" "4.0.0"
"has-symbols@^1.0.1", "has-symbols@^1.0.2":
@@ -6043,9 +6043,9 @@
    "json5" "^1.0.1"
"loader-utils@^2.0.0":
  "integrity" "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A=="
  "resolved" "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.2.tgz"
  "version" "2.0.2"
  "integrity" "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="
  "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz"
  "version" "2.0.4"
  dependencies:
    "big.js" "^5.2.2"
    "emojis-list" "^3.0.0"
@@ -9062,7 +9062,7 @@
"supports-color@^7.1.0":
  "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
  "resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz"
  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
  "version" "7.2.0"
  dependencies:
    "has-flag" "^4.0.0"
@@ -9661,7 +9661,7 @@
"vue-loader-v16@npm:vue-loader@^16.1.0":
  "integrity" "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA=="
  "resolved" "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz"
  "resolved" "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz"
  "version" "16.8.3"
  dependencies:
    "chalk" "^4.1.0"