jiangping
2023-08-18 40609a1bd11ce79445562ac23f16af23a48c3933
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmMes
已添加63个文件
已删除6个文件
已修改45个文件
3963 ■■■■■ 文件已修改
h5_standard/src/components/common/Warehouse.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/components/newCom/quality.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/LogInAgain.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/needToBeDealtWith/addWarehousing.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/needToBeDealtWith/outbound.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/processPlan.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/reportingForWork.vue 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/workOrderReporting.vue 448 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/wxLogin.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/App.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/common/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/components/myTabber.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/main.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages.json 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/applyDetail/applyDetail.vue 602 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/applyList/applyList.vue 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/comApplyList/comApplyList.vue 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/index/index.vue 170 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/login/login.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/mine/mine.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/projectList/projectList.vue 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/uploadCheckData/uploadCheckData.vue 405 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/uploadServiceData/uploadServiceData.vue 477 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/workbench/workbench.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/2@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/3@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ar_black@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/back.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/btn_saoma@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/btn_upload@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/btn_xinzeng@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/chuku_ic_cangku@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/chuku_ic_delete@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/daiban_btn_saoma@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/daiban_ic_daiban@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/daiban_ic_xiaoxi@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/default_404@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/default_loginfailed@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/default_weishouquan@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/diantong_open@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/gon1gdan_ic_saoma@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/gongdan_ic_saoma@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/gongdan_ic_shoudong@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_ar@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_close@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_delete@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_notpass@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_pass@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_pdf@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_play@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_saomiao@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_search@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/ic_shenhe@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/jianyan_ic_saoma@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/loginError.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/login_bg@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/login_ic_code@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/login_ic_password@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/login_ic_phone@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/logo@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_bg@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_ic_bangding@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_ic_change@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_ic_gerenxinxi@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_ic_shoujihao@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_ic_xitonggonggao@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_ic_xiugaimima@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/mine_ic_youxianghao@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_daiban@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_daiban_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_gongzuotai@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_gongzuotai_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_ic_back@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_kanban@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_kanban_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_saoma@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_wode@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/nav_wode_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/notfound.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/password_ic_tip@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/work_ic_guanli@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/static/zhongjian_ic_delete.png 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/store/index.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/util/api/index.js 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/util/request/requestInterceptors.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/util/request/responseInterceptors.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/business/SalaryParamController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroRealm.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/vo/WorkPlansVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/SalaryParamDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/business/impl/DeviceServiceImpl.java 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/business/impl/SalaryParamServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/PlansExtServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkPlansExtServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkorderExtServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/PlansExtMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/SalaryParamMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/WorkorderRecordExtMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/.env.development 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/base/BaseTable.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/business/OperaSalaryParamWindow.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaPlanStaock.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaUserDeviceExtWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaWInboundExtWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaWOutboundExtWindow.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaWrollOutStore.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OrderDistrubution.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/business/salaryParam.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/plansExt.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/salaryStatistic.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/workorderPutRecordExt.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/components/common/Warehouse.vue
@@ -19,7 +19,13 @@
                    @load="onLoad">
                    <div class="content_list">
                        <div class="content_list_item" v-for="(item, i) in list" :key="i" @click="jump(item)">
                            <div class="content_list_item_name">{{item.name}}</div>
                            <div class="content_list_item_name">
                                <span style="color: #03AF76;" v-if="item.tmodel.label == 'APPLIANCE_ONTEST'">[{{ item.tmodel.code }}]</span>
                                <span style="color: #305ED5;" v-if="item.tmodel.label == 'APPLIANCE_MIX'">[{{ item.tmodel.code }}]</span>
                                <span style="color: #F5A400;" v-if="item.tmodel.label == 'APPLIANCE_OFFTEST'">[{{ item.tmodel.code }}]</span>
                                <span style="color: red;" v-if="item.tmodel.label == 'APPLIANCE_USELESS'">[{{ item.tmodel.code }}]</span>
                                <span>{{item.name}}</span>
                            </div>
                        </div>
                    </div>
                </van-list>
@@ -223,7 +229,15 @@
                    margin-right: 10px;
                }
                .content_list_item_name {
                    font-size: 28px;
                    width: 100%;
                    display: flex;
                    align-items: center;
                    span {
                        font-size: 30px;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #222222;
                    }
                }
            }
        }
h5_standard/src/components/newCom/quality.vue
@@ -23,8 +23,7 @@
    let list = ref([
        { name: '合格', id: '0' },
        { name: '不良', id: '1' },
        { name: '报废', id: '2' },
        { name: '混合', id: '3' }
        { name: '报废', id: '2' }
    ])
    // è¿”回上一页带参数
