jiangping
2023-08-25 282e032b5771da13d224214d3b0b71f3efde9a42
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmMes
已添加9个文件
已修改46个文件
1629 ■■■■ 文件已修改
h5_standard/.env 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/.env.production 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/public/redirect.html 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/apis/index.ts 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/router/module/index.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/store/index.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/utils/request.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/utils/utils.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/LogInAgain.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/appletLogin.vue 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/children.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/plannedProgress/details.vue 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/tabPage/my.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/reportingForWork.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/workOrderReporting.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/App.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages.json 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/changePassword/changePassword.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/index/index.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/mine/mine.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/personal/personal.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/updateMailbox/updateMailbox.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
minipro_standard/pages/updatePhone/updatePhone.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/components/business/OperaClientDetailWindow.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/components/business/OperaClientMangerWindow.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/views/business/clientManger.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform_web/src/views/system/loginLog.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen_standard/src/views/index.vue 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen_standard/src/views/process.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen_standard/vite.config.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/coderd.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/package.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/public/template/device_import_template.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/api/business/unqualifiedRecord.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/api/ext/categoryUnionExt.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/api/ext/workorderRecordPutExt.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/common/Header.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/common/Menu.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaPlansDetailExtWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaUnitExtWindow.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/ext/OperaWInboundExtWindow.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/system/role/PermissionConfigWindow.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/system/user/OperaSystemRoleApplysWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/components/system/user/OperaSystemRoleNone.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/layouts/TableLayout.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/business/unqualifiedRecord.vue 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/appliancesExt.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/deviceExt.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/salaryStatistic.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/src/views/ext/workorderPutRecordExt.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/.env
@@ -1,5 +1,5 @@
# æŽ¥å£å‰ç¼€  _api
VUE_APP_API_PREFIX = '/doumeeplant_api'
VUE_APP_API_PREFIX = '/doumeeplant'
# ä¸Šä¸‹æ–‡è·¯å¾„ --> é»˜è®¤./(可以部署在服务器任意路径)
VUE_APP_CONTEXT = './'
h5_standard/.env.production
@@ -18,7 +18,7 @@
# VUE_APP_API = 'https://hsky.doumee.com/doumeeplant_api/'
# æµ‹è¯•
VUE_APP_API = 'https://dmtest.ahapp.net/doumeeplant_api/'
# VUE_APP_API = 'https://dmtest.ahapp.net/doumeeplant_api/'
# æ¼”示
# VUE_APP_API = 'https://www.mes.red/doumeeplant/'
VUE_APP_API = 'https://www.mes.red/doumeeplant/'
h5_standard/public/redirect.html
@@ -10,10 +10,12 @@
  if (url.indexOf('?code') === -1) {
    let query = url.split('?')[1]
    let tempUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6ea339a336f26380&redirect_url=https://www.mes.red/h5/redirect.html&response_type=code&scope=snsapi_base&state=#wechat_redirect`
    // let tempUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6ea339a336f26380&redirect_url=https://dmtest.ahapp.net/doumeeplant_h5/redirect.html&response_type=code&scope=snsapi_base&state=#wechat_redirect`
    window.location.replace(tempUrl)
  } else {
    var code = url.substring(url.indexOf('?') + 6, url.indexOf('&'))
    let href1 = `https://www.mes.red/h5/#/wxLogin?code=${code}`
    // let href1 = `https://dmtest.ahapp.net/doumeeplant_h5/#/wxLogin?code=${code}`
    window.location.replace(href1)
  }
</script>
h5_standard/src/apis/index.ts
@@ -20,7 +20,16 @@
    })
}
// å¾®ä¿¡ç«¯ç™»å½•
// å¾®ä¿¡å°ç¨‹åºç™»å½•
export function wxProgramLogin(params: any): Promise<any> {
    return httpRequest({
        url: '/system/wxProgramLogin',
        method: 'get',
        params
    })
}
// å¾®ä¿¡å…¬ä¼—号登录
export function wxAccountLogin(data: any): Promise<any> {
    return httpRequest({
        url: '/system/wxAccountLogin',
@@ -29,6 +38,15 @@
    })
}
// å¾®ä¿¡é€€å‡ºç™»å½•
export function wxLoginOut(data: any): Promise<any> {
    return httpRequest({
        url: '/system/wxLoginOut',
        method: 'post',
        data
    })
}
// èŽ·å–ä¼ä¸šid
export function getDingdingCorpId(companyId: any): Promise<any> {
    return httpRequest({
h5_standard/src/router/module/index.ts
@@ -104,6 +104,15 @@
            keepAlive: false
        },
        component: () => import('@/views/wxLogin.vue')
    },
    {
        path: '/appletLogin',
        name: 'appletLogin',
        meta: {
            title: 'DM云工厂',
            keepAlive: false
        },
        component: () => import('@/views/appletLogin.vue')
    }
]
h5_standard/src/store/index.ts
@@ -10,7 +10,7 @@
export default createStore({
  state: {
    // é¡¹ç›®å…¥å£çŽ¯å¢ƒ DD / H5
    // é¡¹ç›®å…¥å£çŽ¯å¢ƒ DD / H5 / WX / XCX
    env: env ? env : null,
    // æ˜¯å¦éœ€è¦é€‚配苹果底部安全距离
h5_standard/src/utils/request.ts
@@ -29,10 +29,9 @@
// æ·»åŠ å“åº”æ‹¦æˆªå™¨
service.interceptors.response.use(
    (response) => {
        if (response.config.url?.indexOf('/lingyang/login') == -1 && response.config.url?.indexOf('/edgp/loginDemo') == -1 && response.config.url?.indexOf('/lingyang/loginDemo') == -1 && response.config.url?.indexOf('/edgp/login') == -1) {
        // if (response.config.url?.indexOf('/lingyang/login') == -1 && response.config.url?.indexOf('/edgp/loginDemo') == -1 && response.config.url?.indexOf('/lingyang/loginDemo') == -1 && response.config.url?.indexOf('/edgp/login') == -1) {
            loading.clear();
        }
        // }
        if (response.data.code === 401) {     // å¤„理登录过期
            Toast.fail({ message: '登录过期,准备自动重新登录', duration: 2000, forbidClick: true })
            setTimeout(() => {
h5_standard/src/utils/utils.ts
@@ -199,7 +199,7 @@
function judgmentPlatform (): boolean {
    // alert(store.state.env)
    // alert(store.state.env !== 'DD')
    return store.state.env === 'DD'
    return store.state.env === 'DD' || store.state.env === 'WX';
    // return dd.env.platform !== 'notInDingTalk';
}
h5_standard/src/views/LogInAgain.vue
@@ -94,7 +94,7 @@
      let res = await testLogin({ // æ–‡æ­¦
        username: '18656077929',
        password: '123456',
        companyId: '8',
        companyId: '111',
        uuid: '0000',
        code: '0000'
      })
h5_standard/src/views/appletLogin.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
<template>
    <div class="wx">
        <img class="wx_bg" src="@/assets/background/login_bg@2x.png" alt="" />
        <div class="wx_login">
            <img class="wx_login_icon" src="@/assets/icon/logo@2x.png" alt="" />
            <span>DM云工厂</span>
            <div class="wx_login_list">
                <div class="wx_login_list_item">
                    <img src="@/assets/icon/login_ic_code@2x.png" alt="" />
                    <input type="text" v-model="from.companyId" placeholder="企业代码" />
                </div>
                <div class="wx_login_list_item">
                    <img src="@/assets/icon/login_ic_phone@2x.png" alt="" />
                    <input type="text" maxlength="11" v-model="from.username" placeholder="手机号" />
                </div>
                <div class="wx_login_list_item">
                    <img src="@/assets/icon/login_ic_password@2x.png" alt="" />
                    <input type="password" v-model="from.password" placeholder="密码" />
                </div>
            </div>
            <div class="wx_login_footer">
                <div class="wx_login_footer_btn" @click="login">立即登录</div>
            </div>
        </div>
    </div>
</template>
<script setup lang="ts">
import { onMounted, reactive } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useStore } from 'vuex';
import { wxAccountLogin, getUserInfo, wxProgramLogin } from '@/apis/index';
import { Toast } from 'vant';
const route = useRoute()
const router = useRouter()
const store = useStore()
let from: any = reactive({
    openid: '',
    unionid: '',
    companyId: '',
    username: '',
    password: ''
})
const login = async () => {
    // if (!from.openid) return Toast('openid不能为空')
    // if (!from.unionid) return Toast('unionid不能为空')
    if (!from.companyId) return Toast('企业代码不能为空')
    if (!from.username) return Toast('手机号不能为空')
    if (!from.password) return Toast('密码不能为空')
    Toast.loading({
        message: '登录中...',
        forbidClick: true
    });
    let res = await wxAccountLogin(from)
    if (res.code === 200) {
        let info = await getUserInfo()
        if (info.code === 200) {
            await store.commit('setEntrance', 'XCX')
            await store.commit('setUserInfo', info.data)
            await store.dispatch('getMenuList', 2)
            await router.replace('/workbench')
        }
    }
    Toast.clear();
}
onMounted(() => {
    wxProgramLogin({ code: route.query.code })
        .then(async (res) => {
            if (res.code === 200) {
                // å…ç™»å½•,直接跳首页
                if (res.data.loginStatus == 0) {
                    let info = await getUserInfo()
                    if (info.code === 200) {
                        await store.commit('setEntrance', 'XCX')
                        await store.commit('setUserInfo', info.data)
                        await store.dispatch('getMenuList', 2)
                        await router.replace('/workbench')
                    }
                } else {
                    from.openid = res.data.openid
                    from.unionid = res.data.unionid
                }
            }
        })
})
</script>
<style lang="scss" scoped>
    .wx {
        width: 100vw;
        height: 100vh;
        display: flex;
        align-items: center;
        justify-content: center;
        background: #FFFFFF linear-gradient(180deg, rgba(66,117,252,0.2) 0%, rgba(66,117,252,0) 100%);
        .wx_bg {
            width: 100vw;
            height: 812px;
            position: fixed;
            top: 0;
            left: 0;
        }
        .wx_login {
            width: 100vw;
            height: auto;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-direction: column;
            .wx_login_icon {
                width: 180px;
                height: 180px;
            }
            span {
                font-size: 44px;
                font-family: PingFangSC-Semibold, PingFang SC;
                font-weight: 600;
                color: #333333;
                margin-top: 40px;
            }
            .wx_login_list {
                width: 100vw;
                padding: 0 60px;
                box-sizing: border-box;
                margin-top: 80px;
                position: relative;
                z-index: 9;
                .wx_login_list_item {
                    width: 100%;
                    height: 98px;
                    background: #FFFFFF;
                    border-radius: 8px;
                    padding: 0 40px;
                    box-sizing: border-box;
                    display: flex;
                    align-items: center;
                    margin-bottom: 40px;
                    &:last-child {
                        margin-bottom: 0 !important;
                    }
                    img {
                        width: 40px;
                        height: 40px;
                        flex-shrink: 0;
                        margin-right: 24px;
                    }
                    input::-webkit-input-placeholder {
                        font-size: 30px;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #B7BBC5;
                    }
                    input {
                        flex: 1;
                        height: 100%;
                        padding: 0 !important;
                        font-size: 30px;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #222222;
                        border: none;
                        outline: none;
                    }
                }
            }
            .wx_login_footer {
                width: 100vw;
                padding: 0 60px;
                box-sizing: border-box;
                margin-top: 80px;
                .wx_login_footer_btn {
                    width: 100%;
                    height: 98px;
                    line-height: 98px;
                    text-align: center;
                    background: #4275FC;
                    box-shadow: 0px 12px 24px 0px rgba(66,117,252,0.2);
                    border-radius: 8px;
                    font-size: 32px;
                    font-family: PingFangSC-Medium, PingFang SC;
                    font-weight: 500;
                    color: #FFFFFF;
                }
            }
        }
    }
</style>
h5_standard/src/views/children.vue
@@ -1,7 +1,7 @@
<template>
    <div class="box">
        <!--    å¤´éƒ¨å¯¼èˆª    -->
        <template v-if="env == 'H5'">
        <template v-if="env == 'H5' || env == 'XCX'">
            <v-Header :pathList="pathLists">
                <template v-slot:title>{{title}}</template>
            </v-Header>
h5_standard/src/views/index.vue
@@ -1,7 +1,7 @@
<template>
    <div class="index">
        <!--    å¤´éƒ¨å¯¼èˆª    -->
        <template v-if="env == 'H5'">
        <template v-if="env == 'H5' || env == 'XCX'">
            <v-Header :pathList="pathLists">
                <template v-slot:title>{{ title }}</template>
            </v-Header>
h5_standard/src/views/plannedProgress/details.vue
@@ -53,7 +53,7 @@
                    </div>
                    <div class="content_list_item_content_item">
                        <div class="content_list_item_content_item_label">分配数量:</div>
                        <div class="content_list_item_content_item_nr">{{info.createTime}}</div>
                        <div class="content_list_item_content_item_nr" v-if="info.umodel">{{info.distributNum}}{{info.umodel.name}}</div>
                    </div>
                    <div class="content_list_item_content_item">
                        <div class="content_list_item_content_item_label">完工数量:</div>
@@ -64,20 +64,22 @@
        </div>
        <NotFound info="暂未分配工单" v-if="info.workorderList && info.workorderList.length === 0" />
        <template v-else>
            <div class="details_list">
                <div class="details_list_item" v-for="(item, i) in info.workorderList" :key="i" @click="jump(item.id)">
            <!-- <div class="details_list">
                <div class="details_list_item" v-for="(item, i) in info.workorderList" :key="i" @click="jump(item)">
                    <div class="details_list_item_top">
                        <span>{{ item.createUserName }}</span><span>{{ item.code }}</span>
                        <span>{{ item.createUserName }}</span>
                        <span>{{ item.code }}</span>
                    </div>
                    <div class="details_list_item_center">
                        <span>良品数:{{ item.qualifiedNum }}</span><span>不良数:<span class="red">{{ item.unqualifiedNum }}</span></span>
                        <span>良品数:{{ item.qualifiedNum }}</span>
                        <span>不良数:<span class="red">{{ item.unqualifiedNum }}</span></span>
                    </div>
                    <div class="details_list_item_bottom">
                        <span>{{ item.createTime }}</span>
                    </div>
                </div>
            </div>
            <!-- <div class="details_timeline" v-for="(item, i) in info.workorderList" :key="i">
            </div> -->
            <div class="details_timeline" v-for="(item, i) in info.workorderList" :key="i">
                <div class="details_timeline_header">
                    <div class="details_timeline_header_code">
                        <span>工单编号:{{item.code}}</span>
@@ -89,10 +91,10 @@
                    <span v-if="item.status === 3" class="purple">已检验</span>
                    <span v-if="item.status === 4">已报工</span>
                    <span v-if="item.status === 5">已入库</span>
                    <span v-if="item.status === 6">已取消</span> -->
                    <span v-if="item.status === 6">已取消</span>
                    <!--                <span v-if="item.status === 7">已取消</span>-->
                    <!--                <span v-if="item.status === 8">已关闭</span>-->
                <!-- </div>
                </div>
                <div class="details_timeline_item" v-if="item.produceDate">
                    <div class="activedian"></div>
                    <div class="dian active"></div>
@@ -153,8 +155,10 @@
                        </div>
                    </div>
                </div>
            </div> -->
            </div>
        </template>
        <!-- <div class="details_zw"></div> -->
        <!-- <div class="details_btn" @click="toJump">去报工</div> -->
    </div>
</template>
@@ -182,8 +186,17 @@
            })
    }
    const jump = (id: any) => {
        router.push({ name: 'workOrderReporting', query: { id } })
    const toJump = () => {
        router.push({ name: 'reportingForWork' })
    }
    const jump = (item: any) => {
        if (item.status === 4 || item.status === 6 || item.paused === 1) {
            router.push({ name: 'afterWorkReport', query: { id: item.id } })
        } else {
            router.push({ name: 'workOrderReporting', query: { id: item.id } })
        }
        // router.push({ name: 'workOrderReporting', query: { id } })
    }
    const proUserStr = (item: any) => {
@@ -210,6 +223,26 @@
    height: 100%;
    position: absolute;
    background: #F7F7F7;
    .details_zw {
        width: 100%;
        height: 148px;
    }
    .details_btn {
        position: fixed;
        bottom: 60px;
        left: 30px;
        width: calc(100% - 60px);
        height: 88px;
        line-height: 88px;
        text-align: center;
        background: #305ED5;
        box-shadow: 0px 0px 12px 0px rgba(0,0,0,0.08);
        border-radius: 8px;
        font-size: 30px;
        font-family: PingFangSC-Medium, PingFang SC;
        font-weight: 500;
        color: #FFFFFF;
    }
    .van-skeleton {
        padding: 0 !important;
    }
h5_standard/src/views/tabPage/my.vue
@@ -21,7 +21,7 @@
                </div>
            </div>
        </div>
<!--        <div class="box_out"><span>退出登录</span></div>-->
        <div class="box_out" v-if="store.state.env && (store.state.env == 'WX' || store.state.env == 'XCX')" @click="loginOut"><span>退出登录</span></div>
    </div>
    <van-popup v-model:show="show" position="bottom" round :style="{ height: '50%' }">
        <van-picker
@@ -40,6 +40,7 @@
    import { Dialog, Toast } from 'vant'
    const VanDialog = Dialog.Component;
    import { changeCom, getDepartmentListByConditon } from '@/apis/PersonalAPI'
    import { wxLoginOut } from '@/apis'
    const router = useRouter()
@@ -69,6 +70,19 @@
        })
    };
    // é€€å‡ºç™»å½•
    const loginOut = () => {
        wxLoginOut({
            companyUserId: store.state.userInfo.companyUser.id
        }).then(res => {
            if (res.code === 200) {
                // window.parent.postMessage('阿康', '*')
                let href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6ea339a336f26380&redirect_url=https://www.mes.red/h5/redirect.html&response_type=code&scope=snsapi_base&state=#wechat_redirect'
                window.open(href)
            }
        })
    }
    // å…³é—­ç»„织弹框
    const onCancel = (): void => {
        show.value = false
h5_standard/src/views/workOrder/reportingForWork.vue
@@ -392,6 +392,12 @@
        if (!from.qualified && !from.undesirable) {
            return Toast('良品数与不良数不能同时为空')
        }
        if (from.qualified && from.qualified <= 0) {
            return Toast('良品数必须大于0')
        }
        if (from.undesirable && from.undesirable <= 0) {
            return Toast('不良品数必须大于0')
        }
        // if (!from.qualified) return Toast('良品数不能为空')
        // æœ‰ä¸è‰¯æ•°
        if (from.undesirable > 0) {
h5_standard/src/views/workOrder/workOrderReporting.vue
@@ -962,7 +962,7 @@
        if (info.value.bomType === 1) {  // æ‹‰å¼
            console.log('拉式')
            statisticsData.value = []
            if (produceFrom.qualified <= 0) {
            if (produceFrom.qualified <= 0 && produceFrom.undesirable <= 0) {
                Toast.fail({ message: '产出明细不能为空' })
                return
            }
@@ -1121,7 +1121,7 @@
                Toast.fail({ message: '投料明细不能为空' })
                return
            }
            if (produceFrom.qualified <= 0) {
            if (produceFrom.qualified <= 0 && produceFrom.undesirable <= 0) {
                Toast.fail({ message: '产出明细不能为空' })
                return
            }
minipro_standard/App.vue
@@ -1,5 +1,4 @@
<script>
    console.log('app------');
    // import { pageCount } from '@/util/api/index.js'
    export default {
        onLaunch: function() {
minipro_standard/main.js
@@ -10,7 +10,7 @@
store.dispatch('getHeight')
Vue.config.productionTip = false
App.mpType = 'app'
console.log(uni.$u);
// console.log(uni.$u);
// #ifdef MP
// å¼•å…¥uView对小程序分享的mixin封装
const mpShare = require('@/uni_modules/uview-ui/libs/mixin/mpShare.js')
@@ -24,6 +24,6 @@
})
require('./util/request/index')(app)
// èŽ·å–å¾…åŠžæ•°é‡
store.dispatch('getUpcomingNum')
// store.dispatch('getUpcomingNum')
app.$mount()
minipro_standard/manifest.json
@@ -50,7 +50,7 @@
    "quickapp" : {},
    /* å°ç¨‹åºç‰¹æœ‰ç›¸å…³ */
    "mp-weixin" : {
        "appid" : "wxcd2b89fd2ff065f8",
        "appid" : "wx1605a61f7a48cea6",
        "setting" : {
            "urlCheck" : false,
            "es6" : true,
minipro_standard/pages.json
@@ -1,65 +1,104 @@
{
    "pages": [
        {
            "path": "pages/workbench/workbench",
            "style": {
                "navigationBarTitleText": "工作台",
                "enablePullDownRefresh": false
            }
        },
        // {
        //     "path": "pages/workbench/workbench",
        //     "style": {
        //         "navigationBarTitleText": "工作台",
        //         "enablePullDownRefresh": false
        //     }
        // },
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "待办"
            }
        },  {
            "path": "pages/mine/mine",
            "style": {
                "navigationBarTitleText": "我的",
                "enablePullDownRefresh": false
                "navigationBarTitleText": "",
                "navigationStyle": "custom"
            }
        }
        ,{
            "path" : "pages/login/login",
            "style" :
            {
                "navigationBarTitleText": "登录",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        }
        // ,  {
        //     "path": "pages/mine/mine",
        //     "style": {
        //         "navigationBarTitleText": "我的",
        //         "enablePullDownRefresh": false
        //     }
        // }
     //    ,{
  //           "path" : "pages/login/login",
  //           "style" :
  //           {
  //               "navigationBarTitleText": "登录",
  //               "enablePullDownRefresh": false,
        //         "navigationStyle": "custom"
  //           }
  //       }
  //       ,{
  //           "path" : "pages/personal/personal",
  //           "style" :
  //           {
  //               "navigationBarTitleText": "个人信息",
  //               "enablePullDownRefresh": false
  //           }
  //       }
  //       ,{
  //           "path" : "pages/changePassword/changePassword",
  //           "style" :
  //           {
  //               "navigationBarTitleText": "修改密码",
  //               "enablePullDownRefresh": false
  //           }
  //       }
  //       ,{
  //           "path" : "pages/updatePhone/updatePhone",
  //           "style" :
  //           {
  //               "navigationBarTitleText": "更新手机号",
  //               "enablePullDownRefresh": false
  //           }
  //       }
  //       ,{
  //           "path" : "pages/updateMailbox/updateMailbox",
  //           "style" :
  //           {
  //               "navigationBarTitleText": "更新邮箱号",
  //               "enablePullDownRefresh": false
  //           }
  //       }
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "uni-app",
        "navigationBarBackgroundColor": "#ffffff",
        "backgroundColor": "#ffffff"
        "backgroundColor": "#ffffff",
        "navigationStyle": "custom"
    },
    "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": "我的"
            }
        ]
    },
    // "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/changePassword/changePassword.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
<template>
    <view class="password">
        <view class="password_tip">
            <image src="@/static/password_ic_tip@2x.png" alt="" />
            <text>密码由6-20个英文字母、数字或符号组成</text>
        </view>
        <view class="password_list">
            <view class="password_list_item">
                <text>原密码</text>
                <view class="password_list_item_box">
                    <input type="password" v-model="form.originalPassword" maxlength="20" placeholder="请输入原密码">
                </view>
            </view>
            <view class="password_list_item">
                <text>新密码</text>
                <view class="password_list_item_box">
                    <input type="password" v-model="form.newPassword" maxlength="20" placeholder="请输入新密码">
                </view>
            </view>
            <view class="password_list_item">
                <text>确认密码</text>
                <view class="password_list_item_box">
                    <input type="password" v-model="form.confirmPassword" maxlength="20" placeholder="再次输入新密码">
                </view>
            </view>
        </view>
        <view class="password_footer">
            <button v-preventReClick class="password_footer_submit">
                <text>完成</text>
            </button>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                form: {
                    originalPassword: '',
                    newPassword: '',
                    confirmPassword: ''
                }
            };
        }
    }
</script>
<style lang="scss" scoped>
    .password {
        position: absolute;
        width: 100%;
        height: 100%;
        background: white;
        .password_tip {
            height: 72rpx;
            display: flex;
            align-items: center;
            background: #F7F7F7;
            padding: 0 30rpx;
            image {
                width: 24rpx;
                height: 24rpx;
                margin-right: 10rpx;
            }
            text {
                font-size: 24rpx;
                font-weight: 400;
                color: #666666;
            }
        }
        .password_list {
            padding: 0 30rpx;
            .password_list_item {
                display: flex;
                align-items: center;
                height: 90rpx;
                border-bottom: 1rpx solid #E5E5E5;
                text {
                    width: 150rpx;
                    flex-shrink: 0;
                    font-size: 30rpx;
                    font-weight: 400;
                    color: #222222;
                }
                .password_list_item_box {
                    display: flex;
                    justify-content: space-between;
                    flex: 1;
                    input {
                        border: none;
                        font-size: 30rpx;
                    }
                    input::-webkit-input-placeholder {
                        font-size: 28rpx;
                        font-weight: 400;
                        color: #B2B2B2;
                    }
                    p {
                        font-size: 26rpx;
                        font-weight: 400;
                        color: #4275FC;
                    }
                }
            }
        }
        .password_footer {
            margin-top: 80rpx;
            padding: 0 30rpx;
            .password_footer_submit {
                width: 100%;
                height: 88rpx;
                border: none;
                background: #4275FC;
                box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.08);
                border-radius: 8rpx;
                display: flex;
                align-items: center;
                justify-content: center;
                text {
                    font-size: 30rpx;
                    font-weight: 500;
                    color: #FFFFFF;
                }
            }
        }
    }
</style>
minipro_standard/pages/index/index.vue
@@ -1,73 +1,44 @@
<template>
    <view>
        <myTabbar :index="0" />
    <view class="index">
        <web-view v-if="show" @onPostMessage="onMessage" :src="'https://dmtest.ahapp.net/doumeeplant_h5/#/appletLogin?code=' + code"></web-view>
        <!-- <myTabbar :index="0" /> -->
    </view>
</template>
<script>
    import myTabbar from "@/components/myTabber.vue"
    // import myTabbar from "@/components/myTabber.vue"
    export default {
        components: {
            myTabbar
        },
        // components: {
        //     myTabbar
        // },
        data() {
            return {
                form: {
                    account: '',
                    password: '',
                },
                logining: false,
                openId: ''
                code: '',
                show: false
            }
        },
        onLoad() {
            // uni.login({
            //     success: data => {
            //         this.wxLogin(data.code)
            //     },
            //     fail: err => {
            //         uni.$u.toast(err)
            //     }
            // })
            var that = this
            uni.login({
                provider: 'weixin',
                success: function (loginRes) {
                    // console.log(loginRes);
                    that.code = loginRes.code
                    that.show = true
                }
            });
        },
        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)
            //         })
            // }
            onMessage(e) {
                console.log('12345654321')
            }
        }
    }