h5_standard/src/views/LogInAgain.vue
@@ -84,20 +84,20 @@
      //   uuid: '0000',
      //   code: '0000'
      // })
      // let res = await testLogin({  // å¤§æ “
      //   username: '18019924213',
      //   password: '123456',
      //   companyId: '1',
      //   uuid: '0000',
      //   code: '0000'
      // })
      let res = await testLogin({ // æ–‡æ­¦
        username: '18656077929',
      let res = await testLogin({  // å¤§æ “
        username: '18019924213',
        password: '123456',
        companyId: '8',
        uuid: '0000',
        code: '0000'
      })
      // let res = await testLogin({ // æ–‡æ­¦
      //   username: '18656077929',
      //   password: '123456',
      //   companyId: '111',
      //   uuid: '0000',
      //   code: '0000'
      // })
      // let res = await testLogin({ // èƒ¡å…‹ä¸œ
      //   username: '17751132561',
      //   password: '123456',
h5_standard/src/views/needToBeDealtWith/addWarehousing.vue
@@ -139,6 +139,7 @@
        {
            batch: '',
            locationId: '',
            locationIdLabel: '',
            locationName: '',
            materialId: '',
            materialName: '',
@@ -165,6 +166,9 @@
    }
    // æ‰“开选择物料
    const openQ = (index: number) => {
        if (list.value[index].locationIdLabel == 'APPLIANCE_ONTEST' || list.value[index].locationIdLabel == 'APPLIANCE_OFFTEST' || list.value[index].locationIdLabel == 'APPLIANCE_USELESS') {
            return
        }
        i.value = index
        qualityShow.value = true
    }
@@ -180,18 +184,19 @@
        locationShow.value = true
    }
    const addItem = () => {
        // if (!form.warehouseId) return Toast('请选择入库仓库')
        if (!form.warehouseId) return Toast('请选择入库仓库')
        list.value.push({
            batch: '',
            locationId: '',
            locationName: '',
            locationIdLabel: list.value[list.value.length - 1].locationIdLabel,
            materialId: '',
            materialName: '',
            num: '',
            procedureId: '',
            procedureName: '',
            qualityType: '',
            qualityTypeName: '',
            qualityType: list.value[list.value.length - 1].qualityType,
            qualityTypeName: list.value[list.value.length - 1].qualityTypeName,
            unitId: '',
            unitName: ''
        })
@@ -301,6 +306,17 @@
                            item.locationId = res.data[0].id
                            item.locationName = res.data[0].unionName
                        })
                        list.value[i.value].locationIdLabel = res.data[0].label
                        if (res.data[0].label === 'APPLIANCE_ONTEST') {
                            list.value[i.value].qualityType = '0'
                            list.value[i.value].qualityTypeName = '合格'
                        } else if (res.data[0].label === 'APPLIANCE_OFFTEST') {
                            list.value[i.value].qualityType = '1'
                            list.value[i.value].qualityTypeName = '不良'
                        } else if (res.data[0].label === 'APPLIANCE_USELESS') {
                            list.value[i.value].qualityType = '2'
                            list.value[i.value].qualityTypeName = '报废'
                        }
                    } else {
                        location.value = true
                        list.value.forEach(item => {
@@ -340,6 +356,19 @@
    const getValue3 = (item: any): void => {
        list.value[i.value].locationId = item.id
        list.value[i.value].locationName = item.unionName
        list.value[i.value].qualityType = ''
        list.value[i.value].qualityTypeName = ''
        list.value[i.value].locationIdLabel = item.label
        if (item.label === 'APPLIANCE_ONTEST') {
            list.value[i.value].qualityType = '0'
            list.value[i.value].qualityTypeName = '合格'
        } else if (item.label === 'APPLIANCE_OFFTEST') {
            list.value[i.value].qualityType = '1'
            list.value[i.value].qualityTypeName = '不良'
        } else if (item.label === 'APPLIANCE_USELESS') {
            list.value[i.value].qualityType = '2'
            list.value[i.value].qualityTypeName = '报废'
        }
        locationShow.value = false
    }
    // é€‰æ‹©å·¥åº
h5_standard/src/views/needToBeDealtWith/outbound.vue
@@ -44,7 +44,7 @@
                        <span>出库货位:{{ item.locationName }}</span>
                        <div class="rework_qd_item_hw_right">
                            <span>数量:</span>
                            <input type="number" v-model="item.num" placeholder="0" />
                            <input type="number" v-model="item.num" @input="changeNum(item)" placeholder="0" />
                            <span>{{ item.unitName }}</span>
                        </div>
                    </div>
@@ -111,7 +111,16 @@
    const onCancel = () => {
        typeShow.value = false
    }
    const changeNum = (obj: any) => {
        if (obj.num < 0) {
            obj.num = ''
            return Toast('出库物料数量必须大于0')
        }
        if (obj.num > obj.total) {
            obj.num = ''
            return Toast('出库物料数量不能大于库存数')
        }
    }
    // èŽ·å–å½“å¤©å¹´æœˆæ—¥
    const getDay = () => {
      var date = new Date();
@@ -127,7 +136,7 @@
        if (!form.warehouseId) return Toast('请选择出库仓库')
        if (list.value.length === 0) return Toast('至少选择一条出库物料')
        for (let i = 0; i < list.value.length; i++) {
            if (!list.value[i].num || list.value[i].num == '' || list.value[i].num == 0) {
            if (!list.value[i].num || list.value[i].num == '' || list.value[i].num <= 0) {
                return Toast(`第${i + 1}个出库物料数量必须大于0`)
            }
            if (list.value[i].num > list.value[i].total) {
@@ -352,7 +361,7 @@
                            color: #333333;
                            background: #FFFFFF;
                            border-radius: 8px;
                            border: 1px solid #CCCCCC;
                            border: 1PX solid #CCCCCC;
                            margin: 0 20px;
                            padding: 0 30px;
                            box-sizing: border-box;
h5_standard/src/views/workOrder/processPlan.vue
@@ -1,5 +1,9 @@
<template>
    <div class="content">
        <div :class="{ 'content_top': status }" class="content_search">
            <v-Search @searchInput="searchInput" @submit="submit" :isShow="false" placeholder="搜索物料名称/编码/工序名称">
            </v-Search>
        </div>
        <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
            <van-list
                v-model:loading="loading"
@@ -48,12 +52,15 @@
</template>
<script setup lang="ts">
    import { reactive, ref, onBeforeUnmount, getCurrentInstance } from "vue"
    import { reactive, ref, onBeforeUnmount, getCurrentInstance, onMounted } from "vue"
    import { useRouter, useRoute } from "vue-router"
    import { getList } from "@/apis/PlanningAPI"
    import { judgmentPlatform } from '@/utils/utils'
    const route = useRoute()
    const router = useRouter()
    let status = ref<boolean>(false)    // æ ¹æ®å¹³å°æ˜¯å¦éœ€è¦è®¾ç½®top
    const { $Bus }  = getCurrentInstance().appContext.config.globalProperties 
@@ -61,7 +68,8 @@
    const pageData = reactive({
        capacity: 10,
        page: 0,
        total: 0
        total: 0,
        name: ''
    })
    // åˆ—表数据
@@ -73,6 +81,23 @@
    const clickItem = (obj: any) => {
        $Bus.emit('callback', obj)
        router.go(-1)
    }
    // æœç´¢æäº¤
    const submit = (): void => {
        pageData.page = 0
        finished.value = false
        listData.value = []
        onLoad()
    }
    // æœç´¢æ¡†
    const searchInput = (data: any) => {
        pageData.name = data
        pageData.page = 0
        finished.value = false
        listData.value = []
        onLoad()
    }
    // åˆ—表
@@ -124,6 +149,10 @@
    onBeforeUnmount(() => {
        $Bus.all.delete("changeOdr")
    })
    onMounted(() => {
        status.value = judgmentPlatform()
    })
</script>
<style lang="scss" scoped>
@@ -132,6 +161,79 @@
        // height: 100%;
        position: absolute;
        background: #F7F7F7;
        .content_top {
            top: 0 !important;
        }
        .content_search {
            padding: 30px;
            background: white;
            box-sizing: border-box;
            position: sticky;
            top: 88px;
            z-index: 9;
            .Search_item {
                margin-bottom: 40px;
                .Search_item_label {
                    font-size: 30px;
                    font-weight: 500;
                    color: #222222;
                }
                .Search_item_content {
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                    margin-top: 30px;
                    .tag {
                        display: flex;
                        flex-wrap: wrap;
                        align-items: center;
                        .tag_active {
                            background: $nav-color !important;
                            color: #ffffff !important;
                        }
                        .tag_item {
                            width: 156px;
                            height: 70px;
                            box-sizing: border-box;
                            background: #F2F2F2;
                            border-radius: 8px;
                            font-size: 26px;
                            font-weight: 400;
                            color: #333333;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            margin-right: 22px;
                            margin-bottom: 22px;
                            &:nth-child(4n) {
                                margin-right: 0;
                            }
                        }
                    }
                    span {
                        font-size: 26px;
                        font-weight: 400;
                        color: #333333;
                    }
                    .Search_item_content_a {
                        width: 308px;
                        height: 70px;
                        background: #F7F7F7;
                        border-radius: 8px;
                        border: 1px solid #EEEEEE;
                        font-size: 26px;
                        font-weight: 400;
                        color: #B2B2B2;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                    }
                }
            }
            .content_search_x {
                height: 24px;
            }
        }
        .content_list {
            width: 100%;
            height: 100%;
h5_standard/src/views/workOrder/reportingForWork.vue
@@ -55,7 +55,7 @@
                        <span>新增投料</span>
                    </div>
                </div>
                <template v-if="wuList.length > 0">
                <template v-if="wuList.length > 0 && !(hasBom == 1 && bomType == 1)">
                    <van-swipe-cell v-for="(item, index) in wuList" :key="index">
                        <div class="bg_list_item_h">
                            <div class="bg_list_item_num">
@@ -82,7 +82,7 @@
                        </template>
                    </van-swipe-cell>
                </template>
                <template v-else>
                <template v-else-if="wuList.length == 0 && !(hasBom == 1 && bomType == 1)">
                    <div class="kong">
                        <span>暂无数据</span>
                    </div>
@@ -104,7 +104,7 @@
                            <span><b>*</b>良品数</span>
                            <div class="bg_list_item_num_item_sr">
                                <input type="number" v-model="from.qualified" @input="changeNum(1)" placeholder="请输入" />
                                <span>块</span>
                                <span v-if="from.processPlan">{{from.processPlan.unitName}}</span>
                            </div>
                        </div>
                    </div>
@@ -113,7 +113,7 @@
                            <span>不良数</span>
                            <div class="bg_list_item_num_item_sr">
                                <input type="number" v-model="from.undesirable" @input="changeNum(2)" placeholder="请输入" />
                                <span>块</span>
                                <span v-if="from.processPlan">{{from.processPlan.unitName}}</span>
                            </div>
                        </div>
                    </div>
@@ -158,7 +158,7 @@
                        <div class="bg_list_item_num_item">
                            <span>工资单价</span>
                            <div class="bg_list_item_num_item_sr">
                                <span class="color1">{{infoBox.salary}}元/{{infoBox.type == 0 ? 'ä»¶' : '时'}}</span>
                                <span class="color1">{{(infoBox.salary / 10 / 10).toFixed(2)}}元/{{infoBox.type == 0 ? 'ä»¶' : '时'}}</span>
                            </div>
                        </div>
                    </div>
@@ -188,7 +188,7 @@
            <div class="bg_footer_submit" @click="submit">提交</div>
        </div>
        <!-- é€‰æ‹©ä¸è‰¯é¡¹ -->
        <van-popup v-model:show="show" round position="bottom" :style="{ height: '53%' }">
        <van-popup v-model:show="show" round position="bottom">
            <div class="bl">
                <div class="bl_head">
                    <img src="@/assets/icon/ic_close@2x.png" style="opacity: 0;" alt="" />
@@ -280,8 +280,7 @@
        text: 'name'
    };
    let userShow = ref(false)
    let userList = ref([])
    let wuList: any = ref([])
    let wuList = ref<Array<any>>([])
    // äº§å‡ºæ•°é‡éªŒè¯
    const changeNum = (type: number) => {
@@ -348,7 +347,10 @@
        } else {
            if (!wuList.value.length === 0) return Toast('投料不能为空')
        }
        if (!from.qualified) return Toast('良品数不能为空')
        if (!from.qualified && !from.undesirable) {
            return Toast('良品数与不良数不能同时为空')
        }
        // if (!from.qualified) return Toast('良品数不能为空')
        // æœ‰ä¸è‰¯æ•°
        if (from.undesirable > 0) {
            if (from.defective.length === 0) return Toast('不良项不能为空')
@@ -357,8 +359,8 @@
        autoWorkReport({
            createWorkorderRecordDTO: {
                duration: from.duration,
                qualifiedNum: from.qualified,
                unQualifiedNum: from.undesirable
                qualifiedNum: from.qualified ? from.qualified : 0,
                unQualifiedNum: from.undesirable ? from.undesirable : 0
            },
            plansId: from.processPlan.id,
            proGroupId: deviceId.value,
@@ -387,43 +389,46 @@
    // é¢„计工资
    const expectedSalary = computed(() => {
        if (!infoBox.value) return 0
        if (!infoBox.value) return 0;
        // æŒ‰ä»¶è®¡ç®—
        if (infoBox.value.type == 0) {
            console.log('计件')
            if (!from.qualified) return 0
            if (infoBox.value.unqualified == 1) {   // æ˜¯å¦è®¡å…¥ä¸è‰¯å“
                let total = Number(from.qualified) + Number(from.undesirable)
                return total * infoBox.value.salary
                return (total * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
            } else {
                return Number(from.qualified) * infoBox.value.salary
                return (Number(from.qualified) * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
            }
        } else {
            console.log('计时')
            if (!from.duration) return 0;
            let h = (from.duration / 60 / 60).toFixed(2)
            return Number(h) * infoBox.value.salary
            return (Number(h) * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
        }
    })
    // è¾¾æ ‡çއ
    const complianceRate = computed(() => {
        if (!infoBox.value) return 0;
        if (!from.qualified) return 0;
        if (!from.qualified && !from.undesirable) return 0;
        if (!from.duration) return 0;
        // æŒ‰ä»¶è®¡ç®—
        // if (infoBox.value.type == 0) {
            // if (infoBox.value.unqualified == 1) {   // æ˜¯å¦è®¡å…¥ä¸è‰¯å“
            if (infoBox.value.unqualified == 1) {   // æ˜¯å¦è®¡å…¥ä¸è‰¯å“
                let a = ((Number(from.qualified) + Number(from.undesirable)) / (from.duration / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return (Number(a) / Number(b)).toFixed(2)
                return ((Number(a) / Number(b)) * 100).toFixed(2) || 0
                // let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / )
                // return total * infoBox.value.salary;
            // } else {
            } else {
                let a = (from.qualified / (from.duration / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return ((Number(a) / Number(b)) * 100).toFixed(2) || 0
            //     return Number(from.qualified) * infoBox.value.salary;
            // }
            }
        // } else {
        //     console.log('按时长')
        // }
@@ -544,7 +549,7 @@
            // èŽ·å–ç±»åž‹
            getIdPlansExt(res.id)
                .then(res2 => {
                    if (res.code === 200) {
                    if (res2.code === 200) {
                        bomType.value = res2.data.bomType
                        hasBom.value = res2.data.hasBom
                    }
@@ -843,7 +848,7 @@
                                    font-size: 28px;
                                    font-weight: 400;
                                    color: #333333;
                                    padding: 0 30px
                                    padding: 0 30px;
                                }
                                .wulll {
                                    width: 400px;
@@ -906,12 +911,15 @@
            }
        }
        .bl {
            width: 100%;
            height: 800px;
            padding: 30px;
            box-sizing: border-box;
            display: flex;
            flex-direction: column;
            .bl_head {
                width: 100%;
                height: 50px;
                display: flex;
                align-items: center;
                justify-content: space-between;
@@ -942,7 +950,7 @@
            }
            .bl_list {
                width: 100%;
                height: 550px;
                height: calc(100% - 168px);
                overflow-y: scroll;
                margin-top: 30px;
                .bl_list_item {
h5_standard/src/views/workOrder/workOrderReporting.vue
@@ -30,6 +30,7 @@
                </div>
                <template v-if="feedingData && feedingData.length > 0">
                    <van-swipe-cell v-for="(item, index) in feedingData" :key="index">
                        <div class="bg_list_item_h">
                        <div class="bg_list_item_num">
                            <div class="bg_list_item_num_item">
                                <!-- <span>{{item.code}}</span> -->
@@ -49,6 +50,8 @@
                                </div>
                            </div>
                        </div>
                        </div>
                        <template #right v-if="proxy.$auth('h5:workorderinput:delete')">
                            <van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'T')" type="danger" />
                        </template>
@@ -70,9 +73,10 @@
                <!-- <template v-if="produceData && produceData.length > 0"> -->
                    <!-- v-for="(item, index) in produceData" :key="index" -->
                    <van-swipe-cell>
                        <div class="bg_list_item_h">
                        <div class="bg_list_item_num">
                            <div class="bg_list_item_num_item">
                                <span>良品数</span>
                                    <span>良品数({{ info.umodel ? info.umodel.name : '' }})</span>
                                <div class="bg_list_item_num_item_sr">
                                    <!-- :disabled="!proxy.$auth('h5:workorderoutput:update')" -->
                                    <!-- @blur="change(item.id, item.num, 'C', item.maxNum, item)" -->
@@ -81,12 +85,14 @@
                                </div>
                            </div>
                        </div>
                        </div>
                    </van-swipe-cell>
                    <van-swipe-cell>
                        <div class="bg_list_item_h">
                        <div class="bg_list_item_num">
                            <!-- @blur="change(item.id, item.num, 'C', item.maxNum, item)" -->
                            <div class="bg_list_item_num_item">
                                <span>不良数</span>
                                    <span>不良数({{ info.umodel ? info.umodel.name : '' }})</span>
                                <div class="bg_list_item_num_item_sr">
                                    <!-- :disabled="!proxy.$auth('h5:workorderoutput:update')" -->
                                    <!-- @blur="change(item.id, item.num, 'C', item.maxNum, item)" -->
@@ -95,23 +101,79 @@
                                </div>
                            </div>
                        </div>
                        </div>
                    </van-swipe-cell>
                    <!-- <van-swipe-cell>
                    <van-swipe-cell v-if="produceFrom.undesirable > 0">
                        <div class="bg_list_item_h">
                        <div class="bg_list_item_num">
                            <div class="bg_list_item_num_item" @click="show = true">
                                <span>不良项</span>
                                <div class="bg_list_item_num_item_sr">
                                    <span>设置 ></span>
                                        <span class="wulll" :style="{color: from.defectiveName ? '#305ED5' : ''}">{{from.defectiveName ? from.defectiveName : '设置'}}</span>
                                        <img src="@/assets/icon/ic_ar@2x.png" alt="" />
                                </div>
                            </div>
                        </div>
                    </van-swipe-cell> -->
                        </div>
                    </van-swipe-cell>
                <!-- </template>
                <template v-else>
                    <div class="kong">
                        <span>暂无数据</span>
                    </div>
                </template> -->
            </div>
            <div class="bg_plan" @click="TimeShow = true">
                <div class="bg_plan_label">
                    <span><b>*</b>报工时长</span>
                </div>
                <div class="bg_plan_label_val">
                    <span :style="{color: from.durationName ? '#333' : ''}">{{from.durationName ? from.durationName : '请选择'}}</span>
                    <img src="@/assets/icon/ic_ar@2x.png" alt="" />
                </div>
            </div>
            <div class="bg_list_item" v-if="infoBox">
                <div class="bg_list_item_top">
                    <div class="bg_list_item_top_left">
                        <div class="bg_list_item_top_left_x"></div>
                        <span>工资绩效</span>
                    </div>
                </div>
                <div class="bg_list_item_h">
                    <div class="bg_list_item_num">
                        <div class="bg_list_item_num_item">
                            <span>计件方式</span>
                            <div class="bg_list_item_num_item_list">
                                <div class="bg_list_item_num_item_list_item active" v-if="infoBox.type == 0">计件</div>
                                <div class="bg_list_item_num_item_list_item active" v-if="infoBox.type == 1">计时</div>
                            </div>
                        </div>
                    </div>
                    <div class="bg_list_item_num">
                        <div class="bg_list_item_num_item">
                            <span>工资单价</span>
                            <div class="bg_list_item_num_item_sr">
                                <span class="color1">{{infoBox.salary / 100}}元/{{infoBox.type == 0 ? 'ä»¶' : '时'}}</span>
                            </div>
                        </div>
                    </div>
                    <div class="bg_list_item_num">
                        <div class="bg_list_item_num_item">
                            <span>预计工资</span>
                            <div class="bg_list_item_num_item_sr">
                                <span class="color1">{{expectedSalary}}元</span>
                            </div>
                        </div>
                    </div>
                    <div class="bg_list_item_num">
                        <div class="bg_list_item_num_item">
                            <span>达标率</span>
                            <div class="bg_list_item_num_item_sr">
                                <span class="color1">{{complianceRate}}%</span>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <!-- <div class="bg_list_item">
                <div class="bg_list_item_top">
@@ -283,35 +345,48 @@
                </div>
            </div>
        </van-popup>
        <!-- æ—¶é—´ -->
        <van-popup v-model:show="TimeShow" round position="bottom" :style="{ height: '50%' }">
            <van-datetime-picker
                v-model="from.time"
                type="time"
                title="选择时间"
                @confirm="onConfirm2"
                @cancel="onCancel2"
            />
        </van-popup>
        <!-- é€‰æ‹©ä¸è‰¯é¡¹ -->
        <van-popup v-model:show="show" round position="bottom" :style="{ height: '53%' }">
        <van-popup v-model:show="show" round position="bottom">
            <div class="bl">
                <div class="bl_head">
                    <span @click="show = false">取消</span>
                    <img src="@/assets/icon/ic_close@2x.png" style="opacity: 0;" alt="" />
                    <span>不良项</span>
                    <span>确认</span>
                    <!-- <span>确认</span> -->
                    <img src="@/assets/icon/ic_close@2x.png" @click="show = false" alt="" />
                </div>
                <div class="bl_list">
                    <div class="bl_list_item" v-for="(item, i) in 12" :key="i">
                    <div class="bl_list_item" v-for="(item, i) in cateList" :key="i" @click="changeChecked(i)">
                        <div class="bl_list_item_left">
                            <input type="checkbox" :checked="true" name="" id="" />
                            <span>有划痕</span>
                            <input type="checkbox" :checked="item.active" />
                            <span>{{ item.name }}</span>
                        </div>
                        <div class="bl_list_item_right">
                            <input type="number" placeholder="请输入" />
                            <input type="number" @click.stop v-model="item.num" placeholder="0" />
                        </div>
                    </div>
                </div>
                <div class="bl_footer" @click="onConfirm3">确认</div>
            </div>
        </van-popup>
    </div>
</template>
<script setup lang="ts">
    import { getCurrentInstance, nextTick, onMounted, ref, reactive } from 'vue'
    import { getCurrentInstance, nextTick, onMounted, ref, reactive, computed } from 'vue'
    import { useRouter, useRoute } from "vue-router"
    import { Dialog, Toast } from 'vant'
    import { REGULAR } from '@/utils/utils'
    import { categoryExtList, queryOne } from '@/apis/PlanningAPI'
    import {
        getBarcodeContent,
        queryById,
@@ -334,6 +409,61 @@
    const router = useRouter()
    const route = useRoute()
    let TimeShow = ref(false)
    let from: any = reactive({
        time: '',
        defective: [],
        defectiveName: ''
    })
    // é¢„计工资
    const expectedSalary = computed(() => {
        if (!infoBox.value) return 0;
        // æŒ‰ä»¶è®¡ç®—
        if (infoBox.value.type == 0) {
            if (!produceFrom.qualified) return 0
            if (infoBox.value.unqualified == 1) {   // æ˜¯å¦è®¡å…¥ä¸è‰¯å“
                let total = Number(produceFrom.qualified) + Number(produceFrom.undesirable)
                return (total * (infoBox.value.salary / 100)).toFixed(2) || 0
            } else {
                return (Number(produceFrom.qualified) * (infoBox.value.salary / 100)).toFixed(2) || 0
            }
        } else {
            if (!from.duration) return 0;
            let h = (from.duration / 60 / 60).toFixed(2)
            return (Number(h) * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
        }
    })
    // è¾¾æ ‡çއ
    const complianceRate = computed(() => {
        if (!infoBox.value) return 0;
        if (!produceFrom.qualified && !produceFrom.undesirable) return 0;
        if (!from.duration) return 0;
        // æŒ‰ä»¶è®¡ç®—
        // if (infoBox.value.type == 0) {
            if (infoBox.value.unqualified == 1) {   // æ˜¯å¦è®¡å…¥ä¸è‰¯å“
                let a = ((Number(from.qualified) + Number(from.undesirable)) / (from.duration / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return (Number(a) / Number(b)).toFixed(2) || 0
                // let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / )
                // return total * infoBox.value.salary;
            } else {
                let a = (produceFrom.qualified / (from.duration / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return (Number(a) / Number(b)).toFixed(2) || 0
                // return Number(from.qualified) * infoBox.value.salary;
            }
        // } else {
        //     console.log('按时长')
        // }
    })
    const loading = ref(false);
    const finished = ref(false);
    let show = ref(false)
@@ -345,13 +475,17 @@
        page: 0
    })
    let infoBox: any = ref(null)     // å·¥èµ„绩效
    // äº§å‡ºåˆæ ¼/不良
    let produceFrom = reactive({
    let produceFrom: any = reactive({
        qualifiedId: '',
        qualified: '',  // åˆæ ¼
        undesirableId: '',
        undesirable: '' // ä¸è‰¯
    })
    let cateList:any = ref([])  // ä¸è‰¯é¡¹
    // è¯¦æƒ…数据
    const info: any = ref({})
@@ -404,6 +538,70 @@
    // æŽ§åˆ¶æŠ¥å·¥ç»Ÿè®¡
    const statistics = ref<boolean>(false)
    const changeChecked = (i: number) => {
        cateList.value[i].active = !cateList.value[i].active
    }
    const getData = () => {
        categoryExtList({
            cateType: "3"
        }).then(res => {
            if (res.code === 200) {
                res.data.forEach((item: any) => {
                    item.active = false
                    item.num = ''
                })
                cateList.value = res.data
            }
        })
    }
    const onConfirm2 = (e: string) => {
        let h = Number(e.substring(0, 2))
        let m = Number(e.substring(3, 5))
        let s = 0
        if (h > 0) {
            s += h * 60 * 60
        }
        if (m > 0) {
            s += m * 60
        }
        from.duration = s
        from.durationName = `${h}小时${m}分钟`
        TimeShow.value = false
    }
    const onCancel2 = () => {
        TimeShow.value = false
    }
    const onConfirm3 = () => {
        let isOpen = false
        cateList.value.forEach((item: any, index: number) => {
            if (item.active) {
                isOpen = true
            }
        })
        if (!isOpen) return Toast('请选择不良项')
        let arr: any = []
        let total: any = 0
        let name: any = ''
        cateList.value.forEach((item: any, index: number) => {
            if (item.active) {
                if (item.num <= 0) {
                    return Toast('不良数量必须大于0')
                }
                total = total += item.num
                arr.push(item)
                name += item.name + item.num + ';'
            }
        })
        if (total !== produceFrom.undesirable) return Toast('不良数必须等于产出不良数')
        from.defective = arr
        from.defectiveName = name
        show.value = false
    }
    // æŠ•料统计
    const tlTotal = (): string => {
        if (feedingData.value.length > 0) {
@@ -419,18 +617,19 @@
    // ä¿®æ”¹äº§å‡º
    const changeCC = (downType: string, num: number, recordId: string) => {
        if (!num) return
        console.log(produceFrom.qualified + produceFrom.undesirable)
        if ((produceFrom.qualified + produceFrom.undesirable) > info.value.planNum) {
            return Toast.fail({ message: '产出数量不能大于计划数量', duration: 2000 })
        }
        if (num >= 0) {
            dealWorkorderRecordStandard({
                downType, num, recordId, workorderId: route.query.id
            }).then(res => {
                if (res.code === 200) {
                    getOrocessRecordCC()
                }
            })
            from.defective = []
            from.defectiveName = ''
            // dealWorkorderRecordStandard({
            //     downType, num, recordId, workorderId: route.query.id
            // }).then(res => {
            //     if (res.code === 200) {
            //         getOrocessRecordCC()
            //     }
            // })
        } else {
            if (downType == 0) {
                produceFrom.qualified = 0
@@ -602,6 +801,17 @@
        queryById(route.query.id).then(res => {
            if (res.code === 200) {
                info.value = res.data
                // èŽ·å–å·¥èµ„ç»©æ•ˆæ•°æ®
                queryOne({
                    deleted: 0,
                    departId: res.data.factoryId,
                    materialId: res.data.materialId,
                    procedureId: res.data.procedureId
                }).then((result: any) => {
                    if (result.code === 200) {
                        infoBox.value = result.data
                    }
                })
            }
        })
    }
@@ -688,7 +898,7 @@
            if (res.code === 200 && type === 'T') {
                getOrocessRecords()
            } else if (res.code === 200 && type === 'C') {
                getOrocessRecordCC()
                // getOrocessRecordCC()
            }
        })
    }
@@ -698,6 +908,10 @@
        if (info.value.bomType === 1) {  // æ‹‰å¼
            console.log('拉式')
            statisticsData.value = []
            if (produceFrom.qualified <= 0) {
                Toast.fail({ message: '产出明细不能为空' })
                return
            }
            if (info.value.hasBom === 0) {
                console.log('无bom')
                // let data: any = [
@@ -853,6 +1067,10 @@
                Toast.fail({ message: '投料明细不能为空' })
                return
            }
            if (produceFrom.qualified <= 0) {
                Toast.fail({ message: '产出明细不能为空' })
                return
            }
            statisticsData.value = []
            if (info.value.hasBom === 0) {
                console.log('无bom')
@@ -976,8 +1194,25 @@
    // ç¡®è®¤æŠ¥å·¥
    const submitBG = () => {
        if (!from.duration || from.duration <= 0) {
            return Toast('报工时长不能为空')
        }
        let createUnqualifiedDTOList = from.defective.map((item: any) => {
            return {
                categoryId: item.id,
                unQualifiedNum: item.num
            }
        })
        let createWorkorderRecordDTO = {
            workorderId: route.query.id,
            duration: from.duration,
            qualifiedNum: produceFrom.qualified ? produceFrom.qualified : 0,
            unQualifiedNum: produceFrom.undesirable ? produceFrom.undesirable : 0
        }
        // id: route.query.id
        comfirmDoneStandard({
            id: route.query.id
            createUnqualifiedDTOList,
            createWorkorderRecordDTO
        }).then(res => {
            if (res.code === 200) {
                Toast.success({ message: '报工成功', forbidClick: true, duration: 2000 })
@@ -992,7 +1227,8 @@
        pageDJs()
        queryByIds()
        getOrocessRecords()
        getOrocessRecordCC()
        getData()
        // getOrocessRecordCC()
    })
</script>
@@ -1002,6 +1238,59 @@
        /*height: 100%;*/
        position: absolute;
        background: #F7F7F7;
        .bg_plan {
            width: 100%;
            // height: 98px;
            padding: 30px;
            box-sizing: border-box;
            background: #FFFFFF;
            margin-bottom: 40px;
            display: flex;
            align-items: center;
            justify-content: space-between;
            span {
                font-size: 30px;
                font-family: PingFangSC-Regular, PingFang SC;
                font-weight: 400;
                color: #222222;
                b {
                    color: red;
                }
            }
            .bg_plan_nr {
                display: flex;
                flex-direction: column;
                span {
                    font-size: 24px;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #666666;
                    margin-top: 20px;
                    &:first-child {
                        font-size: 32px;
                        font-family: PingFangSC-Medium, PingFang SC;
                        font-weight: 500;
                        color: #333333;
                        margin-top: 0 !important;
                    }
                }
            }
            .bg_plan_label_val {
                display: flex;
                align-items: center;
                span {
                    font-size: 28px;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #999999;
                }
                img {
                    width: 12px;
                    height: 24px;
                    margin-left: 20px;
                }
            }
        }
        .details_cz {
            width: 100%;
            padding: 30px;
@@ -1125,11 +1414,22 @@
                        }
                    }
                }
                .bg_list_item_num {
                .bg_list_item_h {
                    width: 100%;
                    background: white;
                    padding: 0 30px;
                    box-sizing: border-box;
                    background: white;
                    .bg_list_item_num {
                        width: 100%;
                        min-height: 98px;
                        background: white;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        border-bottom: 1PX solid #E5E5E5;
                        &:last-child {
                            border: none !important;
                        }
                    .kong {
                        text-align: center;
                        font-size: 25px;
@@ -1137,6 +1437,8 @@
                        background: #ffffff;
                    }
                    .bg_list_item_num_item {
                            width: 100%;
                            height: 100%;
                        display: flex;
                        align-items: center;
                        // height: 118px;
@@ -1146,6 +1448,30 @@
                        border-bottom: 1px solid #E5E5E5;
                        &:last-child {
                            border: none;
                            }
                            .bg_list_item_num_item_list {
                                display: flex;
                                align-items: center;
                                .active {
                                    background: #305ED5 !important;
                                    color: #FFFFFF !important;
                                }
                                .bg_list_item_num_item_list_item {
                                    width: 116px;
                                    height: 62px;
                                    line-height: 62px;
                                    text-align: center;
                                    background: #F2F2F2;
                                    border-radius: 8px;
                                    font-size: 26px;
                                    font-family: PingFangSC-Regular, PingFang SC;
                                    font-weight: 400;
                                    color: #333333;
                                    margin-right: 20px;
                                    &:last-child {
                                        margin: 0 !important;
                                    }
                                }
                        }
                        .bg_list_item_num_item_wl {
                            flex-shrink: 0;
@@ -1169,11 +1495,21 @@
                        .err {
                            color: $nav-stateColor4 !important;
                        }
                            img {
                                width: 12px;
                                height: 24px;
                                margin-left: 20px;
                            }
                        span {
                            flex-shrink: 0;
                            overflow: hidden;
                            text-overflow: ellipsis;
                            white-space: nowrap;
                                b {
                                    font-size: 30px;
                                    color: red;
                                    margin-right: 5px;
                                }
                            .warning {
                                color: $nav-stateColor5 !important;
                                margin-right: 5px;
@@ -1199,6 +1535,12 @@
                            display: flex;
                            align-items: center;
                            justify-content: flex-end;
                                .color1 {
                                    font-size: 28px;
                                    font-family: PingFangSC-Regular, PingFang SC;
                                    font-weight: 400;
                                    color: #333333;
                                }
                            input::-webkit-input-placeholder {
                                font-size: 28px;
                            }
@@ -1214,10 +1556,19 @@
                                color: #333333;
                                padding: 0 30px
                            }
                                .wulll {
                                    width: 400px;
                                    text-align: right;
                                    overflow: hidden;
                                    white-space: nowrap;
                                    text-overflow: ellipsis;
                                }
                            span {
                                font-size: 28px;
                                    font-family: PingFangSC-Regular, PingFang SC;
                                font-weight: 400;
                                color: #666666;
                                    color: #999999;
                                }
                            }
                        }
                    }
@@ -1423,12 +1774,15 @@
            }
        }
        .bl {
            width: 100%;
            height: 800px;
            padding: 30px;
            box-sizing: border-box;
            display: flex;
            flex-direction: column;
            .bl_head {
                width: 100%;
                height: 50px;
                display: flex;
                align-items: center;
                justify-content: space-between;
@@ -1439,21 +1793,38 @@
                        font-size: 32px !important;
                    }
                }
                img {
                    width: 28px;
                    height: 28px;
                }
            }
            .bl_footer {
                width: 100%;
                height: 88px;
                line-height: 88px;
                text-align: center;
                background: #305ED5;
                border-radius: 8px;
                font-size: 32px;
                font-family: PingFangSC-Medium, PingFang SC;
                font-weight: 500;
                color: #FFFFFF;
                margin-top: 30px;
            }
            .bl_list {
                width: 100%;
                height: 580px;
                height: calc(100% - 168px);
                overflow-y: scroll;
                margin-top: 30px;
                .bl_list_item {
                    width: 100%;
                    height: 60px;
                    height: 96px;
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                    margin-bottom: 20px;
                    border-bottom: 1PX solid #E5E5E5;
                    &:last-child {
                        margin-bottom: 0 !important;
                        border: none !important;
                    }
                    .bl_list_item_left {
                        flex: 1;
@@ -1462,6 +1833,7 @@
                        input {
                            width: 30px;
                            height: 30px;
                            border: 1PX solid #CCCCCC;
                            margin: 0 !important;
                        }
                        span {
@@ -1478,9 +1850,19 @@
                            padding-left: 5px;
                            width: 160px;
                            height: 100%;
                            padding: 0 30px;
                            box-sizing: border-box;
                            text-align: right;
                            font-size: 28px;
                            color: #333333;
                            border-radius: 10px;
                            border: 2px solid #999999
                            border: 1PX solid #CCCCCC;
                            &::-webkit-input-placeholder {
                                font-size: 28px;
                                font-family: PingFangSC-Regular, PingFang SC;
                                font-weight: 400;
                                color: #999999;
                            }
                        }
                    }
                }
h5_standard/src/views/wxLogin.vue
@@ -157,6 +157,7 @@
                    input {
                        flex: 1;
                        height: 100%;
                        padding: 0 !important;
                        font-size: 30px;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
minipro_standard/App.vue
@@ -1,6 +1,9 @@
<script>
    console.log('app------');
    // import { pageCount } from '@/util/api/index.js'
    export default {
        onLaunch: function() {
            // pageCount({})
        },
        onShow: function() {
        },
minipro_standard/common/config.js
@@ -1,5 +1,5 @@
module.exports = {
    // baseUrl: 'http://106.14.20.42/test_hfznzz/',
    baseUrl: 'https://hefei.dtkey.cn/test_hfznzz/',
    // baseUrl: 'http://192.168.0.35:10011/',
    // baseUrl: 'https://hefei.dtkey.cn/test_hfznzz/',
    baseUrl: 'https://dmtest.ahapp.net/doumeeplant_api/'
}
minipro_standard/components/myTabber.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
<template>
    <view>
        <u-tabbar
            :value="index"
            @change="change"
            fixed
            activeColor="#222"
            inactiveColor="#666"
        >
            <u-tabbar-item text="待办">
                <view class="" slot="active-icon">
                    <image src="@/static/nav_daiban_sel@2x.png" class="icon-style" mode=""></image>
                </view>
                <view class="" slot="inactive-icon">
                    <image src="@/static/nav_daiban@2x.png" class="icon-style" mode=""></image>
                </view>
            </u-tabbar-item>
            <u-tabbar-item text="工作台">
                <view class="" slot="active-icon">
                    <image src="@/static/nav_gongzuotai_sel@2x.png" class="icon-style" mode=""></image>
                </view>
                <view class="" slot="inactive-icon">
                    <image src="@/static/nav_gongzuotai@2x.png" class="icon-style" mode=""></image>
                </view>
            </u-tabbar-item>
            <u-tabbar-item text="我的">
                <view class="" slot="active-icon">
                    <image src="@/static/nav_wode_sel@2x.png" class="icon-style" mode=""></image>
                </view>
                <view class="" slot="inactive-icon">
                    <image src="@/static/nav_wode@2x.png" class="icon-style" mode=""></image>
                </view>
            </u-tabbar-item>
        </u-tabbar>
    </view>
</template>
<script>
    export default {
        name:"myTabbar",
        props: {
            index: 0
        },
        data() {
            return {
                value: 0
            };
        },
        methods: {
            click(index) {
                // console.log('click', index);
                // this.$nextTick(() => {
                //     this.value = index
                //     if (index==0) {
                //         uni.switchTab({
                //             url: '/pages/index/index'
                //         });
                //     } else if (index== 1) {
                //         uni.switchTab({
                //             url: '/pages/service/service'
                //         });
                //     }else {
                //         uni.switchTab({
                //             url: '/pages/mine/mine'
                //         });
                //     }
                // })
            },
            change(index) {
                this.$nextTick(() => {
                    this.value = index
                })
                console.log(this.value);
                if (index==0) {
                    // console.log('index');
                    uni.switchTab({
                        url: '/pages/index/index'
                    });
                } else if (index== 1) {
                    // console.log('workbench');
                    uni.switchTab({
                        url: '/pages/workbench/workbench'
                    });
                }else {
                    // console.log('mine');
                    uni.switchTab({
                        url: '/pages/mine/mine'
                    });
                }
            }
        },
    }
</script>
<style lang="scss" scope>
.icon-style {
    width: 44rpx;
    height: 44rpx;
}
</style>
minipro_standard/main.js
@@ -1,20 +1,23 @@
import Vue from 'vue'
import App from './App'
// vuex
import store from './store'
import mixin from './common/mixin'
// å¼•入全局uView
import uView from '@/uni_modules/uview-ui'
Vue.use(uView)
// vuex
import store from './store'
Vue.prototype.$store = store
store.dispatch('getHeight')
Vue.config.productionTip = false
App.mpType = 'app'
Vue.use(uView)
console.log(uni.$u);
// #ifdef MP
// å¼•å…¥uView对小程序分享的mixin封装
const mpShare = require('@/uni_modules/uview-ui/libs/mixin/mpShare.js')
@@ -22,13 +25,14 @@
// #endif
Vue.mixin(mixin)
// å¼•入请求封装
const app = new Vue({
    store,
  ...App
})
// å¼•入请求封装
require('./util/request/index')(app)
// èŽ·å–å¾…åŠžæ•°é‡
store.dispatch('getUpcomingNum')
app.$mount()
minipro_standard/pages.json
@@ -1,55 +1,32 @@
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/projectList/projectList",
            "path": "pages/workbench/workbench",
            "style": {
                "navigationBarTitleText": "项目列表",
                // "enablePullDownRefresh": true,
                "navigationStyle": "custom"
                "navigationBarTitleText": "工作台",
                "enablePullDownRefresh": false
            }
        
        },{
        },
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "uni-app",
                "navigationStyle": "custom"
                "navigationBarTitleText": "待办"
            }
        }, {
            "path": "pages/applyList/applyList",
            "path": "pages/mine/mine",
            "style": {
                "navigationBarTitleText": "企业报名列表",
                "enablePullDownRefresh": false,
                "navigationBarBackgroundColor": "#F3F6F9"
            }
        }, {
            "path": "pages/comApplyList/comApplyList",
            "style": {
                "navigationBarTitleText": "企业报名列表",
                "navigationBarTitleText": "我的",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/applyDetail/applyDetail",
            "style": {
                "navigationBarTitleText": "企业报名详情",
        }
        ,{
            "path" : "pages/login/login",
            "style" :
            {
                "navigationBarTitleText": "登录",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        }, {
            "path": "pages/uploadServiceData/uploadServiceData",
            "style": {
                "navigationBarTitleText": "上传服务数据",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/uploadCheckData/uploadCheckData",
            "style": {
                "navigationBarTitleText": "上传诊断数据",
                "enablePullDownRefresh": false
            }
        }
@@ -60,5 +37,31 @@
        "navigationBarBackgroundColor": "#F3F6F9",
        "backgroundColor": "#F3F6F9"
    },
    "tabBar": {
        "color": "#666666",
        "selectedColor": "#222222",
        "borderStyle": "black",
        "backgroundColor": "#fff",
        "list": [
            {
                "pagePath": "pages/index/index",
                "iconPath": "static/nav_daiban@2x.png",
                "selectedIconPath": "static/nav_daiban_sel@2x.png",
                "text": "待办"
            },
            {
                "pagePath": "pages/workbench/workbench",
                "iconPath": "static/nav_gongzuotai@2x.png",
                "selectedIconPath": "static/nav_gongzuotai_sel@2x.png",
                "text": "工作台"
            },
            {
                "pagePath": "pages/mine/mine",
                "iconPath": "static/nav_wode@2x.png",
                "selectedIconPath": "static/nav_wode_sel@2x.png",
                "text": "我的"
            }
        ]
    },
    "uniIdRouter": {}
}
minipro_standard/pages/applyDetail/applyDetail.vue
ÎļþÒÑɾ³ý
minipro_standard/pages/applyList/applyList.vue
ÎļþÒÑɾ³ý
minipro_standard/pages/comApplyList/comApplyList.vue
ÎļþÒÑɾ³ý
minipro_standard/pages/index/index.vue
@@ -1,44 +1,19 @@
<template>
    <view class="content">
        <view class="p40 nav bbox">
            <view class="">合肥市智改数转诊断服务平台</view>
            <view class="">欢迎登录</view>
        </view>
        <view class="p40 mt30">
            <u--input
                placeholder="请输入账号"
                prefixIcon="account"
                clearable
                v-model="form.account"
                prefixIconStyle="font-size: 40rpx;color: #AAAAAA"
            ></u--input>
            <view class="p20"></view>
            <u--input
                placeholder="请输入密码"
                prefixIcon="lock"
                password
                clearable
                v-model="form.password"
                prefixIconStyle="font-size: 40rpx;color: #AAAAAA"
            ></u--input>
            <view class="ptb50"></view>
            <u-button
                :loading="logining"
                type="primary"
                color="#216EEE"
                text="登录"
                size="large"
                @click="loginAction"
            ></u-button>
        </view>
    <view>
        
        <myTabbar :index="0" />
    </view>
</template>
<script>
    // import { coustomLogin, wxEmpower } from '@/util/api/index'
    
    import { coustomLogin, wxEmpower } from '@/util/api/index'
    import myTabbar from "@/components/myTabber.vue"
    export default {
        components: {
            myTabbar
        },
        data() {
            return {
                form: {
@@ -50,100 +25,53 @@
            }
        },
        onLoad() {
            uni.login({
                success: data => {
                    this.wxLogin(data.code)
                },
                fail: err => {
                    uni.$u.toast(err)
                }
            })
            // uni.login({
            //     success: data => {
            //         this.wxLogin(data.code)
            //     },
            //     fail: err => {
            //         uni.$u.toast(err)
            //     }
            // })
        },
        methods: {
            loginAction() {
                if (!this.form.account || !this.form.password) {
                    uni.$u.toast('账号或者密码不能为空')
                }
                this.logining = true
                coustomLogin({...this.form, openid: this.openId})
                    .then(res => {
                        this.$store.commit('SETTOKEN', res.token)
                        this.$store.commit('SETUSERINFO', res)
                        uni.navigateTo({
                            url:'/pages/projectList/projectList'
                        })
                    })
                    .finally(() => {
                        this.logining = false
                    })
            },
            wxLogin(code) {
                wxEmpower({code})
                    .then(res => {
                        this.openId = res.openid
                        if (res.userInfo) {
                            this.$store.commit('SETTOKEN', res.userInfo.token)
                            this.$store.commit('SETUSERINFO', res.userInfo)
                            uni.navigateTo({
                                url:'/pages/projectList/projectList'
                            })
                        }
                    })
                    .catch(err => {
                        uni.$u.toast(err)
                    })
            }
            // loginAction() {
            //     if (!this.form.account || !this.form.password) {
            //         uni.$u.toast('账号或者密码不能为空')
            //     }
            //     this.logining = true
            //     coustomLogin({...this.form, openid: this.openId})
            //         .then(res => {
            //             this.$store.commit('SETTOKEN', res.token)
            //             this.$store.commit('SETUSERINFO', res)
            //             uni.navigateTo({
            //                 url:'/pages/projectList/projectList'
            //             })
            //         })
            //         .finally(() => {
            //             this.logining = false
            //         })
            // },
            // wxLogin(code) {
            //     wxEmpower({code})
            //         .then(res => {
            //             this.openId = res.openid
            //             if (res.userInfo) {
            //                 this.$store.commit('SETTOKEN', res.userInfo.token)
            //                 this.$store.commit('SETUSERINFO', res.userInfo)
            //                 uni.navigateTo({
            //                     url:'/pages/projectList/projectList'
            //                 })
            //             }
            //         })
            //         .catch(err => {
            //             uni.$u.toast(err)
            //         })
            // }
        }
    }
</script>
<style lang="scss" scoped>
    .content {
        // display: flex;
        // flex-direction: column;
        // align-items: center;
        // justify-content: center;
        height: 100vh;
        background-color: #FFFFFF;
        .nav {
            
            width: 750rpx;
            height: 520rpx;
            background: linear-gradient(180deg, #C7EBFF 0%, #FFFFFF 100%);
            display: flex;
            flex-direction: column-reverse;
            color: #293C5B;
            :first-child {
                height: 52rpx;
                font-size: 36rpx;
                line-height: 52rpx;
            }
            :last-child {
                height: 80rpx;
                font-size: 56rpx;
                font-weight: 500;
                line-height: 80rpx;
                margin-bottom: 16rpx;
            }
        }
    }
    .logo {
        height: 200rpx;
        width: 200rpx;
        margin-top: 200rpx;
        margin-left: auto;
        margin-right: auto;
        margin-bottom: 50rpx;
    }
    .text-area {
        display: flex;
        justify-content: center;
    }
    .title {
        font-size: 36rpx;
        color: #8f8f94;
    }
</style>
minipro_standard/pages/login/login.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
<template>
    <view class="login-content plr60">
        <view class="login-bg">
            <image src="@/static/login_bg@2x.png" mode="aspectFill" class="bg-img"></image>
            <image src="@/static/logo@2x.png" mode="aspectFill" class="login-log img180"></image>
            <view class="tc title">DM云工厂</view>
        </view>
        <view class="bg_w rd8 ptb30 pl40 bbox com-input flex input-height">
            <image src="@/static/login_ic_code@2x.png" mode="" class="img40 mr25"></image>
            <u--input placeholder="企业代码" border="none"></u--input>
        </view>
        <view class="bg_w rd8 ptb30 pl40 bbox mt40 flex input-height">
            <image src="@/static/login_ic_phone@2x.png" mode="" class="img40 mr25"></image>
            <u--input placeholder="手机号" border="none"></u--input>
        </view>
        <view class="bg_w rd8 ptb30 pl40 bbox mt40 flex input-height">
            <image src="@/static/login_ic_password@2x.png" mode="" class="img40 mr25"></image>
            <u--input placeholder="密码" border="none"></u--input>
        </view>
        <view class="login-btn mt80">立即登录</view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                bgImg: require('@/static/login_bg@2x.png')
            };
        }
    }
</script>
<style lang="scss" scoped>
.login-content {
    height: 100vh;
    background: #FFFFFF linear-gradient(180deg, rgba(66,117,252,0.2) 0%, rgba(66,117,252,0) 100%);
    .login-bg {
        position: relative;
        height: 812rpx;
        .bg-img {
            position: absolute;
            z-index: 1;
            width: 100%;
            height: 100%;
        }
        .login-log {
            // margin-top: ;
            margin: 356rpx auto 0 auto ;
            left: 0;
            right: 0;
            position: absolute;
        }
        .title {
            position: absolute;
            margin-top: 576rpx;
            left: 0;
            width: 100%;
            height: 60rpx;
            font-size: 44rpx;
            font-weight: 600;
            color: #333333;
            line-height: 60rpx;
        }
    }
    .input-height {
        height: 100rpx;
    }
    .com-input {
        margin-top: -60px;
    }
    .login-btn {
        height: 98rpx;
        background: #4275FC;
        box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(66,117,252,0.2);
        border-radius: 8rpx;
        text-align: center;
        font-size: 32rpx;
        font-weight: 500;
        color: #FFFFFF;
        line-height: 98rpx;
    }
}
</style>
minipro_standard/pages/mine/mine.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
<template>
    <view>
        <myTabbar :index="2" />
    </view>
</template>
<script>
    import myTabbar from "@/components/myTabber.vue"
    export default {
        components: {
            myTabbar
        },
        data() {
            return {
                form: {
                    account: '',
                    password: '',
                },
                logining: false,
                openId: ''
            }
        },
        onLoad() {
            // uni.login({
            //     success: data => {
            //         this.wxLogin(data.code)
            //     },
            //     fail: err => {
            //         uni.$u.toast(err)
            //     }
            // })
        },
        methods: {
            // loginAction() {
            //     if (!this.form.account || !this.form.password) {
            //         uni.$u.toast('账号或者密码不能为空')
            //     }
            //     this.logining = true
            //     coustomLogin({...this.form, openid: this.openId})
            //         .then(res => {
            //             this.$store.commit('SETTOKEN', res.token)
            //             this.$store.commit('SETUSERINFO', res)
            //             uni.navigateTo({
            //                 url:'/pages/projectList/projectList'
            //             })
            //         })
            //         .finally(() => {
            //             this.logining = false
            //         })
            // },
            // wxLogin(code) {
            //     wxEmpower({code})
            //         .then(res => {
            //             this.openId = res.openid
            //             if (res.userInfo) {
            //                 this.$store.commit('SETTOKEN', res.userInfo.token)
            //                 this.$store.commit('SETUSERINFO', res.userInfo)
            //                 uni.navigateTo({
            //                     url:'/pages/projectList/projectList'
            //                 })
            //             }
            //         })
            //         .catch(err => {
            //             uni.$u.toast(err)
            //         })
            // }
        }
    }
</script>
<style lang="scss" scoped>
</style>
minipro_standard/pages/projectList/projectList.vue
ÎļþÒÑɾ³ý
minipro_standard/pages/uploadCheckData/uploadCheckData.vue
ÎļþÒÑɾ³ý
minipro_standard/pages/uploadServiceData/uploadServiceData.vue
ÎļþÒÑɾ³ý
minipro_standard/pages/workbench/workbench.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
<template>
    <view>
        <myTabbar :index="1" />
    </view>
</template>
<script>
    import myTabbar from "@/components/myTabber.vue"
    export default {
        components: {
            myTabbar
        },
        data() {
            return {
            };
        },
        onLoad() {
            uni.hideTabBar()
            // uni.login({
            //     success: data => {
            //         this.wxLogin(data.code)
            //     },
            //     fail: err => {
            //         uni.$u.toast(err)
            //     }
            // })
        },
        methods: {
            // wxLogin(code) {
            //     wxEmpower({code})
            //         .then(res => {
            //             this.openId = res.openid
            //             if (res.userInfo) {
            //                 this.$store.commit('SETTOKEN', res.userInfo.token)
            //                 this.$store.commit('SETUSERINFO', res.userInfo)
            //                 uni.navigateTo({
            //                     url:'/pages/projectList/projectList'
            //                 })
            //             }
            //         })
            //         .catch(err => {
            //             uni.$u.toast(err)
            //         })
            // }
        }
    }
</script>
<style lang="scss">
</style>
minipro_standard/static/2@2x.png
minipro_standard/static/3@2x.png
minipro_standard/static/@2x.png
minipro_standard/static/ar_black@2x.png
minipro_standard/static/back.png
minipro_standard/static/btn_saoma@2x.png
minipro_standard/static/btn_upload@2x.png
minipro_standard/static/btn_xinzeng@2x.png
minipro_standard/static/chuku_ic_cangku@2x.png
minipro_standard/static/chuku_ic_delete@2x.png
minipro_standard/static/daiban_btn_saoma@2x.png
minipro_standard/static/daiban_ic_daiban@2x.png
minipro_standard/static/daiban_ic_xiaoxi@2x.png
minipro_standard/static/default_404@2x.png
minipro_standard/static/default_loginfailed@2x.png
minipro_standard/static/default_weishouquan@2x.png
minipro_standard/static/diantong_open@2x.png
minipro_standard/static/gon1gdan_ic_saoma@2x.png
minipro_standard/static/gongdan_ic_saoma@2x.png
minipro_standard/static/gongdan_ic_shoudong@2x.png
minipro_standard/static/ic_ar@2x.png
minipro_standard/static/ic_close@2x.png
minipro_standard/static/ic_delete@2x.png
minipro_standard/static/ic_notpass@2x.png
minipro_standard/static/ic_pass@2x.png
minipro_standard/static/ic_pdf@2x.png
minipro_standard/static/ic_play@2x.png
minipro_standard/static/ic_saomiao@2x.png
minipro_standard/static/ic_search@2x.png
minipro_standard/static/ic_shenhe@2x.png
minipro_standard/static/jianyan_ic_saoma@2x.png
minipro_standard/static/loginError.png
minipro_standard/static/login_bg@2x.png
minipro_standard/static/login_ic_code@2x.png
minipro_standard/static/login_ic_password@2x.png
minipro_standard/static/login_ic_phone@2x.png
minipro_standard/static/logo@2x.png
minipro_standard/static/mine_bg@2x.png
minipro_standard/static/mine_ic_bangding@2x.png
minipro_standard/static/mine_ic_change@2x.png
minipro_standard/static/mine_ic_gerenxinxi@2x.png
minipro_standard/static/mine_ic_shoujihao@2x.png
minipro_standard/static/mine_ic_xitonggonggao@2x.png
minipro_standard/static/mine_ic_xiugaimima@2x.png
minipro_standard/static/mine_ic_youxianghao@2x.png
minipro_standard/static/nav_daiban@2x.png
minipro_standard/static/nav_daiban_sel@2x.png
minipro_standard/static/nav_gongzuotai@2x.png
minipro_standard/static/nav_gongzuotai_sel@2x.png
minipro_standard/static/nav_ic_back@2x.png
minipro_standard/static/nav_kanban@2x.png
minipro_standard/static/nav_kanban_sel@2x.png
minipro_standard/static/nav_saoma@2x.png
minipro_standard/static/nav_wode@2x.png
minipro_standard/static/nav_wode_sel@2x.png
minipro_standard/static/notfound.png
minipro_standard/static/password_ic_tip@2x.png
minipro_standard/static/work_ic_guanli@2x.png
minipro_standard/static/zhongjian_ic_delete.png
minipro_standard/store/index.js
@@ -1,5 +1,6 @@
import Vue from 'vue'
import Vuex from 'vuex'
import { pageCount } from '@/util/api/index.js'
Vue.use(Vuex) // vue的插件机制
@@ -20,6 +21,11 @@
        menuButtonWidth: menuButtonWidth || '0',
        statusbarHeight: statusbarHeight || '0',
        navHeight: navHeight || '0',
        // å¾…办数量
        upcomingNum: {
            d: 0,
            y: 0
        },
    },
    mutations: {
        setHeight(state, val) {
@@ -37,6 +43,10 @@
        SETUSERINFO(state, val) {
            state.userInfo = val
            uni.setStorageSync('userInfo', val);
        },
        SETNUM(state, val) {
            state.upcomingNum.d = val.d
            state.upcomingNum.y = val.y
        }
    },
    actions: {
@@ -56,6 +66,12 @@
                menuButtonWidth
            })
        },
        async getUpcomingNum() {
            let res = await pageCount({})
            if (res.code === 200) {
                content.commit('SETNUM', { d: res.data.startNum, y: res.data.endNum })
            }
        }
    }
})
minipro_standard/util/api/index.js
@@ -1,51 +1,18 @@
console.log('-----------');
const http = uni.$u.http
// ç™»å½•
export function coustomLogin(params) {
    return http.get('/wechat/ordinaryLogin', {params})
}
// å¾®ä¿¡æŽˆæƒ
export function wxEmpower(params) {
    return http.get('/wechat/wxEmpower', {params})
}
// åˆ†é¡µæŸ¥è¯¢é¡¹ç›®ä¿¡æ¯
export function projectPage(data) {
    return http.post('/wechat/project/page', data)
}
// æ ¹æ®é¡¹ç›®id分页查询企业报名数据
export function getPageByProjectId(data) {
    return http.post('/wechat/getPageByProjectId', data)
}
// æ ¹æ®ID查询报名详情
export function declaresDetail(id) {
    return http.get(`/wechat/declares/${id}`)
}
// æ ¹æ®ID查询报名详情
export function companyDetail(params) {
    return http.get(`/wechat/company/queryDetail`, { params })
}
// æ ¹æ®é¡¹ç›®id分页查询企业报名数据
export function serviceDetail(data) {
    return http.post('/wechat/declares/serviceDetail', data)
}
// æ ¹æ®ç»çº¬åº¦é€†è§£æžåœ°å€
export function getAddrByLatAndLng(params) {
    return http.get(`/wechat/getAddrByLatAndLng`, { params })
}
// æ ¹æ®ç”³æŠ¥ç¼–码查询最后一次核查或诊断数据
export function declareService({id, type}) {
    return http.post(`/wechat/declareService/${id}?type=${type}`)
}
// ä¸Šä¼ æ ¸æŸ¥èµ„æ–™-上传服务资料
export function uploadHCData(data) {
    return http.post(`/wechat/uploadHCData`, data)
// æŸ¥è¯¢ç»Ÿè®¡åˆ—表数量
export function pageCount(data) {
    return http.post('/ext/noticesExt/pageCount', data)
}
// é€€å‡ºç™»å½•
@@ -53,7 +20,3 @@
    return http.get(`/wechat/logout`)
}
// æ ¹æ®ç”³æŠ¥id查看申报进度
export function getDeclareHistoryList(data) {
    return http.post(`/wechat/getDeclareHistoryList`, data)
}
minipro_standard/util/request/requestInterceptors.js
@@ -6,6 +6,7 @@
    // console.log(vm)
    uni.$u.http.interceptors.request.use((config) => { // å¯ä½¿ç”¨async await åšå¼‚步操作
            // åˆå§‹åŒ–请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
            console.log('请求拦截');
            config.data = config.data || {}
            const token = vm.$store.state.token
            if (token) {
minipro_standard/util/request/responseInterceptors.js
@@ -2,7 +2,6 @@
 * å“åº”拦截
 * @param {Object} http 
 */
import { coustomLogin, wxEmpower } from '@/util/api/index'
module.exports = (vm) => {
    uni.$u.http.interceptors.response.use((response) => {
        /* å¯¹å“åº”成功做点什么 å¯ä½¿ç”¨async await åšå¼‚步操作*/
@@ -11,10 +10,11 @@
        const custom = response.config?.custom
        if (data.code !== 200) { // æœåŠ¡ç«¯è¿”å›žçš„çŠ¶æ€ç ä¸ç­‰äºŽ200,则reject()
            uni.$u.toast(data.message)
            if (data.code === 5112) {
            if (data.code === 401) {
                // console.log('未登录、登录失效');
                // æœªç™»å½•、登录失效
                uni.reLaunch({
                    url: '/pages/index/index'
                    url: '/pages/login/login'
                })
            }
            return Promise.reject(data)
server/src/main/java/doumeemes/api/business/SalaryParamController.java
@@ -73,7 +73,7 @@
    @PostMapping("/updateById")
    @RequiresPermissions("business:salaryparam:update")
    public ApiResponse updateById(@RequestBody SalaryParam salaryParam) {
        salaryParamService.updateById(salaryParam);
        salaryParamService.update(salaryParam);
        return ApiResponse.success(null);
    }
server/src/main/java/doumeemes/config/shiro/ShiroRealm.java
@@ -125,11 +125,11 @@
            per.setType(Constants.PlatType.admin);
        }else{
            if(authenticationToken.getCompanyId() == null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,该账户异常!");
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,该账户删除!");
            }
            com = companyExtService.getModelById(authenticationToken.getCompanyId());
            if(com == null){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,该账户异常!");
            if(com == null || Constants.equalsInteger( com.getDeleted(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,该账户异常!请联系管理员");
            }
            if(Constants.equalsInteger( com.getStatus(),Constants.ZERO) ){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,该企业已禁用!");
server/src/main/java/doumeemes/dao/business/vo/WorkPlansVO.java
@@ -68,7 +68,7 @@
    private String planCode;
    @ApiModelProperty(value = "计划完成日期")
    @ExcelColumn(name="计划日期",index = 4,width =15)
    @ExcelColumn(name="计划完成日期",index = 4,width =15)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planDate;
    @ApiModelProperty(value = "计划开始日期")
server/src/main/java/doumeemes/dao/ext/dto/SalaryParamDTO.java
@@ -1,8 +1,11 @@
package doumeemes.dao.ext.dto;
import doumeemes.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
 * @author æ±Ÿè¹„蹄
@@ -21,4 +24,10 @@
    @ApiModelProperty(value = "计价方式  0计件 1计时")
    private Integer type;
    @ApiModelProperty(value = "主组织编码(关联department表根组织)")
    private Integer rootDepartId;
    @ApiModelProperty(value = "工厂编码(关联department表)")
    private Integer departId;
}
server/src/main/java/doumeemes/service/business/impl/DeviceServiceImpl.java
@@ -1,5 +1,6 @@
package doumeemes.service.business.impl;
import com.baomidou.mybatisplus.extension.api.R;
import doumeemes.core.constants.ResponseStatus;
import doumeemes.core.exception.BusinessException;
import doumeemes.core.model.ApiResponse;
@@ -11,13 +12,8 @@
import doumeemes.core.utils.Utils;
import doumeemes.core.utils.excel.EasyExcelUtil;
import doumeemes.core.utils.redis.RedisUtil;
import doumeemes.dao.business.DepartmentMapper;
import doumeemes.dao.business.DeviceMapper;
import doumeemes.dao.business.UserDeviceMapper;
import doumeemes.dao.business.model.CompanyUser;
import doumeemes.dao.business.model.Department;
import doumeemes.dao.business.model.Device;
import doumeemes.dao.business.model.UserDevice;
import doumeemes.dao.business.*;
import doumeemes.dao.business.model.*;
import doumeemes.dao.ext.dto.DeviceImportDTO;
import doumeemes.dao.ext.dto.QueryDeviceExtDTO;
import doumeemes.dao.ext.vo.DeviceExtListVO;
@@ -36,8 +32,8 @@
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
 * ç”Ÿäº§è®¾å¤‡ä¿¡æ¯è¡¨Service实现
@@ -60,6 +56,12 @@
    @Autowired
    private DepartmentMapper departmentMapper;
    @Autowired
    private   ProceduresMapper proceduresMapper;
    @Autowired
    private WarehouseLocationMapper  warehouseLocationMapper;
    @Override
    public Integer create(Device device) {
@@ -251,7 +253,7 @@
            userDeviceMapper.delete(new QueryWrapper<UserDevice>().eq("DEVICE_ID",deviceId));
        }
        if(StringUtils.isNotEmpty(userIds)){
            String [] ids=userIds.split(",");
            String [] ids=userIds.replace(" ","").split("[.,;,]");
            for (String id : ids) {
                CompanyUser companyUser = companyUserService.findById(Integer.valueOf(id));
                UserDevice userDevice = new UserDevice();
@@ -279,7 +281,8 @@
        if(plansList == null || plansList.size()==0){
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!");
        }
        List<String> departName = new ArrayList<>();
        List<String> procedureName = new ArrayList<>();
        plansList.forEach(s->{
            if (StringUtils.isBlank(s.getDeviceName())
@@ -290,14 +293,53 @@
                    || StringUtils.isBlank(s.getFinishWarehouseLocationName())){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"导入数据内容有误");
            }
            departName.add(s.getDepartName());
            procedureName.add(s.getProcedureName());
        });
        QueryWrapper<Department> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(Department::getRootId,user.getRootDepartment().getId());
        departmentMapper.selectList(wrapper);
        plansList.forEach(s->{
            QueryWrapper<Department> wrapper = new QueryWrapper<>();
            wrapper.lambda()
                    .eq(Department::getRootId,user.getRootDepartment().getId())
                    .eq(Department::getName,departName)
                    .last("limit 1");
            Department department = departmentMapper.selectOne(wrapper);
            if(Objects.isNull(department)){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"工厂名称不存在");
            }
            QueryWrapper<Procedures> proceduresQuery = new QueryWrapper<>();
            proceduresQuery.lambda()
                    .eq(Procedures::getRootDepartId,user.getRootDepartment().getId())
                    .eq(Procedures::getDepartId,department.getId())
                    .eq(Procedures::getName,s.getProcedureName());
            Procedures procedures = proceduresMapper.selectOne(proceduresQuery);
            if(Objects.isNull(procedures)){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"工序名称已存在");
            }
            QueryDeviceExtDTO queryDeviceExtDTO=new QueryDeviceExtDTO();
            queryDeviceExtDTO.setDeleted(Constants.ZERO);
            queryDeviceExtDTO.setCode(s.getDeviceCode());
            queryDeviceExtDTO.setRootDepartId(user.getRootDepartment().getId());
            List<DeviceExtListVO> list= deviceExtService.getListByCondition(queryDeviceExtDTO);
            if(list.size() > 0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"设备编码不存在");
            }
            QueryWrapper<WarehouseLocation> warehouseLocationQuery = new QueryWrapper<>();
            warehouseLocationQuery.lambda()
                                    .eq(WarehouseLocation::getRootDepartId,department.getRootId())
                                    .eq(WarehouseLocation::getUnionName
                                            ,Arrays.asList(s.getFinishWarehouseLocationName(),s.getProduceWarehouseLocationName()));
            if(Objects.equals(list.size(),2)){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"库位信息已存在");
            }
            List<WarehouseLocation> warehouseLocations = warehouseLocationMapper.selectList(warehouseLocationQuery);
            Map<String, WarehouseLocation> collect = warehouseLocations.stream().collect(Collectors.toMap(w -> w.getUnionName(), w -> w));
            Device device = new Device();
            device.setDeleted(Constants.ZERO);
@@ -306,24 +348,26 @@
            device.setUpdateUser(user.getId());
            device.setUpdateTime(new Date());
//            device.setRemark();
//            device.setRootDepartId();
//            device.setDepartId();
//            device.setProcedureId();
//            device.setCode();
//            device.setType();
//            device.setName();
//            device.setModel();
//            device.setStatus();
            device.setRootDepartId(department.getRootId());
            device.setDepartId(procedures.getId());
            device.setProcedureId(procedures.getId());
            device.setCode(StringUtils.isNotBlank(device.getCode()) ? device.getCode() : this.getNextCode(user.getCompany().getId()));
            device.setType(StringUtils.isNotBlank(device.getCode()) ? device.getCode().trim().equals("设备") ? 1 : 0 : 1);
            device.setName(s.getDeviceName());
            device.setModel(s.getModel());
            device.setStatus(Constants.ZERO);
//            device.setSupplier();
//            device.setStationCode();
            device.setStationCode(s.getStationCode());
//            device.setGroupId();
//            device.setSerialNum();
//            device.setProduceWarehouseLocationId();
//            device.setProduceWarehouseId();
//            device.setFinishWarehouseLocationId();
//            device.setFinishWarehouseId();
//            device.setUserIds();
            device.setProduceWarehouseLocationId(collect.get(s.getProduceWarehouseLocationName()).getId());
            device.setFinishWarehouseLocationId(collect.get(s.getFinishWarehouseLocationName()).getId());
            deviceMapper.insert(device);
            if(StringUtils.isNotBlank(s.getUserIds())){
                this.dealDeviceUserId(Constants.ZERO,device.getUserIds().trim(),device.getId(),user);
            }
        });
    }
server/src/main/java/doumeemes/service/business/impl/SalaryParamServiceImpl.java
@@ -59,7 +59,7 @@
        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        SalaryParam insert = new SalaryParam();
        insert.setRootDepartId(salaryParam.getRootDepartId());
        insert.setRootDepartId(principal.getRootDepartment().getId());
        insert.setDepartId(salaryParam.getDepartId());
        insert.setProcedureId(salaryParam.getProcedureId());
        insert.setMaterialId(salaryParam.getMaterialId());
@@ -117,7 +117,7 @@
//                .set(SalaryParam::getDepartId,salaryParam.getDepartId())
//                .set(SalaryParam::getMaterialId,salaryParam.getMaterialId())
//                .set(SalaryParam::getProcedureId,salaryParam.getProcedureId())
                .set(SalaryParam::getSalary,salaryParam.getSalary().divide(new BigDecimal(100)))
                .set(SalaryParam::getSalary,salaryParam.getSalary().multiply(new BigDecimal(100)))
                .set(SalaryParam::getNum,salaryParam.getNum())
                .set(SalaryParam::getTimes,salaryParam.getTimes())
                .set(SalaryParam::getUnqualified,salaryParam.getUnqualified());
@@ -155,7 +155,10 @@
    @Override
    public PageData<SalaryParamVO> findPage(PageWrap<SalaryParamDTO> pageWrap) {
        IPage<SalaryParam> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        SalaryParamDTO model = pageWrap.getModel();
        model.setRootDepartId(principal.getRootDepartment().getId());
//        model.setDepartId(principal.getComDepartment().getId());
        IPage<SalaryParamVO> salaryParamVOIPage = salaryParamMapper.selectPage(page, model);
        if (!CollectionUtils.isEmpty(salaryParamVOIPage.getRecords())){
            salaryParamVOIPage.getRecords().forEach(s->s.setSalary(s.getSalary().divide(new BigDecimal(100))));
server/src/main/java/doumeemes/service/ext/impl/PlansExtServiceImpl.java
@@ -661,6 +661,8 @@
        order.setUrgent(mp.getUrgent());
        order.setFactoryId(mp.getFactoryId());
        order.setBackorderId(mp.getBackorderId());
        order.setUnqualifiedNum(param.getUnqualifiedNum());
        order.setQualifiedNum(param.getQualifiedNum());
        order.setOriginId(systemDictDataBiz.queryByCode(Constants.WORKORDER_SOURCE,Constants.WORKORDER_SOURCE_PLAN).getId());
        //工单编码
        order.setCode(workorderExtService.getNextCode(user.getCompany().getId()));
@@ -1617,7 +1619,7 @@
        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(),"参数错误:超出工单剩余可分配数量");
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"超出当前工序计划可报工数量");
        }
        Workorder param = new Workorder();
        param.setPlanId(autoWorkReportDTO.getPlansId());
@@ -1626,6 +1628,8 @@
        param.setProUserList(autoWorkReportDTO.getProUserList());
        param.setPlanNum(num.intValue());
        //生成工单信息
        param.setUnqualifiedNum(autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum().intValue());
        param.setQualifiedNum(autoWorkReportDTO.getCreateWorkorderRecordDTO().getQualifiedNum().intValue());
        Workorder workorder = this.distributeDone(user,param,num.intValue());
        //工单投料记录
        CreateMaterialDTO createMaterialDTO = new CreateMaterialDTO();
server/src/main/java/doumeemes/service/ext/impl/WorkPlansExtServiceImpl.java
@@ -384,7 +384,7 @@
        if(p.getPlanDate() == null){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【计划结束日期】数据错误,正确格式为:yyyy-MM-dd(如2022-06-07)!");
        }
        if(p.getPlanDate().getTime() <= p.getStartDate().getTime()){
        if(p.getPlanDate().getTime() < p.getStartDate().getTime()){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【计划开始日期】要早于【计划结束日期】!");
        }
        if(StringUtils.isBlank(p.getMaterialCode())){
@@ -398,7 +398,7 @@
        }
        Date pDate = DateUtil.getDateFromString(DateUtil.getShortTime(p.getPlanDate()) +" 00:00:00");
        Date nDate =  DateUtil.getDateFromString(DateUtil.getShortTime(DateUtil.getCurrentDate()) +" 00:00:00");
        Date nDate =  DateUtil.getDateFromString(DateUtil.getShortTime(DateUtil.getCurrentDate()) +" 23:59:59");
        if( nDate.getTime() > pDate.getTime()){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,计划生产日期必须为今天以后的日期!");
        }
server/src/main/java/doumeemes/service/ext/impl/WorkorderExtServiceImpl.java
@@ -755,7 +755,7 @@
     * @param param
     */
    @Override
    @Async
//    @Async
    public void statisticNum(Workorder param){
        if(param.getPlanId()== null){
            if(param.getId()== null){
@@ -828,14 +828,10 @@
                            && item.getOmodel()!=null
                            && (Constants.equalsInteger(item.getOmodel().getStatus() ,Constants.WORKORDER_STATUS.baogong)
                            ||Constants.equalsInteger(item.getOmodel().getStatus() ,Constants.WORKORDER_STATUS.instock))){
                            //如果是产出
                            if(Constants.equalsInteger(item.getDoneType(),Constants.ZERO)){
                                //如果是合格产出,累计数量
                                qulifiedNum += Constants.formatBigdecimal(item.getNum()).intValue();
                            }else{
                            qulifiedNum += Constants.formatBigdecimal(BigDecimal.valueOf(item.getQualifiedNum())).intValue();
                                //如果是不良产出,累计数量
                                unqulifiedNum += Constants.formatBigdecimal(item.getNum()).intValue();
                            }
                            unqulifiedNum += Constants.formatBigdecimal(BigDecimal.valueOf(item.getUnqualifiedNum())).intValue();
                        }
                    }
                }
@@ -858,7 +854,7 @@
            if(!Objects.isNull(plan.getWorkPlansId())){
                //更新主订单数据信息
               if(plansMapper.selectCount(new QueryWrapper<Plans>()
                        .in("STATUS",0,1,4)
                        .in("STATUS",0,1,4,5)
                        .eq("DELETED",Constants.ZERO)
                        .ne("id",p.getId())
                        .eq("WORK_PLANS_ID",plan.getWorkPlansId()))<=Constants.ZERO){
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java
@@ -705,8 +705,12 @@
            List<WOutbound> outboundList = new ArrayList<>();
            //如果需要投料的物料集合,在库存中寻找投料来源
            for(WStock model : materialList){
                List<WStock> useList = allList.stream().filter(wStock -> Constants.equalsInteger(model.getMaterialId(),wStock.getMaterialId())).collect(Collectors.toList());
                BigDecimal wStockNum = useList.stream().map(s -> s.getNum()).reduce(BigDecimal.ZERO, BigDecimal::add);
                if(wStockNum.compareTo(Constants.formatBigdecimal(model.getNum()))<Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,生产物料不足,无法进行该操作!");
                }
                for(WStock ts : allList){
                    if(Constants.equalsInteger(model.getMaterialId(),ts.getMaterialId())){
                        //还需要投料数量
                        BigDecimal actNum = Constants.formatBigdecimal(model.getNum()).subtract(Constants.formatBigdecimal(model.getTNum()));
@@ -830,13 +834,14 @@
            if (bomDetailList == null || bomDetailList.size() == 0) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该生产物料的bom配置有误,请联系管理员!");
            }
//            for (BomDetailExtListVO i :bomDetailList) {
//                //查询是否投料
//                if(workorderRecordExtMapper.selectCount(new QueryWrapper<WorkorderRecord>()
//                        .eq("DELETED",Constants.ZERO).eq("MATERIAL_ID",i.getMaterialId()).eq("TYPE",Constants.ZERO))<=0){
//                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在未投料BOM物料,无法进行报工");
//                }
//            }
            for (BomDetailExtListVO i :bomDetailList) {
                //查询是否投料
                if(workorderRecordExtMapper.selectCount(new QueryWrapper<WorkorderRecord>()
                                .eq("WORKORDER_ID",mp.getId())
                        .eq("DELETED",Constants.ZERO).eq("MATERIAL_ID",i.getMaterialId()).eq("TYPE",Constants.ZERO))<=0){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在未投料BOM物料,无法进行报工");
                }
            }
        }
        WOutbound outbound = new WOutbound();
server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java
@@ -11,6 +11,7 @@
import doumeemes.core.utils.Constants;
import doumeemes.core.utils.HttpsUtil;
import doumeemes.core.utils.Utils;
import doumeemes.dao.business.model.Company;
import doumeemes.dao.business.model.CompanyUser;
import doumeemes.dao.business.model.Department;
import doumeemes.dao.ext.CompanyExtMapper;
@@ -69,6 +70,8 @@
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    @Autowired
    private CompanyExtMapper companyExtMapper;
    /**
@@ -107,6 +110,11 @@
        if(Objects.isNull(department)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到绑定部门信息");
        }
        Company company = companyExtMapper.selectById(department.getCompanyId());
        if(Objects.isNull(company)||company.getStatus().equals(Constants.ZERO)){
            wxLoginVO.setLoginStatus(Constants.ONE);
            return wxLoginVO;
        }
        SystemUser systemUser = systemUserMapper.selectById(companyUser.getUserId());
        //查询用户数据
        LoginDTO dto = new LoginDTO();
@@ -137,6 +145,9 @@
            wxLoginVO.setLoginStatus(Constants.ZERO);
            wxLoginVO.setSession(session);
            return wxLoginVO;
        }catch (BusinessException e) {
            wxLoginVO.setLoginStatus(Constants.ONE);
            return wxLoginVO;
        }catch (AuthenticationException e) {
            BusinessException ee = null;
            loginLog.setSuccess(Boolean.FALSE);
server/src/main/resources/mappers/PlansExtMapper.xml
@@ -778,7 +778,7 @@
<!--        AND   #{endDate} >= `a`.`PLAN_DATE`-->
<!--      </if>-->
      <if test="mixParam != null and mixParam!=''">
        AND  (mmodel.name like concat('%',#{mixParam},'%') or mmodel.code like concat('%',#{mixParam},'%') or pmodel.name like concat('%',#{mixParam},'%'))
        AND  (mmodel.name like concat('%',#{mixParam},'%') or mmodel.code like concat('%',#{mixParam},'%') or pmodel.name like concat('%',#{mixParam},'%')  or a.BATCH like concat('%',#{mixParam},'%') or w.SALESORDER like concat('%',#{mixParam},'%') )
      </if>
      <if test="usermodelInvalidTime != null">
        AND `usermodel`.`INVALID_TIME` = #{usermodelInvalidTime}
server/src/main/resources/mappers/SalaryParamMapper.xml
@@ -23,6 +23,8 @@
            or   m.`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>
        <if test="model.rootDepartId != null"> and sp.`ROOT_DEPART_ID` = #{model.rootDepartId}</if>
        <if test="model.departId != null"> and sp.`DEPART_ID` = #{model.departId}</if>
        order by sp.CREATE_TIME desc
    </select>
</mapper>
server/src/main/resources/mappers/WorkorderRecordExtMapper.xml
@@ -444,6 +444,7 @@
    left join unit d on a.UNIT_ID = d.ID
    left join procedures f on a.PROCEDURE_ID =f.ID
    where a.DELETED = 0
      and a.TYPE = 1
    <if test="rootDepartId != null">
      AND  a.`ROOT_DEPART_ID` = #{rootDepartId}
    </if>
web_standard/.env.development
@@ -14,12 +14,15 @@
VUE_APP_API_PREFIX = ''
# ç„¦æ¾
VUE_APP_BASE_URL = 'http://192.168.0.36:10021/'
# VUE_APP_BASE_URL = 'http://192.168.0.36:10021/'
# VUE_APP_BASE_URL = 'http://192.168.0.134:10021/'
# ä»»åº·æœ¬åœ°
VUE_APP_BASE_URL = 'http://192.168.0.15:10021/'
# æ±Ÿè
# VUE_APP_BASE_URL = 'http://192.168.0.35:10021/'
# æµ‹è¯•服务器
# VUE_APP_BASE_URL = 'https://dmtest.ahapp.net/doumeeplant_api/'
VUE_APP_BASE_URL = 'https://dmtest.ahapp.net/doumeeplant_api/'
web_standard/src/components/base/BaseTable.vue
@@ -262,7 +262,96 @@
      if (this.api == null) {
        throw new Error('The page is not initialized, you can use method \'this.config\' to initialize this page.')
      }
    },
    /**
 * æ•°å­—相加
 * @param {*} arg1
 * @param {*} arg2
 * @returns
 */
    accAdd(arg1, arg2) {
      return this.changeNum(arg1, arg2)
    },
    /**
     * æ•°å­—相减
     * @param {*} arg1
     * @param {*} arg2
     * @returns
     */
    accSub(arg1, arg2) {
      return this.changeNum(arg1, arg2, false)
    },
    /**
     * æ•°å­—相乘
     * @param {*} arg1
     * @param {*} arg2
     * @returns
     */
    accMul(arg1, arg2) {
      let m = 0;
      m = accAdd(m, getDecimalLength(arg1))
      m = accAdd(m, getDecimalLength(arg2))
      return getNum(arg1) * getNum(arg2) / Math.pow(10, m)
    },
    /**
     * æ•°å­—相除
     * @param {*} arg1
     * @param {*} arg2
     * @returns
     */
    accDiv(arg1, arg2) {
      let t1, t2;
      t1 = this.getDecimalLength(arg1)
      t2 = this.getDecimalLength(arg2)
      if (t1 - t2 > 0) {
        return (this.getNum(arg1) / this.getNum(arg2)) / Math.pow(10, t1 - t2)
      } else {
        return (this.getNum(arg1) / this.getNum(arg2)) * Math.pow(10, t2 - t1)
    }
    },
    changeNum(arg1 = '', arg2 = '', isAdd = true) {
      function changeInteger(arg, r, maxR) {
        if (r != maxR) {
          let addZero = ''
          for (let i = 0; i < maxR - r; i++) {
            addZero += '0'
          }
          arg = Number(arg.toString().replace('.', '') + addZero)
        } else {
          arg = this.getNum(arg)
        }
        return arg
      }
      let r1, r2, maxR, m;
      r1 = this.getDecimalLength(arg1)
      r2 = this.getDecimalLength(arg2)
      maxR = Math.max(r1, r2)
      arg1 = changeInteger(arg1, r1, maxR)
      arg2 = changeInteger(arg2, r2, maxR)
      m = Math.pow(10, maxR)
      if (isAdd) {
        return (arg1 + arg2) / m
      } else {
        return (arg1 - arg2) / m
      }
    },
    getDecimalLength(arg = '') {
      try {
        return arg.toString().split(".")[1].length
      } catch (e) {
        return 0
      }
    },
    getNum(arg = '') {
      return Number(arg.toString().replace(".", ""))
    }
  }
}
</script>
web_standard/src/components/business/OperaSalaryParamWindow.vue
@@ -196,7 +196,9 @@
          // if (!isEdit) {
          //   this.form.materialId = res[0]?res[0].materialId:''
          // }
          // this.selectMaterial(this.form.materialId)
          if (isEdit) {
            this.selectMaterial(this.form.materialId)
          }
        })
        .catch(err => {
          console.log(err)
web_standard/src/components/ext/OperaPlanStaock.vue
@@ -219,8 +219,8 @@
          layout="total, prev, pager, next, jumper"
          :total="pagination.total"
          @current-change="handlePageChange"
          background>
        </el-pagination>
          background
        ></el-pagination>
      </div>
    </SelectMaterail>
  </GlobalWindow>
web_standard/src/components/ext/OperaUserDeviceExtWindow.vue
@@ -18,7 +18,7 @@
        </el-select>
      </el-form-item>
      <el-form-item label="所属员工:" prop="userIds">
        <el-select v-model="form.userIds" multiple clearable filterable placeholder="请选择" @change="selectUser">
        <el-select v-model="form.userIds" reserve-keyword multiple clearable filterable placeholder="请选择" @change="selectUser">
          <el-option
            v-for="(item, index) in select()"
            :key="item.id"
web_standard/src/components/ext/OperaWInboundExtWindow.vue
@@ -126,8 +126,7 @@
    <SelectMaterail
      ref="selectMaterail"
      @selectData="selectData"
    >
    </SelectMaterail>
    ></SelectMaterail>
  </GlobalWindow>
</template>
web_standard/src/components/ext/OperaWOutboundExtWindow.vue
@@ -460,12 +460,26 @@
        },
        sorts: null
      }).then(res => {
        // console.log('res', res)
        this.pagination.total = res.total
        this.pagination.pageSize = res.capacity
        this.pagination.pageIndex = res.page
        this.tempMaterials = res.records
        this.isSelectMaterial = true
        // console.log('getTempMaterails', this.selectedAllMaterails)
        if (this.selectedAllMaterails[this.pagination.pageIndex]) {
          // debugger
          for (const item of this.selectedAllMaterails[this.pagination.pageIndex]) {
            this.$nextTick(() => {
              this.tempMaterials.forEach(tempItem => {
                if (tempItem.id === item.id) {
                  console.log(tempItem.mmodelUnionName);
                  this.$refs.materials.toggleRowSelection(tempItem, true)
                }
              })
            })
          }
        }
      }).catch(err => {
        this.$tip.error(err)
      })
@@ -475,8 +489,9 @@
      this.getTempMaterails()
    },
    handleSelectionChange (selectedRows) {
      // console.log(selectedRows)
      console.log(selectedRows)
      this.selectedAllMaterails[this.pagination.pageIndex] = selectedRows
      console.log(this.selectedAllMaterails);
    },
    selectData () {
      // console.log(this.selectedAllMaterails)
web_standard/src/components/ext/OperaWrollOutStore.vue
@@ -581,6 +581,18 @@
        this.pagination.pageIndex = res.page
        this.tempMaterials = res.records
        this.isSelectMaterial = true
        if (this.selectedAllMaterails[this.pagination.pageIndex]) {
          for (const item of this.selectedAllMaterails[this.pagination.pageIndex]) {
            this.$nextTick(() => {
              this.tempMaterials.forEach(tempItem => {
                if (tempItem.id === item.id) {
                  console.log(tempItem.mmodelUnionName);
                  this.$refs.materials.toggleRowSelection(tempItem, true)
                }
              })
            })
          }
        }
      }).catch(err => {
        this.$tip.error(err)
      })
@@ -592,6 +604,7 @@
    handleSelectionChange (selectedRows) {
      // console.log(selectedRows)
      this.selectedAllMaterails[this.pagination.pageIndex] = selectedRows
      console.log(this.selectedMaterails);
    },
    selectData () {
      console.log(this.selectedAllMaterails)
web_standard/src/components/ext/OrderDistrubution.vue
@@ -38,6 +38,7 @@
        <el-select 
          v-model="form.proUserList" 
          :disabled="!form.proGroupId" 
          reserve-keyword
          multiple 
          clearable
          filterable
web_standard/src/views/business/salaryParam.vue
@@ -62,7 +62,11 @@
        <el-table-column prop="materialName" label="物料名称" min-width="140px"></el-table-column>
        <el-table-column prop="materialCode" label="物料编码" min-width="100px"></el-table-column>
        <el-table-column prop="procedureName" label="工序名称" min-width="100px"></el-table-column>
        <el-table-column prop="salary" label="工资单价(元)" min-width="100px"></el-table-column>
        <el-table-column prop="salary" label="工资单价(元)" min-width="100px">
          <!-- <template slot-scope="{row}">
            {{ accDiv(row.salary, 100) }}
          </template> -->
        </el-table-column>
        <el-table-column prop="num" label="标准产出" min-width="100px">
          <template slot-scope="{row}">
            {{ (row.num == 0 || !row.num) ? '-' : row.num }}
web_standard/src/views/ext/plansExt.vue
@@ -3,8 +3,8 @@
  <keep-alive><TableLayout v-permissions="['ext:plansext:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form slot="search-form" ref="searchForm" :model="searchForm" label-suffix=":" label-width="110px" inline>
      <el-form-item label="搜索信息" prop="mixParam">
        <el-input v-model="searchForm.mixParam" placeholder="请输入物料名称/编码/工序名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="物料信息" prop="mixParam">
        <el-input v-model="searchForm.mixParam" placeholder="请输入物料名称/编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="成品计划" prop="workPlanCode">
        <el-input v-model="searchForm.workPlanCode" placeholder="请输入成品计划编码" @keypress.enter.native="search"></el-input>
@@ -71,19 +71,19 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar">
        <!-- <li v-permissions="['ext:plansext:importExcel']">
        <li v-permissions="['ext:plansext:distribute']"><el-button type="primary" @click="plansDistribute">批量分配</el-button></li>
        <li v-permissions="['ext:plansext:importExcel']">
          <ImportButton
            text="导入"
            template-name="plans_import_template.xlsx"
            template-path="template/plans_import_template.xlsx"
            template-path="/template/plans_import_template.xlsx"
            action="/ext/plansExt/importBatch"
            @success="search"
          />
        </li> -->
        </li>
        <!-- <li v-permissions="['ext:plansext:create']"><el-button type="primary" @click="$refs.operaPlansExtWindow.open('新建生产计划')" >新建</el-button></li> -->
        <!-- <li v-permissions="['ext:plansext:publish']"><el-button type="primary" @click="planRelease" >发布</el-button></li> -->
        <li v-permissions="['ext:plansext:distribute']"><el-button type="primary" @click="plansDistribute">批量分配</el-button></li>
        <li v-permissions="['ext:plansext:exportExcel']"><el-button type="primary" :loading="isWorking.export" @click="exportExcel">导出</el-button></li>
        <!-- <li v-permissions="['ext:plansext:exportExcel']"><el-button type="primary" :loading="isWorking.export" @click="exportExcel">导出</el-button></li> -->
        <!-- <li v-permissions="['ext:plansext:planpink']"><el-button type="primary" @click="$refs.operaWTransferExtWindow.open('计划领料')">计划领料</el-button></li> -->
        <!-- <li v-permissions="['ext:plansext:stockpink']"><el-button type="primary" @click="$refs.operaPlanStaock.open('库存领料')">库存领料</el-button></li> -->
        <!-- <li v-permissions="['ext:plansext:delete']"><el-button type="danger" plain @click="deleteByIdInBatch">批量删除</el-button></li> -->
web_standard/src/views/ext/salaryStatistic.vue
@@ -60,18 +60,18 @@
        <el-table-column prop="userInfo.departName" label="部门" min-width="100px"> </el-table-column>
        <el-table-column prop="jijianSalary" label="计件工资" min-width="100px">
          <template slot-scope="{row}">
            {{ row.jijianSalary / 100 }}
            {{ accDiv(Math.round(row.jijianSalary), 100) }}
          </template>
        </el-table-column>
        <el-table-column prop="jishiSalary" label="计时工资" min-width="100px">
          <template slot-scope="{row}">
            {{ row.jishiSalary / 100 }}
            {{ accDiv(Math.round(row.jishiSalary), 100) }}
          </template>
        </el-table-column>
        <el-table-column prop="num" label="报工单总数" min-width="100px"></el-table-column>
        <el-table-column prop="totalSalary" label="小计工资(元)" min-width="100px">
          <template slot-scope="{row}">
            {{ row.totalSalary / 100 }}
            {{ accDiv(Math.round(row.totalSalary), 100) }}
          </template>
        </el-table-column>
       
web_standard/src/views/ext/workorderPutRecordExt.vue
@@ -120,19 +120,33 @@
            <span class="long-title-style">{{ row.procedureName }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="qualifiedNum" label="合格数量" min-width="100px">
        <!-- <el-table-column prop="qualifiedNum" label="合格数量" min-width="100px">
          <template slot-scope="{row}">
            <span class="valid-style">{{ row.qualifiedNum + row.umodel.name }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="unqualifiedNum" label="不良数量" min-width="100px">
          <template slot-scope="{row}">
            <span class="unvalid-style">{{ row.num + row.umodel.name}}</span>
            <!-- <span :class="row.materialDonetype==0 ? 'valid-style' : ''">{{ row.num + row.umodel.name }}</span> -->
            <span class="unvalid-style">{{ row.unqualifiedNum + row.umodel.name}}</span>
          </template>
        </el-table-column> -->
        <el-table-column prop="doneType" label="质量属性" min-width="100px">
           <template slot-scope="{row}">
            <span v-if="row.materialDonetype==0" class="valid-style">合格</span>
            <span v-else-if="row.materialDonetype==1" class="unvalid-style">不良</span>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column prop="num" label="报工数量" min-width="100px"></el-table-column>
        <!-- <el-table-column prop="amodel.code" label="工装器具" min-width="100px"></el-table-column> -->
        <el-table-column prop="num" label="数量" min-width="100px">
           <template slot-scope="{row}">
            <span :class="row.materialDonetype==0 ? 'valid-style' : 'unvalid-style'">{{ row.num + row.umodel.name }}</span>
           </template>
         </el-table-column>
        <!-- <el-table-column prop="num" label="报工数量" min-width="100px">
          <template slot-scope="{row}">
            {{ row.num + row.umodel.name }}
          </template>
        </el-table-column> -->
        <el-table-column prop="deviceCode" label="设备" show-overflow-tooltip min-width="100px">
          <template slot-scope="{row}">
            <span class="long-title-style" :title="row.deviceCode + ' | ' + row.deviceName">{{ row.deviceCode + ' | ' + row.deviceName}}</span>
@@ -264,7 +278,7 @@
        if (index === 0) {
          sums[index] = '合计';
          return;
        } else if (index === 4 || index === 6 || index === 8 || index === 10) {
        } else if (index === 4 || index === 8 || index === 10) {
          // || index === 8 || index === 9 || index === 16 || index === 17
          sums[index] = '-';
          return;