</script>
<style lang="scss" scoped>
    .index {
        width: 100vw;
        height: 100vh;
    }
</style>
minipro_standard/pages/mine/mine.vue
@@ -5,14 +5,14 @@
            <image src="@/static/2@2x.png" mode="widthFix" />
            <div class="box_info_box">
                <text>张三</text>
                <div class="box_info_box_x">
                <div class="box_info_box_x" @click="show = true">
                    <text>豆米科技</text>
                    <image src="@/static/mine_ic_change@2x.png" alt="" />
                </div>
            </div>
        </div>
        <div class="box_function">
            <div class="box_function_item" v-for="(item, index) in MENU" :key="index">
            <div class="box_function_item" v-for="(item, index) in MENU" :key="index" @click="jump(item.url)">
                <div class="box_function_item_left">
                    <image :src="item.icon" alt="" />
                    <text>{{item.name}}</text>
@@ -24,6 +24,8 @@
        </div>
        <div class="box_out"><text>退出登录</text></div>
    </div>
    <!-- éƒ¨é—¨é€‰æ‹©å™¨ -->
    <u-picker :show="show" :columns="columns" @confirm="confirm"></u-picker>
    <myTabbar :index="2" />
</view>
</template>
@@ -37,28 +39,31 @@
        data() {
            return {
                MENU: [
                    { name: '个人信息', url: '/personal/personalInformation', icon: require('@/static/mine_ic_gerenxinxi@2x.png') },
                    { name: '个人信息', url: '/pages/personal/personal', icon: require('@/static/mine_ic_gerenxinxi@2x.png') },
                    // { name: '系统通知', url: '', icon: require('@/assets/icon/mine_ic_xitonggonggao@2x.png') },
                    { name: '更新手机号', url: '/personal/updatePhone', icon: require('@/static/mine_ic_shoujihao@2x.png') },
                    { name: '更新邮箱号', url: '/personal/updateMailbox', icon: require('@/static/mine_ic_youxianghao@2x.png') },
                    { name: '更新手机号', url: '/pages/updatePhone/updatePhone', icon: require('@/static/mine_ic_shoujihao@2x.png') },
                    { name: '更新邮箱号', url: '/pages/updateMailbox/updateMailbox', icon: require('@/static/mine_ic_youxianghao@2x.png') },
                    { name: '扫码绑定账号', url: '', icon: require('@/static/mine_ic_bangding@2x.png') },
                    { name: '修改密码', url: '/personal/changePassword', icon: require('@/static/mine_ic_xiugaimima@2x.png') },
                    { name: '修改密码', url: '/pages/changePassword/changePassword', icon: require('@/static/mine_ic_xiugaimima@2x.png') },
                ],
                img: require('@/static/mine_bg@2x.png')
                img: require('@/static/mine_bg@2x.png'),
                show: false,
                columns: [
                    ['中国', '美国', '日本']
                ]
            }
        },
        onLoad() {
            uni.hideTabBar()
            // uni.login({
            //     success: data => {
            //         this.wxLogin(data.code)
            //     },
            //     fail: err => {
            //         uni.$u.toast(err)
            //     }
            // })
        },
        methods: {
            jump(url) {
                uni.navigateTo({ url })
            },
            confirm(val) {
                console.log(val)
                this.show = false
            }
        }
    }
</script>
minipro_standard/pages/personal/personal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
<template>
    <view class="info">
        <view class="info_portrait">
            <image src="@/static/2@2x.png" mode="widthFix" />
            <text>用户名</text>
        </view>
        <view class="info_list">
            <view class="info_list_item">
                <text>昵称</text>
                <text>暂无昵称</text>
            </view>
            <view class="info_list_item">
                <text>手机号</text>
                <text>暂无手机号</text>
            </view>
            <view class="info_list_item">
                <text>所属部门</text>
                <text>暂无所属部门</text>
            </view>
            <view class="info_list_item">
                <text>岗位</text>
                <text>暂无岗位</text>
            </view>
            <view class="info_list_item">
                <text>当前组织</text>
                <text>暂无组织</text>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
            };
        }
    }
</script>
<style lang="scss" scoped>
.info {
    padding: 30rpx;
    position: absolute;
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    background: white;
    .info_portrait {
        display: flex;
        align-items: center;
        flex-direction: column;
        margin-top: 60rpx;
        image {
            width: 140rpx;
            height: 140rpx;
            margin-bottom: 30rpx;
        }
        text {
            font-size: 30rpx;
            font-weight: 400;
            color: #222222;
        }
    }
    .info_list {
        margin-top: 30rpx;
        .info_list_item {
            height: 98rpx;
            display: flex;
            align-items: center;
            justify-content: space-between;
            border-bottom: 1rpx solid #E5E5E5;
            text {
                &:first-child {
                    font-size: 30rpx;
                    font-weight: 400;
                    color: #777777;
                }
                &:last-child {
                    font-size: 28rpx;
                    font-weight: 400;
                    color: #222222;
                }
            }
        }
    }
}
</style>
minipro_standard/pages/updateMailbox/updateMailbox.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
<template>
    <view class="password">
        <view class="password_tip">
            <image src="@/static/password_ic_tip@2x.png" mode="widthFix" />
            <text>绑定邮箱号可以更好地保护您的账户安全,保护个人信息不被侵害。</text>
        </view>
        <view class="password_list">
            <view class="password_list_item">
                <text>当前绑定</text>
                <view class="password_list_item_box">
                    <input type="text" disabled v-model="form.currentMailbox" />
                </view>
            </view>
            <view class="password_list_item">
                <text>新邮箱号</text>
                <view class="password_list_item_box">
                    <input type="text" v-model="form.newMailbox" placeholder="请输入新的邮箱" />
                </view>
            </view>
            <view class="password_list_item">
                <text>验证码</text>
                <view class="password_list_item_box">
                    <input type="text" v-model="form.verificationCode" maxlength="4" placeholder="请输入验证码">
                    <p @click="getVerificationCode" v-if="!code.isOpen">获取验证码</p>
                    <p @click="getVerificationCode" v-else>{{code.num}}</p>
                </view>
            </view>
        </view>
        <view class="password_footer">
            <button v-preventReClick class="password_footer_submit">
                <text>完成</text>
            </button>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                form: {
                    currentMailbox: '',
                    newMailbox: '',
                    verificationCode: ''
                }
            };
        }
    }
</script>
<style lang="scss" scoped>
    .password {
        position: absolute;
        width: 100%;
        height: 100%;
        background: white;
        .password_tip {
            padding: 20rpx 30rpx;
            display: flex;
            background: #F7F7F7;
            box-sizing: border-box;
            image {
                width: 24rpx;
                height: 24rpx;
                margin-right: 10rpx;
                margin-top: 8rpx;
            }
            text {
                font-size: 24rpx;
                font-weight: 400;
                color: #666666;
            }
        }
        .password_list {
            padding: 0 30rpx;
            .password_list_item {
                display: flex;
                align-items: center;
                height: 90rpx;
                border-bottom: 1rpx solid #E5E5E5;
                text {
                    width: 150rpx;
                    flex-shrink: 0;
                    font-size: 30rpx;
                    font-weight: 400;
                    color: #222222;
                }
                .password_list_item_box {
                    display: flex;
                    justify-content: space-between;
                    flex: 1;
                    input {
                        border: none;
                        font-size: 30rpx;
                    }
                    input::-webkit-input-placeholder {
                        font-size: 28rpx;
                        font-weight: 400;
                        color: #B2B2B2;
                    }
                    p {
                        font-size: 26rpx;
                        font-weight: 400;
                        color: #4275FC;
                    }
                }
            }
        }
        .password_footer {
            margin-top: 80rpx;
            padding: 0 30rpx;
            .password_footer_submit {
                width: 100%;
                height: 88rpx;
                border: none;
                background: #4275FC;
                box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.08);
                border-radius: 8rpx;
                display: flex;
                align-items: center;
                justify-content: center;
                text {
                    font-size: 30rpx;
                    font-weight: 500;
                    color: #FFFFFF;
                }
            }
        }
    }
</style>
minipro_standard/pages/updatePhone/updatePhone.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
<template>
    <view class="password">
        <view class="password_tip">
            <image src="@/static/password_ic_tip@2x.png" alt="" />
            <text>绑定手机号可以更好地保护您的账户安全,保护个人信息不被侵害。</text>
        </view>
        <view class="password_list">
            <view class="password_list_item">
                <text>当前绑定</text>
                <view class="password_list_item_box">
                    <input type="number" disabled v-model="form.currentPhone" maxlength="11">
                </view>
            </view>
            <view class="password_list_item">
                <text>新手机号</text>
                <view class="password_list_item_box">
                    <input type="text" v-model="form.newPhone" maxlength="11" placeholder="请输入新手机号">
                </view>
            </view>
            <view class="password_list_item">
                <text>验证码</text>
                <view class="password_list_item_box">
                    <input type="text" v-model="form.verificationCode" maxlength="4" placeholder="请输入手机验证码">
                    <p @click="getVerificationCode" v-if="!code.isOpen">获取验证码</p>
                    <p @click="getVerificationCode" v-else>{{code.num}}</p>
                </view>
            </view>
        </view>
        <view class="password_footer">
            <button v-preventReClick class="password_footer_submit" @click="submit">
                <text>完成</text>
            </button>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                form: {
                    currentPhone: '',
                    newPhone: '',
                    verificationCode: ''
                }
            };
        }
    }
</script>
<style lang="scss" scoped>
    .password {
        width: 100%;
        .password_tip {
            padding: 20rpx 30rpx;
            display: flex;
            background: #F7F7F7;
            box-sizing: border-box;
            image {
                width: 24rpx;
                height: 24rpx;
                margin-right: 10rpx;
                margin-top: 8rpx;
            }
            text {
                font-size: 24rpx;
                font-weight: 400;
                color: #666666;
            }
        }
        .password_list {
            padding: 0 30rpx;
            .password_list_item {
                display: flex;
                align-items: center;
                height: 90rpx;
                border-bottom: 1rpx solid #E5E5E5;
                text {
                    width: 150rpx;
                    flex-shrink: 0;
                    font-size: 30rpx;
                    font-weight: 400;
                    color: #222222;
                }
                .password_list_item_box {
                    display: flex;
                    justify-content: space-between;
                    flex: 1;
                    input {
                        border: none;
                        font-size: 30rpx;
                    }
                    input::-webkit-input-placeholder {
                        font-size: 28rpx;
                        font-weight: 400;
                        color: #B2B2B2;
                    }
                    p {
                        font-size: 26rpx;
                        font-weight: 400;
                        color: #4275FC;
                    }
                }
            }
        }
        .password_footer {
            margin-top: 80rpx;
            padding: 0 30rpx;
            .password_footer_submit {
                width: 100%;
                height: 88rpx;
                border: none;
                background: #4275FC;
                box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.08);
                border-radius: 8rpx;
                display: flex;
                align-items: center;
                justify-content: center;
                text {
                    font-size: 30rpx;
                    font-weight: 500;
                    color: #FFFFFF;
                }
            }
        }
    }
</style>
platform_web/package.json
@@ -5,7 +5,7 @@
  "scripts": {
    "serve": "vue-cli-service serve",
    "build:pro": "vue-cli-service build",
    "build:staging": "vue-cli-service build --mode staging",
    "build:dev": "vue-cli-service build --mode staging",
    "lint": "vue-cli-service lint",
    "fix": "eslint --ext .js,.vue src --fix"
  },
platform_web/src/components/business/OperaClientDetailWindow.vue
@@ -6,15 +6,15 @@
    @confirm="confirm"
  >
    <div class="title-style">客户信息 <div class="tips">{{form.oepnType ? '正式' : '体验' }}</div><div class="tips">有效期:{{ form.oepnValidDate.substring(0, form.oepnValidDate.length-9) }}</div></div>
    <el-descriptions direction="horizontal" :column="1">
      <el-descriptions-item label="客户名称">{{ form.orgName }}</el-descriptions-item>
      <el-descriptions-item label="客户简称">{{ form.remark }}</el-descriptions-item>
      <el-descriptions-item label="主登录账号">{{ form.phone }}</el-descriptions-item>
      <el-descriptions-item label="所在地址">{{ form.addr }}</el-descriptions-item>
      <el-descriptions-item label="企业信用代码">{{ form.creditCode }}</el-descriptions-item>
      <el-descriptions-item label="联系人">{{ form.linkName }} {{ form.linkPhone }}</el-descriptions-item>
      <el-descriptions-item label="销售人员">{{ form.salespersonName }} {{ form.salespersonmobile }}</el-descriptions-item>
      <el-descriptions-item label="营业执照">
    <el-descriptions direction="horizontal" :column="1" :colon="false">
      <el-descriptions-item label="客户名称:">{{ form.orgName }}</el-descriptions-item>
      <el-descriptions-item label="客户简称:">{{ form.remark }}</el-descriptions-item>
      <el-descriptions-item label="主登录账号:">{{ form.phone }}</el-descriptions-item>
      <el-descriptions-item label="所在地址:">{{ form.addr }}</el-descriptions-item>
      <el-descriptions-item label="企业信用代码:">{{ form.creditCode }}</el-descriptions-item>
      <el-descriptions-item label="联系人:">{{ form.linkName }} {{ form.linkPhone }}</el-descriptions-item>
      <el-descriptions-item label="销售人员:">{{ form.salespersonName }} {{ form.salespersonmobile }}</el-descriptions-item>
      <el-descriptions-item label="营业执照:">
        <!-- {{ form.fileurlfull }} -->
        <el-image
          v-if="form.fileStoreAddr"
@@ -24,7 +24,7 @@
          :preview-src-list="[form.fileurlfull]"
        ></el-image>
      </el-descriptions-item>
      <el-descriptions-item label="系统访问地址">
      <el-descriptions-item label="系统访问地址:">
        <a :href="form.systemUrl" target="_blank" rel="noopener noreferrer">{{ form.systemUrl }}</a>
        <span style="cursor: pointer; margin-left: 10px;" @click="copy">复制</span>
      </el-descriptions-item>
@@ -78,7 +78,7 @@
    open (target) {
      this.title = '客户资料'
      this.visible = true
      // debugger
      debugger
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
@@ -102,7 +102,10 @@
<style lang="scss" scoped>
::v-deep .el-descriptions-item__label {
  width: 90px;
  width: 85px;
  text-align: right;
  display: flex;
  flex-direction: row-reverse;
}
.title-style {
  font-weight: 500;
platform_web/src/components/business/OperaClientMangerWindow.vue
@@ -54,8 +54,8 @@
        </el-form-item>
      </div>
       <div class="tip-line">
          <el-form-item label="开通用户数" prop="openUserNum">
            <el-input v-model="form.openUserNum" placeholder="请输入开通用户数"   v-trim/>
          <el-form-item label="人数限制" prop="openUserNum">
            <el-input v-model="form.openUserNum" placeholder="请输入人数限制"   v-trim/>
             æ³¨ï¼šä¸º0不限制人数
          </el-form-item>
        </div>
@@ -150,7 +150,7 @@
        linkPhone: '',
        fileStoreAddr: '',
        fileurlfull: '',
        openUserNum:0
        openUserNum: 10
        // fileList: [],
      },
      isEdit: false,
platform_web/src/views/business/clientManger.vue
@@ -51,11 +51,11 @@
            <span>{{ row.oepnType == 1 ? '正式' : '试用' }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="openUserNum" label="人数限制" align="center" min-width="140px"></el-table-column>
        <el-table-column prop="phone" label="主账号" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="linkName" label="联系人" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="linkPhone" label="联系电话" align="center" min-width="120px"></el-table-column>
        <el-table-column prop="oepnValidDate" label="有效期" align="center" min-width="140px"></el-table-column>
        <el-table-column prop="openUserNum" label="开通用户数" align="center" min-width="140px"></el-table-column>
        <el-table-column prop="salespersonName" label="销售人员" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="createTime" label="创建时间" align="center" min-width="140px"></el-table-column>
        <el-table-column prop="status" label="状态" align="center" min-width="100px">
@@ -142,8 +142,13 @@
      // this.$refs.operaApplianceChangeDetailWindow.open('更换单详情', row)
      findCompanyInfo({ CompanyId: row.id })
        .then(res => {
          const element = isEdit ? this.$refs.operaClientMangerWindow : this.$refs.operaClientDetailWindow
          element.open(res)
          if (isEdit) {
            this.$refs.operaClientMangerWindow.open({...res, openUserNum: row.openUserNum})
          } else {
            this.$refs.operaClientDetailWindow.open(res)
          }
          // const element = isEdit ? this.$refs.operaClientMangerWindow : this.$refs.operaClientDetailWindow
          // element.open({...res, ...row})
        })
        .catch(err => {
          this.$tip.error(err)
platform_web/src/views/system/loginLog.vue
@@ -5,7 +5,7 @@
      <el-form-item label="登录用户名" prop="loginUsername">
        <el-input v-model="searchForm.loginUsername" placeholder="请输入登录用户名" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="登录IP" prop="ip">
      <!-- <el-form-item label="登录IP" prop="ip">
        <el-input v-model="searchForm.ip" placeholder="请输入登录IP" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="服务器IP" prop="serverIp">
@@ -16,8 +16,8 @@
          <el-option value="true" label="登录成功"/>
          <el-option value="false" label="登录失败"/>
        </el-select>
      </el-form-item>
      <el-form-item label="来源" prop="success">
      </el-form-item> -->
      <el-form-item label="来源" prop="orgin">
        <el-select v-model="searchForm.orgin" placeholder="请选择登录来源" clearable @change="search">
          <el-option value="0" label="PC登陆"/>
          <el-option value="1" label="钉钉平台"/>
@@ -26,7 +26,7 @@
          <el-option value="4" label="微信小程序"/>
        </el-select>
      </el-form-item>
      <el-form-item label="登录时间" prop="loginTime">
      <!-- <el-form-item label="登录时间" prop="loginTime">
        <el-date-picker
          v-model="searchDateRange"
          type="datetimerange"
@@ -36,10 +36,10 @@
          end-placeholder="结束时间"
          @change="handleSearchTimeChange"
        ></el-date-picker>
      </el-form-item>
      </el-form-item> -->
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button :loading="isWorking.export" @click="exportExcel">导出</el-button>
        <!-- <el-button :loading="isWorking.export" @click="exportExcel">导出</el-button> -->
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
@@ -50,16 +50,23 @@
        :data="tableData.list"
        stripe
        border
        :default-sort="{prop: 'loginTime', order: 'descending'}"
        @sort-change="handleSortChange"
      >
      <!-- :default-sort="{prop: 'loginTime', order: 'descending'}" -->
        <el-table-column prop="orgin" label="来源" align="center" min-width="100px">
           <template slot-scope="{row}">
            {{row.orgin | orginText}}
          </template>
        </el-table-column>
        <el-table-column prop="companyUserId" label="用户id" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="companyName" label="企业名称" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="loginUsername" label="登录用户名" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="companyUserName" label="登录用户名" align="center" min-width="100px">
          <template slot-scope="{row}">
            {{ row.companyUserName || row.loginUsername }}
          </template>
        </el-table-column>
        <el-table-column prop="ip" label="登录IP" align="center" min-width="120px"></el-table-column>
        <el-table-column prop="location" label="登录地址" align="center" min-width="160px"></el-table-column>
        <el-table-column prop="clientInfo" label="客户端" align="center" min-width="160px"></el-table-column>
@@ -73,7 +80,11 @@
            {{row.success | statusText}}
          </template>
        </el-table-column>
        <el-table-column prop="reason" label="失败原因" min-width="160px"></el-table-column>
        <el-table-column prop="reason" label="失败原因" min-width="160px" show-overflow-tooltip>
          <template slot-scope="{row}">
            <span class="lang-title-style">{{ row.reason }}</span>
          </template>
        </el-table-column>
      </el-table>
      <pagination
          @size-change="handleSizeChange"
@@ -133,15 +144,7 @@
  },
  methods: {
    // æ—¶é—´æœç´¢èŒƒå›´å˜åŒ–
    handleSearchTimeChange (value) {
      this.searchForm.startTime = null
      this.searchForm.endTime = null
      if (value != null) {
        this.searchForm.startTime = value[0]
        this.searchForm.endTime = value[1]
      }
      this.search()
    }
  },
  created () {
    this.config({
@@ -155,6 +158,24 @@
      }]
    })
    this.search()
  },
  methods: {
    handleSearchTimeChange (value) {
      this.searchForm.startTime = null
      this.searchForm.endTime = null
      if (value != null) {
        this.searchForm.startTime = value[0]
        this.searchForm.endTime = value[1]
      }
      this.search()
    },
    reset() {
      this.$refs.searchForm.resetFields()
      this.searchDateRange = []
      this.searchForm.startTime = ''
      this.searchForm.endTime = ''
      this.search()
    }
  }
}
</script>
screen_standard/src/views/index.vue
@@ -285,9 +285,11 @@
    .then(res => {
      if (res.length > 0) {
        data.baseNum = res[0].doneNum
        data.production = res
        start()
      } else {
        data.baseNum = 0
      }
      data.production = res
      data.fifthScroll = true
    })
  // ä»“库实时余量统计
  // getStockList(companyId.value, departId.value)
@@ -405,6 +407,11 @@
        fontSize: 12
      }
    },
    grid: {
      top: 40,
      bottom: 30,
      left: 60
    },
    xAxis: {
      type: 'category',
      boundaryGap: false,
@@ -412,6 +419,15 @@
        lineStyle: {
          width: 0.5,
          color: ['#fff']
        }
      },
      axisLine: {
        show: true,
        onZero: true,
        lineStyle: {
          width: 0.5,
          color: '#fff',
          opacity: .5
        }
      },
      axisLabel: {
@@ -428,6 +444,15 @@
        lineStyle: {
          width: 0.5,
          color: ['#fff']
        }
      },
      axisLine: {
        show: true,
        onZero: true,
        lineStyle: {
          width: 1,
          color: '#fff',
          opacity: .5
        }
      },
      axisLabel: {
@@ -767,18 +792,29 @@
  if (scrollDom.offsetHeight == 0) {
    scrollDom = scrollContainer4.value
  } else {
    // console.log(bottom1.value.height);
    let num = scrollContainer4.value.offsetHeight / 35;
    // alert(scrollDom.children.length  +"---------------"+num)
    // å¦‚果列表数量过少不进行滚动
    // console.log(scrollDom.offsetHeight);
    let num = scrollDom.offsetHeight / 35;
    num = num + (scrollDom.offsetHeight % 35  > 0 ? 1 : 0)
    // console.log('----------');
    // console.log('scrollDom.children.length', scrollDom.children.length)
    // console.log('scrollDom.offsetHeight % 35', scrollDom.offsetHeight % 35)
    // console.log('num', num)
    // console.log('----------');
    // // å¦‚果列表数量过少不进行滚动
    if (scrollDom.children.length <= num) {
      clearTimeout(timer4.value)
      return
    }
    // ç»„件进行滚动
    scrollDom.scrollTop += 2
    scrollDom.scrollTop += 1
    // åˆ¤æ–­æ˜¯å¦æ»šåŠ¨åˆ°åº•éƒ¨
    if (scrollDom.scrollTop+1 >= (scrollDom.scrollHeight - scrollDom.clientHeight)) {
    if (scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight)) {
      console.log('scrollDom.scrollTop', scrollDom.scrollTop);
      console.log('scrollDom.scrollHeight', scrollDom.scrollHeight);
      console.log('scrollDom.clientHeight', scrollDom.clientHeight );
    // if (scrollDom.scrollTop >= 35) {
      // èŽ·å–ç»„ä»¶ç¬¬ä¸€ä¸ªèŠ‚ç‚¹
      let first = scrollDom.children[0]
      // åˆ é™¤èŠ‚ç‚¹
@@ -794,8 +830,23 @@
// })
onMounted(() => {
  if (!departId.value) return;
  timer5.value = setInterval(init(), 60000)
  if (departId.value) {
    console.log('onMounted');
    init()
    timer5.value = setInterval(init, 60000)
    timer.value = setInterval(scrillAction, 100)
  }
  window.addEventListener('resize', () => {
    setTypeChart()
    setDayChart()
  })
})
onUnmounted(() => {
  clearTimeout(timer.value)
  clearTimeout(timer5.value)
})
</script>
screen_standard/src/views/process.vue
@@ -328,6 +328,15 @@
          color: ['#fff']
        }
      },
      axisLine: {
        show: true,
        onZero: true,
        lineStyle: {
          width: 1,
          color: '#fff',
          opacity: .5
        }
      },
      axisLabel: {
        textStyle: {
          color: '#fff'
@@ -344,6 +353,15 @@
          color: ['#fff']
        }
      },
      axisLine: {
        show: true,
        onZero: true,
        lineStyle: {
          width: 1,
          color: '#fff',
          opacity: .5
        }
      },
      axisLabel: {
        textStyle: {
          color: '#fff'
screen_standard/vite.config.js
@@ -11,10 +11,10 @@
// https://vitejs.dev/config/
export default defineConfig(({mode, command}) => {
  let env = loadEnv(mode, process.cwd(), '')
  console.log('-------');
  console.log(env.VITE_BASE_PATH);
  console.log(env.VITE_BASE_PATH.replace(env.VITE_BASE_PATH, ''));
  console.log('-------');
  // console.log('-------');
  // console.log(env.VITE_BASE_PATH);
  // console.log(env.VITE_BASE_PATH.replace(env.VITE_BASE_PATH, ''));
  // console.log('-------');
  return {
    base:env.VITE_BASE_CONTEXT,
    plugins: [
@@ -42,6 +42,8 @@
  
    // æœ¬åœ°è¿è¡Œé…ç½®ï¼ŒåŠåå‘代理配置
    server: {
      host: '192.168.0.3',
      port: '8080',
      cors: true, // é»˜è®¤å¯ç”¨å¹¶å…è®¸ä»»ä½•源
      open: true, // åœ¨æœåŠ¡å™¨å¯åŠ¨æ—¶è‡ªåŠ¨åœ¨æµè§ˆå™¨ä¸­æ‰“å¼€åº”ç”¨ç¨‹åº
      //反向代理配置,注意rewrite写法,开始没看文档在这里踩了坑
web_standard/.env.development
@@ -14,14 +14,14 @@
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 = 'http://192.168.0.35:10021/'
# æµ‹è¯•服务器
# VUE_APP_BASE_URL = 'https://dmtest.ahapp.net/doumeeplant_api/'
web_standard/coderd.json
@@ -4,7 +4,7 @@
    "alias": "eva",
    "command": "page",
    "option": {
      "resources": "salary_param"
      "resources": "unqualified_record"
    }
  }
}
web_standard/package.json
@@ -4,8 +4,8 @@
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:staging": "vue-cli-service build --mode staging",
    "build:pro": "vue-cli-service build",
    "build:dev": "vue-cli-service build --mode staging",
    "lint": "vue-cli-service lint",
    "fix": "eslint --ext .js,.vue src --fix"
  },
web_standard/public/template/device_import_template.xlsx
Binary files differ
web_standard/src/api/business/unqualifiedRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/unqualifiedRecord/page', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/business/unqualifiedRecord/exportExcel', data, {
    trim: true,
    download: true
  })
}
web_standard/src/api/ext/categoryUnionExt.js
@@ -26,7 +26,7 @@
}
// æŸ¥è¯¢æ‰€æœ‰
export function checkAllList (data) {
  return request.post('/ext/categoryUnionExt/checkAllList', data)
  return request.post('/ext/categoryExt/list', data)
}
// åˆ é™¤
web_standard/src/api/ext/workorderRecordPutExt.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/ext/workorderRecordExt/page', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/ext/workorderRecordExt/exportExcelFeeding', data, {
    trim: true,
    download: true
  })
}
web_standard/src/components/common/Header.vue
@@ -200,8 +200,8 @@
     * é€€å‡ºç™»å½•
     */
    logout () {
      console.log(this.$store.state.companyId);
      debugger
      // console.log(this.$store.state.companyId);
      // debugger
      logout()
        .then(() => {
          let companyId = this.$store.state.userInfo.company.id
web_standard/src/components/common/Menu.vue
@@ -30,7 +30,7 @@
  name: 'Menu',
  components: { Scrollbar, MenuItems },
  computed: {
    ...mapState(['menuData']),
    ...mapState(['menuData', 'userInfo']),
    // é€‰ä¸­çš„菜单index
    activeIndex () {
      let path = this.$route.path
@@ -59,6 +59,10 @@
     */
    handleSelect (menuIndex) {
      const menuConfig = this.__getMenuConfig(menuIndex, 'index', this.menuData.list)
      if (menuConfig.url.includes('http')) {
        window.open(`${menuConfig.url}?companyId=${this.userInfo.company.id}`, '_black')
        return
      }
      // æ‰¾ä¸åˆ°é¡µé¢
      try {
        require('@/views' + menuConfig.url)
web_standard/src/components/ext/OperaPlansDetailExtWindow.vue
@@ -31,7 +31,7 @@
          </el-form-item>
          <el-form-item label="发布日期">{{ form.publishDate }}</el-form-item>
          <el-form-item label="计划人员">{{ form.usermodel.realname }}</el-form-item>
          <el-form-item label="分配数量">{{ form.workorderDistributNum }}</el-form-item>
          <el-form-item label="分配数量">{{ form.distributNum }}</el-form-item>
          <el-form-item label="完工数量">{{ form.doneNum }}</el-form-item>
        </el-form>
      </div>
web_standard/src/components/ext/OperaUnitExtWindow.vue
@@ -29,7 +29,7 @@
          </el-option>
        </el-select>
      </el-form-item>-->
      <el-form-item v-else label="单位类型" prop="types">
      <!-- <el-form-item label="单位类型" prop="types">
        <el-select v-model="form.types" multiple filterable clearable placeholder="请选择">
          <el-option
            v-for="(item, index) in unitTypes"
@@ -38,7 +38,7 @@
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      </el-form-item> -->
    </el-form>
  </GlobalWindow>
</template>
@@ -58,7 +58,7 @@
        name: '',
        attributeData: 0,
        //types: [],
     //   type: null
        type: 1
      },
      // éªŒè¯è§„则
      rules: {
@@ -97,7 +97,7 @@
        }
        // è°ƒç”¨æ–°å»ºæŽ¥å£
        const newForm = JSON.parse(JSON.stringify(this.form))
        newForm.types = newForm.types.join(',')
        // newForm.types = newForm.types.join(',')
        this.isWorking = true
        this.api.create(newForm)
          .then(() => {
@@ -115,4 +115,7 @@
    }
  }
}
/**
 *
 */
</script>
web_standard/src/components/ext/OperaWInboundExtWindow.vue
@@ -1,11 +1,5 @@
<template>
  <GlobalWindow
    :title="title"
    width="80%"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
  <GlobalWindow :title="title" width="80%" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <div style="margin-bottom: 10px">
      <span class="title-add-style" style="vertical-align:middle">入库信息</span>
      <!-- <el-button type="primary" style="margin-left: 10px;vertical-align:middle">选择来源单据</el-button> -->
@@ -19,36 +13,24 @@
          <el-input v-model="form.originCode" disabled placeholder="选择来源单据后默认带出" v-trim/>
        </el-form-item> -->
        <el-form-item label="计划入库日期" prop="planDate">
          <el-date-picker
            v-model="form.planDate"
            value-format="yyyy-MM-dd"
            placeholder="选择日期"
            :picker-options="pickerOptions"
          ></el-date-picker>
          <el-date-picker v-model="form.planDate" value-format="yyyy-MM-dd" placeholder="选择日期"
            :picker-options="pickerOptions"></el-date-picker>
        </el-form-item>
        <el-form-item label="入库类型" prop="type">
          <el-select v-model="form.type" :disabled="disabled" placeholder="请选择入库类型">
            <el-option
              v-for="(item, index) in type"
              :key="index"
              :label="item.name"
              :value="item.id">
            <el-option v-for="(item, index) in type" :key="index" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="入库仓库" prop="warehouseId">
          <el-select v-model="form.warehouseId" filterable clearable placeholder="请选择入库仓库" @change="selectWare">
            <el-option
              v-for="(item, index) in tempWarehouses"
              :key="index"
              :label="item.name"
              :value="item.id">
            <el-option v-for="(item, index) in tempWarehouses" :key="index" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <div class="mark">
          <el-form-item label="单据摘要" prop="abstracts">
            <el-input v-model="form.abstracts" placeholder="请输入单据摘要" v-trim/>
            <el-input v-model="form.abstracts" placeholder="请输入单据摘要" v-trim />
          </el-form-item>
        </div>
      </el-form>
@@ -61,11 +43,7 @@
      <li><el-button type="primary" @click="addMaterial">选择物料</el-button></li>
    </ul>
    <el-table
      :data="form.woutboundInBodyBeanList"
      border
      stripe
    >
    <el-table :data="form.woutboundInBodyBeanList" border stripe>
      <el-table-column align="center" label="序号" type="index" />
      <el-table-column prop="code" label="物料编码" show-overflow-tooltip min-width="160px">
        <template slot-scope="{row}">
@@ -80,65 +58,46 @@
      <el-table-column v-if="whLocation.length" label="货位" min-width="100px">
        <template slot-scope="{row}">
          <el-select v-model="row.locationId" filterable placeholder="请选择" @select="selectLocation">
            <el-option
              v-for="(item, index) in whLocation"
              :key="index"
              :label="item.unionName"
              :value="item.id">
            <el-option v-for="(item, index) in whLocation" :key="index" :label="item.unionName" :value="item.id">
            </el-option>
          </el-select>
        </template>
      </el-table-column>
      <el-table-column label="质量属性" min-width="100px">
        <template slot-scope="scope">
          <el-select v-model="scope.row.qualityType" :disabled='canSelect(scope.$index)' filterable clearable placeholder="请选择">
            <el-option
              v-for="(item, index) in properties"
              :key="index"
              :label="item.name"
              :value="item.id">
          <el-select v-model="scope.row.qualityType" :disabled='canSelect(scope.$index)' filterable clearable
            placeholder="请选择">
            <el-option v-for="(item, index) in properties" :key="index" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
        </template>
      </el-table-column>
       <el-table-column  v-if="winType==2" label="工序" min-width="100px">
              <template slot-scope="{row}">
                <el-select v-model="row.procedureId" filterable placeholder="请选择" @select="selectProcedure">
                  <el-option
                    v-for="(item, index) in row.procedureList"
                    :key="index"
                    :label="item.name"
                    :value="item.id">
                  </el-option>
                </el-select>
              </template>
            </el-table-column>
      <el-table-column v-if="winType == 2" label="工序" min-width="100px">
        <template slot-scope="{row}">
          <el-select v-model="row.procedureId" :disabled="!row.procedureList" filterable placeholder="请选择">
            <el-option v-for="(item, index) in row.procedureList" :key="index" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
        </template>
      </el-table-column>
      <el-table-column label="批次号" min-width="100px">
        <template slot-scope="{row}">
          <el-input v-model="row.batch" placeholder="请输入批次号" v-trim/>
          <el-input v-model="row.batch" placeholder="请输入批次号" v-trim />
        </template>
      </el-table-column>
      <el-table-column prop="umodelName" label="单位" min-width="60px"></el-table-column>
      <el-table-column label="入库数量" min-width="100px">
        <template slot-scope="{row}">
          <el-input v-model="row.num" type="number" placeholder="入库数量" v-trim/>
          <el-input v-model="row.num" type="number" placeholder="入库数量" v-trim />
        </template>
      </el-table-column>
      <el-table-column
        label="操作"
        min-width="60px"
        align="center"
        fixed="right"
      >
      <el-table-column label="操作" min-width="60px" align="center" fixed="right">
        <template slot-scope="{row}">
          <span class="delete-button-style" @click="deleteMaterail(row)">删除</span>
        </template>
      </el-table-column>
    </el-table>
    <SelectMaterail
      ref="selectMaterail"
      @selectData="selectData"
    ></SelectMaterail>
    <SelectMaterail ref="selectMaterail" @selectData="selectData"></SelectMaterail>
  </GlobalWindow>
</template>
@@ -155,7 +114,7 @@
    GlobalWindow,
    SelectMaterail: () => import('@/components/ext/SelectMaterail')
  },
  data () {
  data() {
    return {
      // è¡¨å•数据
      form: {
@@ -166,7 +125,7 @@
        origin: 0,
        woutboundInBodyBeanList: []
      },
      winType:0,
      winType: 0,
      disabled: false,
      pickerOptions: {},
      tempWarehouses: [],
@@ -179,29 +138,29 @@
      activeName: 'first',
      whLocation: [],
      type: [
        {name:'采购入库', id: 25}
        { name: '采购入库', id: 25 }
      ],
      tempMaterials: [
      ],
      selectedMaterails: [],
      properties: [
        // 0 1不良 2报废
        {name:'合格', id: 0},
        {name:'不良', id: 1},
        {name:'报废', id: 2},
        { name: '合格', id: 0 },
        { name: '不良', id: 1 },
        { name: '报废', id: 2 },
      ]
    }
  },
  inject: ['warehouses'],
  created () {
  created() {
    this.config({
      api: '/ext/wOutboundExt',
      'field.id': 'id'
    })
    this.pickerOptions.disabledDate = (time) => {
        // ä¸€å¤©
      let tempTime = 3600 * 1000 * 24
      return time.getTime() < new Date()-tempTime
      // ä¸€å¤©
      let tempTime = 3600 * 1000 * 24
      return time.getTime() < new Date() - tempTime
    }
    // queryListByCode('?dicCode=SYSTEM_APPLIANCE_TYPE')
    //   .then(res => {
@@ -230,10 +189,10 @@
      }
      this.__confirmEdit()
    },
    open (title, type = 0) {
    open(title, type = 0) {
      this.title = title
      this.visible = true
      this.winType=type
      this.winType = type
      // æ–°å»º
      this.$nextTick(() => {
        this.$refs.form.resetFields()
@@ -242,16 +201,17 @@
        if (title === '其它入库') {
          this.form.planDate = new Date()
          this.form.type = null
          // this.form.woutboundInBodyBeanList = []
          this.disabled = false
          this.type = [
            { name:'客退检验入库', id: 26 },
            { name:'客返检验入库', id: 27 },
            { name:'库存调整', id: 28 }
            { name: '客退检验入库', id: 26 },
            { name: '客返检验入库', id: 27 },
            { name: '库存调整', id: 28 }
          ]
        } else {
          this.disabled = true
          this.type = [
            { name:'采购入库', id: 25 }
            { name: '采购入库', id: 25 }
          ]
        }
@@ -271,15 +231,15 @@
          this.tempWarehouses = this.warehouses()
        }
      })
    },
    selectWare (v) {
    selectWare(v) {
      // console.log(v)
      getListByWarehouseId(v)
        .then(res => {
          console.log(res)
          this.whLocation = res
          if (this.whLocation.length === 0 ) {
          if (this.whLocation.length === 0) {
            let temQualityType = 0
            for (const item of this.tempWarehouses) {
              if (item.id === v) {
@@ -313,9 +273,9 @@
        .catch(err => {
          console.log(err)
        })
    },
    setQuality (type) {
    setQuality(type) {
      for (const item of this.form.woutboundInBodyBeanList) {
        item.qualityType = type
      }
@@ -351,7 +311,7 @@
      }
      return !cans
    },
    selectLocation (v) {
    selectLocation(v) {
      // console.log(index, row);
      // for (const item of this.whLocation) {
      //   if (item.id === v) {
@@ -380,16 +340,16 @@
      //   }
      // }
    },
    addMaterial () {
    addMaterial() {
      // console.log('增加物料')
      // const ids = this.form.woutboundInBodyBeanList.map(e => { return e.materialId }).join(',')
      this.$refs.selectMaterail.open('选择物料', { ids: '', multiple: true, isPurchase:false,queryType:1 })
      this.$refs.selectMaterail.open('选择物料', { ids: '', multiple: true, isPurchase: false, queryType: 1 })
    },
    deleteMaterail (row) {
    deleteMaterail(row) {
      // console.log('删除物料')
      this.form.woutboundInBodyBeanList.splice(this.form.woutboundInBodyBeanList.indexOf(row), 1)
    },
    selectData (data) {
    selectData(data) {
      // é€‰æ‹©ç‰©æ–™å›žè°ƒ
      console.log(data)
      for (const item of data.selectedMaterails) {
@@ -397,8 +357,8 @@
          code: item.mmodelCode,
          name: item.mmodelUnionName,
          umodelName: item.umodelName,
          procedureList:item.procedureList,
          procedureId:null,
          procedureList: item.procedureList,
          procedureId: item.procedureList ? item.procedureList[0].id : null,
          locationId: this.whLocation.length ? this.whLocation[0].id : null,
          qualityType: this.whLocation.length ? 0 : this.houseProperty,
          materialId: item.id,
@@ -408,14 +368,14 @@
        })
      }
    },
    __confirmCreate () {
    __confirmCreate() {
      this.$refs.form.validate((valid) => {
        if (!this.form.woutboundInBodyBeanList.length) {
          this.$tip.error('至少选择一条物料')
          return
        }
        for (const item of this.form.woutboundInBodyBeanList) {
          if (item.num<=0) {
          if (item.num <= 0) {
            this.$tip.error('入库物料数量必须大于0!')
            return
          }
@@ -449,28 +409,33 @@
.toolbar {
  border-bottom: 1px solid #eee;
  padding-bottom: 10px;
  li {
    display: inline-block;
    margin-right: 6px;
  }
}
.form-data {
  ::v-deep .el-form-item{
  ::v-deep .el-form-item {
    width: 40%;
    margin-right: 1%;
  }
  .mark {
    .el-form-item {
      width: 81%;
      // margin-right: 1%;
    }
  }
  ::v-deep .el-form-item__content {
    width: calc(100% - 134px);
  }
}
.delete-button-style {
    color: red;
    cursor: pointer;
  }
  color: red;
  cursor: pointer;
}
</style>
web_standard/src/components/system/role/PermissionConfigWindow.vue
@@ -69,8 +69,6 @@
     */
    confirm () {
      const selectedPermissions = this.$refs.tree.getCheckedNodes(false, true).filter(item => item.type !== 'module').map(item => item.id)
      console.log(selectedPermissions);
      debugger
      this.isWorking = true
      createRolePermission({
        roleId: this.role.id,
web_standard/src/components/system/user/OperaSystemRoleApplysWindow.vue
@@ -76,8 +76,8 @@
    // ç¡®è®¤é€‰æ‹©æƒé™
    confirm () {
      this.isWorking = true
      console.log(this.selectedIds);
      debugger
      // console.log(this.selectedIds);
      // debugger
      createRolePermission({
        roleId: this.role.id,
        permissionIds: this.selectedIds
web_standard/src/components/system/user/OperaSystemRoleNone.vue
@@ -75,8 +75,6 @@
    // ç¡®è®¤é€‰æ‹©æƒé™
    confirm () {
      this.isWorking = true
      console.log(this.selectedIds);
      debugger
      createRolePermission({
        roleId: this.role.id,
        permissionIds: this.selectedIds,
web_standard/src/layouts/TableLayout.vue
@@ -133,8 +133,13 @@
          line-height: 20px;
          display: flex;
          align-items: center;
          width: 100%;
          // justify-content: center;
        }
      }
      ::v-deep .el-table--small td {
        padding: 0 !important;
      }
      // å¤é€‰æ¡†åˆ—
      .el-table-column--selection {
        .cell {
web_standard/src/views/business/unqualifiedRecord.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
<template>
  <TableLayout :permissions="['business:unqualifiedrecord:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="工单编码" prop="code">
        <el-input v-model="searchForm.code" placeholder="请输入工单编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="不良项" prop="categoryId">
        <el-select v-model="searchForm.categoryId" filterable clearable placeholder="请选择">
          <el-option
            v-for="(item, index) in category"
            :key="index"
            :label="item.name"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:unqualifiedrecord:exportExcel']">
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:unqualifiedrecord:exportExcel']" @click="exportExcel">导出</el-button>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        border
        stripe
      >
        <el-table-column type="index" :index="customIndex" label="序号" align="center" fixed="left" min-width="80px"></el-table-column>
        <el-table-column prop="workOrderCode" label="工单编码" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="materialName" label="物料名称" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="materialCode" label="物料编码" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="proceduresName" label="工序" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="categoryName" label="不良项" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="unqualifiedNum" label="数量" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="createTime" label="创建时间" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="createUserName" label="创建人" align="center" min-width="100px"></el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      </pagination>
    </template>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import { checkAllList } from '@/api/ext/categoryUnionExt'
export default {
  name: 'UnqualifiedRecord',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  data () {
    return {
      // æœç´¢
      searchForm: {
        code: '',
        categoryId: ''
      },
      category: []
    }
  },
  created () {
    this.config({
      module: '工单类-报工不良记录类型表',
      api: '/business/unqualifiedRecord',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
    checkAllList({ cateType: 3 })
      .then(res => {
        this.category = res
      })
      .catch(err => {
        console.log(err)
      })
  },
  methods: {
    customIndex(index) {
      return (this.tableData.pagination.pageIndex-1) * this.tableData.pagination.pageSize + index + 1
    }
  },
}
</script>
web_standard/src/views/ext/appliancesExt.vue
@@ -15,7 +15,7 @@
          <el-option
            v-for="item in appTypes"
            :key="item.id"
            :label="item.combinationName"
            :label="item.name"
            :value="item.id"
          >
          </el-option>
@@ -393,7 +393,7 @@
      'field.main': 'name'
    })
    this.search()
    checkAllList({ bmodelCateType: 2 })
    checkAllList({ cateType: 2 })
      .then(res => {
        this.appTypes = res
      })
web_standard/src/views/ext/deviceExt.vue
@@ -55,6 +55,15 @@
    <template v-slot:table-wrap>
      <ul class="toolbar">
        <li><el-button type="primary" @click="$refs.operaDeviceExtWindow.open('新建设备')" v-permissions="['ext:deviceext:create']">新增</el-button></li>
        <li v-permissions="['ext:deviceExt:importExcel']">
          <ImportButton
            text="导入"
            template-name="device_import_template.xlsx"
            template-path="/template/device_import_template.xlsx"
            action="/ext/deviceExt/importBatch"
            @success="search"
          />
        </li>
        <li>
          <el-button
            type="primary"
@@ -86,12 +95,12 @@
        </el-table-column>
        <el-table-column prop="wpmodel.unionName" label="待生产货位" show-overflow-tooltip min-width="100px">
          <template slot-scope="{row}">
            <span class="long-title-style">{{ row.wpmodel.unionName }}</span>
            <span class="long-title-style">{{ row.wpmodel ? row.wpmodel.unionName : '-' }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="wfmodel.unionName" label="已完工货位" show-overflow-tooltip min-width="100px">
          <template slot-scope="{row}">
            <span class="long-title-style">{{ row.wfmodel.unionName }}</span>
            <span class="long-title-style">{{ row.wfmodel ? row.wfmodel.unionName : '-' }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="stationCode" label="工位编号" min-width="100px"></el-table-column>
@@ -143,6 +152,7 @@
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import ImportButton from '@/components/common/ImportButton'
// import SearchFormCollapse from '@/components/common/SearchFormCollapse'
import Pagination from '@/components/common/Pagination'
import OperaDeviceExtWindow from '@/components/ext/OperaDeviceExtWindow'
@@ -153,7 +163,7 @@
export default {
  name: 'DeviceExt',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDeviceExtWindow, QrCodeLabel },
  components: { TableLayout, Pagination, OperaDeviceExtWindow, ImportButton, QrCodeLabel },
  data () {
    return {
      // æœç´¢
@@ -256,4 +266,7 @@
    }
  }
}
/**
 *
 */
</script>
web_standard/src/views/ext/salaryStatistic.vue
@@ -182,7 +182,6 @@
      return '-'
    },
    customIndex(index) {
      console.log();
      return (this.tableData.pagination.pageIndex-1) * this.tableData.pagination.pageSize + index + 1
    }
  }
web_standard/src/views/ext/workorderPutRecordExt.vue
@@ -111,9 +111,9 @@
        <el-table-column prop="batch" label="生产批次号" min-width="100px"></el-table-column>
        <el-table-column prop="promodel.name" label="工序" min-width="100px"></el-table-column>
        <el-table-column prop="omodel.planNum" label="计划数量" min-width="100px">
          <template slot-scope="{row}">
          <!-- <template slot-scope="{row}">
            <span>{{ row.omodel.planNum + row.umodel.name }}</span>
          </template>
          </template> -->
        </el-table-column>
        <el-table-column prop="procedureName" label="生产员工" show-overflow-tooltip min-width="100px">
          <template slot-scope="{row}">
@@ -218,7 +218,7 @@
  created () {
    this.config({
      module: '投料记录',
      api: '/ext/workorderRecordExt',
      api: '/ext/workorderRecordPutExt',
      'field.id': 'id',
      'field.main': 'name',
      sorts: [{ direction: 'DESC', property: 'CREATE_TIME' }]