lincl 3 年之前
父节点
当前提交
c3a777cf09
共有 36 个文件被更改,包括 1202 次插入296 次删除
  1. 1 1
      mini-pro-web/.env.development
  2. 1 2
      mini-pro-web/.env.production
  3. 27 7
      mini-pro-web/src/api/api-medicineAbinet.js
  4. 44 0
      mini-pro-web/src/api/login.js
  5. 二进制
      mini-pro-web/src/assets/images/beihuo.png
  6. 二进制
      mini-pro-web/src/assets/images/beihuojilu.png
  7. 二进制
      mini-pro-web/src/assets/images/buhuo.png
  8. 二进制
      mini-pro-web/src/assets/images/buhuojilu.png
  9. 二进制
      mini-pro-web/src/assets/images/diandanguanli01_icon.png
  10. 二进制
      mini-pro-web/src/assets/images/diandanguanli_icon.png
  11. 二进制
      mini-pro-web/src/assets/images/shebeigaunli01_icon.png
  12. 二进制
      mini-pro-web/src/assets/images/shebeigaunli_icon.png
  13. 二进制
      mini-pro-web/src/assets/images/yaopingaikuang.png
  14. 40 19
      mini-pro-web/src/components/layout/components/AppBotNav.vue
  15. 26 0
      mini-pro-web/src/mixins/common.js
  16. 3 3
      mini-pro-web/src/router/device.js
  17. 75 30
      mini-pro-web/src/router/index.js
  18. 2 2
      mini-pro-web/src/router/order.js
  19. 1 1
      mini-pro-web/src/store/getters.js
  20. 8 1
      mini-pro-web/src/store/modules/app.js
  21. 1 1
      mini-pro-web/src/views/device/cargoLane/index.vue
  22. 48 3
      mini-pro-web/src/views/device/cargoLane/setting.vue
  23. 176 51
      mini-pro-web/src/views/device/detail.vue
  24. 113 69
      mini-pro-web/src/views/device/index.vue
  25. 2 0
      mini-pro-web/src/views/device/sell.vue
  26. 4 4
      mini-pro-web/src/views/index/Index.vue
  27. 1 1
      mini-pro-web/src/views/login/FotgetPassword.vue
  28. 5 37
      mini-pro-web/src/views/login/Login.vue
  29. 2 2
      mini-pro-web/src/views/login/Register.vue
  30. 47 4
      mini-pro-web/src/views/machine/index.vue
  31. 422 0
      mini-pro-web/src/views/order/components/Filter.vue
  32. 1 0
      mini-pro-web/src/views/order/detail/components/DeviceInfo.vue
  33. 89 8
      mini-pro-web/src/views/order/list.vue
  34. 2 0
      mini-pro-web/src/views/replenishment/picking/list.vue
  35. 59 48
      mini-pro-web/src/views/replenishment/record/list.vue
  36. 2 2
      mini-pro-web/src/views/replenishment/stockUp/deviceList.vue

+ 1 - 1
mini-pro-web/.env.development

@ -11,4 +11,4 @@ VUE_APP_IM_API = 'http://ehr.yihu.com/api/v2'
VUE_APP_PRE_PATH = '/hlwyy/intelligent-medicine-abinet'
VUE_APP_APPID = "wx79a7f451c8c30308"
VUE_APP_WXID = hz_yyyzh_wx
VUE_APP_WXID = znyg_wx

+ 1 - 2
mini-pro-web/.env.production

@ -12,5 +12,4 @@ VUE_APP_PRE_PATH = '/medicine/intelligent-medicine-abinet'
#https://zb.xmtyw.cn/medicine
VUE_APP_APPID = "wx2c55f5b7b2f3cb56"
VUE_APP_WXID = hz_yyyzh_wx
VUE_APP_CLIENTID = "ihealth_pa8DIRJasL"
VUE_APP_WXID = znyg_wx

+ 27 - 7
mini-pro-web/src/api/api-medicineAbinet.js

@ -536,13 +536,13 @@ let service = {
    },
    // 获取设备携带不同类型的日志的二级树,补货日志、换货日志、上货日志
	getDeviceInventoryRecordListWithUserId: function(params) {
		return request({
			url: `${BASE}/baseDevice/getDeviceInventoryRecordListWithUserId`,
			method: "get",
			params
		});
    },
	// getDeviceInventoryRecordListWithUserId: function(params) {
	// 	return request({
	// 		url: `${BASE}/baseDevice/getDeviceInventoryRecordListWithUserId`,
	// 		method: "get",
	// 		params
	// 	});
    // },
	findOrgList(params){
@ -560,6 +560,26 @@ let service = {
			params: data
		});
	},
	//获取所有设备最后一次补货记录
	getDeviceInventoryRecordListWithUserId: function(data) {
		return request({
			url: `${BASE}/baseDevice/getDeviceInventoryRecordListWithUserId`,
			method: "get",
			params: data
		});
	},
	//获取单个设备的补货记录
	getDeviceInventoryRecordListByDeviceId: function(data) {
		return request({
			url: `${BASE}/baseDevice/getDeviceInventoryRecordListByDeviceId`,
			method: "get",
			params: data
		});
	},
	
	
};

+ 44 - 0
mini-pro-web/src/api/login.js

@ -126,6 +126,42 @@ export function findOneUser(data) {
	});
}
export function findOneUserFormat(data) {
    return new Promise((resolve, reject)=>{
		request({
			url: `${BASE}/user/queryOne`,
			method: "get",
			params: data
		})
		.then(res=>{
			// "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ;  "  "replenisher": "补货员"
			var temArr = ['saasAdmin', 'regionAdmin', 'communityAdmin', 'replenisher']
			var roleList = _.map(res.obj.role, v=>{
				return {
					id: v.id,
					code: v.code,
					name: v.name
				}
			})
			roleList = _.sortBy(roleList, v=>{
				return temArr.indexOf(v.code)
			})
			var curRole = roleList[0]
			var userInfo = {
				roleList,
				curRoleId: curRole.id,
				curRoleCode: curRole.code,
				curRoleName: curRole.name
			}
			resolve(userInfo)
		})
		.catch(err=>{
			reject(err)
		})
	})
}
export function changePwd(data) {
	return request({
	  url: `${BASE}/user/updatePwd`,
@ -140,4 +176,12 @@ export function checkWlyyLogin(data) {
	  method: 'post',
	  data
	})
}
export function findLoginRoleMenuTree(data) {
	return request({
		url: `${BASE}/menu/findLoginRoleMenuTree`,
		method: "get",
		params: data
	});
}

二进制
mini-pro-web/src/assets/images/beihuo.png


二进制
mini-pro-web/src/assets/images/beihuojilu.png


二进制
mini-pro-web/src/assets/images/buhuo.png


二进制
mini-pro-web/src/assets/images/buhuojilu.png


二进制
mini-pro-web/src/assets/images/diandanguanli01_icon.png


二进制
mini-pro-web/src/assets/images/diandanguanli_icon.png


二进制
mini-pro-web/src/assets/images/shebeigaunli01_icon.png


二进制
mini-pro-web/src/assets/images/shebeigaunli_icon.png


二进制
mini-pro-web/src/assets/images/yaopingaikuang.png


+ 40 - 19
mini-pro-web/src/components/layout/components/AppBotNav.vue

@ -1,22 +1,23 @@
<template>
  	<div class="app-bot-nav">
		<van-row type="flex">
			<van-col class="flex1">
				<div @click="toUrl(0)" class="app-bot-nav-item " :class="{active: active===0}">
			<van-col v-for="(item, i) in urls" :key="i" class="flex1">
				<div @click="toUrl(i)" class="app-bot-nav-item " :class="{active: active===i}">
					<div class="app-bot-nav-item_icon">
						<img class="pre-icon" src="@/assets/images/icon_shouye.png">
						<img class="next-icon" src="@/assets/images/icon_shouye-dianji.png">
						<img class="pre-icon" :src="item.icon1">
						<img class="next-icon" :src="item.icon2">
					</div>
					<div class="">首页</div>
					<div class="">{{item.name}}</div>
				</div>
			</van-col>
			<van-col class="flex1">
			<!-- <van-col class="flex1">
				<div @click="toUrl(1)" class="app-bot-nav-item " :class="{active: active==1}">
					<div class="app-bot-nav-item_icon">
						<img class="pre-icon" src="@/assets/images/xiaoxi_icon.png">
						<img class="next-icon" src="@/assets/images/xiaoxi02_icon.png">
					</div>
					<div class="">补货</div>
					<div class="">订单管理</div>
				</div>
			</van-col>
			<van-col class="flex1">
@ -25,9 +26,18 @@
						<img class="pre-icon" src="@/assets/images/icon_wode.png">
						<img class="next-icon" src="@/assets/images/icon_wode-dianji.png">
					</div>
					<div class="">我的</div>
					<div class="">设备管理</div>
				</div>
			</van-col>
			<van-col class="flex1">
				<div @click="toUrl(3)" class="app-bot-nav-item " :class="{active: active==3}">
					<div class="app-bot-nav-item_icon">
						<img class="pre-icon" src="@/assets/images/icon_wode.png">
						<img class="next-icon" src="@/assets/images/icon_wode-dianji.png">
					</div>
					<div class="">我的</div>
				</div>
			</van-col> -->
		</van-row>
	</div>
</template>
@ -36,17 +46,14 @@
export default {
	name: "AppBotNav",
	data(){
		var urls = [
			{url: "/home/index", count: 0},
			{url: "/replenishment/index", count: 0},
			{url: "/personal/index", count: 0}
		]
		var active = this.check(urls)
		return {
			active,
			urls
			active: 0,
			urls: []
		}
	},
	computed:{
		
    },
	watch:{
		'$route': {
			handler(n, o){
@ -55,12 +62,26 @@ export default {
			immediate: true
		}
	},
	created(){
		var urls = [
			{url: "/home/index", count: 0, name: "首页", icon1: require('@/assets/images/icon_shouye.png'), icon2: require('@/assets/images/icon_shouye-dianji.png')},
		]
		if(this.$hasAuth('orderManage')){
			urls.push({url: "/order/list", count: 0, name: "订单管理", icon1: require('@/assets/images/diandanguanli_icon.png'), icon2: require('@/assets/images/diandanguanli01_icon.png')})
		}
		if(this.$hasAuth('device', 'operate')){
			urls.push({url: "/device/index", count: 0, name: "设备管理", icon1: require('@/assets/images/shebeigaunli_icon.png'), icon2: require('@/assets/images/shebeigaunli01_icon.png')})
		}
		urls.push({url: "/personal/index", count: 0, name: "我的", icon1: require('@/assets/images/icon_wode.png'), icon2: require('@/assets/images/icon_wode-dianji.png')})
		
		var active = this.check(urls)
		this.urls = urls
		this.active = active
	},
	mounted(){
		
	},
	computed:{
    },
	
	methods: {
		check(urls){
			urls = urls || this.urls

+ 26 - 0
mini-pro-web/src/mixins/common.js

@ -188,6 +188,32 @@ Vue.mixin({
                };
            };
            return fmt;
        },
        $hasAuth(url, url1, url2){
            function func(list, name){
                var e = _.find(list, v=>{
                    return v.url == name
                })
                return (e&&e.children) || ''
            }
            var temp = func(this.$store.state.app.authMenu, url)
            if(!temp){
                return ''
            }
            if(!url1){
                return temp
            } 
            temp = func(temp, url1)
            if(!temp){
                return ''
            }
            if(!url2){
                return temp
            } 
            return func(temp, url2)
        }
    }
})

+ 3 - 3
mini-pro-web/src/router/device.js

@ -13,8 +13,8 @@ const device = [
                component: () => import('@/views/device/index.vue'),
                meta: {
                    title: '设备管理',
                    hasBot: false,
                    // hasTop: false
                    hasBot: true,
                    hasTop: false
                }
            },
            {
@ -22,7 +22,7 @@ const device = [
                name: "deviceDetail",
                component: () => import('@/views/device/detail.vue'),
                meta: {
                    title: '设备',
                    title: '设备详情',
                    hasBot: false,
                    // hasTop: false
                }

+ 75 - 30
mini-pro-web/src/router/index.js

@ -16,9 +16,11 @@ import order from './order'
import replenishment from './replenishment'
import device from './device'
import machine from './machine'
import {getPublicKey, getHwlyyDecrypt, checkWlyyLogin} from '@/api/login'
import {getPublicKey, getHwlyyDecrypt, checkWlyyLogin, findOneUserFormat} from '@/api/login'
import JSEncrypt from "@/utils/jsencrypt";
import { Toast } from 'vant'
import { findLoginRoleMenuTree } from '@/api/login'
import { _ } from 'core-js'
Vue.use(VueRouter)
const routes = [
@ -112,6 +114,20 @@ function redirectToLogin(to, from, next) {
    }
}
var routerLoaded = false
function formatAuthMenu(menu){
    if(menu){
        return _.map(menu, v=>{
            return {
                name: v.name,
                url: v.url,
                type: v.type,
                children: v.children? formatAuthMenu(v.children) : []
            }
        })
    }
}
router.beforeEach(async (to, from, next) => {
    // _from=ihealth&_platform=webApp
    if(to.query._noTop==1){
@ -130,7 +146,23 @@ router.beforeEach(async (to, from, next) => {
    })
    .then(res=>{
        if((store.getters.user && store.getters.user.accessToken)) {
            next()
            if(!routerLoaded){
                findLoginRoleMenuTree({
                    roleId: store.getters.user.curRoleId
                })
                .then(res=>{
                    routerLoaded = true
                    var routeList = formatAuthMenu(res.detailModelList)
                    store.dispatch('SetAuthMenu', routeList)
                    console.log('routeList', routeList)
                    next()
                })
                .catch(err=>{
                    console.error(err)
                })
            } else {
                next()
            }
        } else {
            if( whiteList.indexOf(to.path) > -1) {
                next()
@ -177,34 +209,47 @@ function authLogin(code, to){
                    var userInfo  = res.obj.WlyyUserSimple
                    userInfo.token = userInfo.accessToken
                    userInfo.clientType = to.query.clientType//1 来自i健康app 区域互联网
                    // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ;  "  "replenisher": "补货员"
                    // 18补货员 19社区管理员 20区域管理员 21超管
                    var dictList = {
                        18: {
                            curRoleCode: "replenisher",
                            curRoleName: "补货员"
                        },
                        19: {
                            curRoleCode: "communityAdmin",
                            curRoleName: "社区管理员"
                        },
                        20: {
                            curRoleCode: "regionAdmin",
                            curRoleName: "区域管理员"
                        },
                        21: {
                            curRoleCode: "saasAdmin",
                            curRoleName: "管理员"
                        },
                    }
                    var { curRoleCode, curRoleName } = dictList[to.query._role]
                    userInfo.curRoleCode = curRoleCode
                    userInfo.curRoleName = curRoleName
                    store
                        .dispatch('SetLoginUser', userInfo)
                        .then(res=>{
                            resolve()
                        })
                    store.dispatch('SetLoginUser', userInfo)
                    findOneUserFormat({
                        id: userInfo.id
                    }).then(userInfo2 => {
                        userInfo = _.assignIn(userInfo, userInfo2);
                        store
                            .dispatch('SetLoginUser', userInfo)
                            .then(res=>{
                                resolve()
                            })
                    }).catch(err=>{
                        console.error(err)
                    })
                    // // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ;  "  "replenisher": "补货员"
                    // // 18补货员 19社区管理员 20区域管理员 21超管
                    // var dictList = {
                    //     18: {
                    //         curRoleCode: "replenisher",
                    //         curRoleName: "补货员"
                    //     },
                    //     19: {
                    //         curRoleCode: "communityAdmin",
                    //         curRoleName: "社区管理员"
                    //     },
                    //     20: {
                    //         curRoleCode: "regionAdmin",
                    //         curRoleName: "区域管理员"
                    //     },
                    //     21: {
                    //         curRoleCode: "saasAdmin",
                    //         curRoleName: "管理员"
                    //     },
                    // }
                    // var { curRoleCode, curRoleName } = dictList[to.query._role]
                    // userInfo.curRoleCode = curRoleCode
                    // userInfo.curRoleName = curRoleName
                    // store
                    //     .dispatch('SetLoginUser', userInfo)
                    //     .then(res=>{
                    //         resolve()
                    //     })
                } else {
                    Toast(res.message|| (res.obj&&res.obj.mes))
                    reject(res)

+ 2 - 2
mini-pro-web/src/router/order.js

@ -10,8 +10,8 @@ const routeMap = [
                name: "orderList",
                meta: {
                    title: "订单管理",
                    // hasTop: false,
                    hasBot: false
                    hasTop: false,
                    hasBot: true
                },
				component: () => import("@/views/order/list.vue")
            },

+ 1 - 1
mini-pro-web/src/store/getters.js

@ -1,7 +1,7 @@
const getters = {
    loading: state => state.app.loading,
    pageTitle: state => state.app.pageTitle,
    clientId: state => "EwC0iRSrcS",
    clientId: state => "EwC0iRSrcSApp",
    user: state => state.user,
    wxAppId: state => state.app.wxWechatConfig && state.app.wxWechatConfig.wxAppId,
    wxId: state => state.app.wxWechatConfig && state.app.wxWechatConfig.wxId,

+ 8 - 1
mini-pro-web/src/store/modules/app.js

@ -8,7 +8,8 @@ const app = {
        loading: false,
        pageTitle: "智能药房",
		platform: 'web',  //网页web   
		noTop: false
		noTop: false,
		authMenu: []
	},
	mutations: {
		SET_NO_TOP: (state, bool) => {
@ -19,6 +20,9 @@ const app = {
		},
		SET_PAGE_TITLE: (state, val) => {
            state.pageTitle = val
        },
		SET_AUTH_MENU: (state, val) => {
            state.authMenu = val
        }
	},
	actions: {
@ -30,6 +34,9 @@ const app = {
		},
		SetPageTitle({ commit, state }, val) {
			commit('SET_PAGE_TITLE', val)
		},
		SetAuthMenu({ commit, state }, val) {
			commit('SET_AUTH_MENU', val)
		}
	}
};

+ 1 - 1
mini-pro-web/src/views/device/cargoLane/index.vue

@ -36,7 +36,7 @@
            </div>
        </van-sticky>
        <div class='bgc-fff plr10 pt10'>
        <div class='bgc-fff plr10 pt10' v-if="list&&list.length">
            <div class=' c-f14 list'>
                <div class="row row-header">
                    <div v-for='(item, i) in list[0].list' :key="i" class='c-t-center w50 ptb10 bgc-ccc' >{{i+1}}</div>

+ 48 - 3
mini-pro-web/src/views/device/cargoLane/setting.vue

@ -131,7 +131,6 @@ export default{
            }
        },
        onSelectCol(item){
            debugger
            var i = this.selectList.indexOf(item)
            if(i != -1){
                var exist = _.filter(this.selectList, v=>{
@ -171,10 +170,50 @@ export default{
                this.selectList = []
            }
        },
        mergeAndSplitCargo(isMerge){
        checkMerge(){
            return new Promise((resolve, reject)=>{
                var exist = _.find(this.selectList, v=>{
                    return !!v.drugCode
                })
                if(exist){
                    this.$toast.clear()
                    this.$dialog.confirm({
                        message: '当前合并货道存在药品,需把药品下架并取出,如您继续合并默认下架全部药品',
                        confirmButtonText: '继续合并'
                    })
                    .then(() => {
                        this.$loading('保存中..')
                        resolve(true)
                    })
                    .catch(() => {
                        this.$loading('保存中..')
                        resolve(false)
                    });
                    return 
                }
                resolve(true)
            })
        },
        checkSplit(){
            return new Promise((resolve, reject)=>{
                this.$toast.clear()
                this.$dialog.confirm({
                    message: '货道拆分后请取下货道上的商品',
                    confirmButtonText: '继续拆分'
                })
                .then(() => {
                    resolve(true)
                })
                .catch(() => {
                    resolve(false)
                });
            })
        },
        async mergeAndSplitCargo(isMerge){
            this.$loading('保存中..')
            var ids = []
            if(isMerge){
                console.log(this.selectList, 'this.selectList')
                if(!this.selectList.length || this.selectList.length<2){
                    this.$toast('至少选择两个相邻的货道')
                    return
@ -186,7 +225,9 @@ export default{
                    this.$toast('不能选择已合并的通道')
                    return 
                }
                if(!await this.checkMerge()){
                    return
                }
                var list = _.sortBy(this.selectList, 'wayerNo')
                ids = _.map(list, v=>{
                    return v.id
@ -196,6 +237,10 @@ export default{
                    this.$toast('请选择一个主货道')
                    return
                }
                if(!await this.checkSplit()){
                    return
                }
                this.$loading('保存中..')
                var item = this.selectList[0]
                var list = this.list[Number(item.layerNo)-1].list
                ids.push(item.id)

+ 176 - 51
mini-pro-web/src/views/device/detail.vue

@ -1,7 +1,19 @@
<template>
    <div class="deviceDetail">
    <div class="deviceDetail pb10">
        <div class="c-border-tb c-f14 c-999 mt10 plr15 ptb10 bgc-fff">
            <div class="c-f16 c-333">{{info.name}}</div>
            <div class=" kitbox">
                <div class="box-flex-1 fs-16 c-333 ellipsis_1">
                    {{info.equName}}
                </div>
                <div class="pt2 ml10">
                    <van-tag type="success" v-if="info.networkStatus==1">在线</van-tag>
                    <van-tag type="danger" v-else>离线</van-tag>
                    <van-tag type="success" v-if="info.saleStatus==1" class="ml5">在售</van-tag>
                    <van-tag type="danger" v-else class="ml5">停售</van-tag>
                </div>
            </div>
            <div class="mt10">
                <span>设备所属:</span>
                <span>{{info.community}}</span>
@ -10,67 +22,137 @@
                <span>设备编号:</span>
                <span>{{info.equNum}}</span>
            </div>
            <div>
                <span>网<i class="mr2em"></i>络:</span>
                <span>4G</span>
            </div>
            <div>
                <span>售卖状态:</span>
                <span>{{info.saleStatus==1?'在售':info.saleStatus==0?'停售':'故障'}}</span>
            </div>
            <div>
                <span>设备地址:</span>
                <span>{{info.deliveryAddress}}</span>
            </div>
        </div>
        <div class='mt20 grid-4 c-f14 c-333 bgc-fff c-border-tb ptb15'>
            <div class='c-t-center' @click='gotoUrl("/device/temperature/index", {id: $route.query.id})'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/wendukongzhi.png")'/>
        <div class="mt10 bgc-fff c-border-tb">
            <div class="panel-title">补货</div>
            <div class='grid-4 c-f14 c-333 ptb15'>
                <!-- @click='gotoUrl("/device/temperature/index", {id: id})' -->
                <div class='c-t-center' >
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/yaopingaikuang.png")'/>
                    </div>
                    <div>药品概况</div>
                </div>
                <div>温湿度控制</div>
            </div>
            <!-- <div class='c-t-center' @click='gotoUrl("/device/temperature/index", {id: $route.query.id})'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/shidukongzhi.png")'/>
                <div v-if="hasAuth('stockUp')" class='c-t-center' @click='gotoUrl("/replenishment/stockUp/detail", {deviceId: id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/beihuo.png")'/>
                    </div>
                    <div>备货</div>
                </div>
                <div>湿度控制</div>
            </div> -->
            <div class='c-t-center' @click='gotoUrl("/device/cargoLane/index", {deviceId: id})'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/huodaozhuangtai.png")'/>
                <div v-if="hasAuth('replenish')" class='c-t-center' @click='gotoUrl("/replenishment/start/deviceDetail", {deviceId: id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/buhuo.png")'/>
                    </div>
                    <div>补货</div>
                </div>
                <div>货道状态</div>
            </div>
            <div class='c-t-center' @click='gotoUrl("/device/cargoLane/setting", {deviceId: id})'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/huodaoshezhi.png")'/>
        </div>
        <div v-if="cargoSettingAuth||temperatureCtrlAuth||cargoStateAuth||putDeviceAuth" class="mt10 bgc-fff c-border-tb">
            <div class="panel-title">设备设置</div>
            <div class='grid-4 c-f14 c-333 ptb15'>
                <div v-if="cargoSettingAuth" class='c-t-center' @click='gotoUrl("/device/cargoLane/setting", {deviceId: id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/huodaoshezhi.png")'/>
                    </div>
                    <div>货道设置</div>
                </div>
                <div>货道设置</div>
            </div>
            <div class='c-t-center' @click='gotoUrl("/device/status", {id: info.id})'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/shebeizhuangtai.png")'/>
                <div v-if="temperatureCtrlAuth" class='c-t-center' @click='gotoUrl("/device/temperature/index", {id: $route.query.id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/wendukongzhi.png")'/>
                    </div>
                    <div>温湿度控制</div>
                </div>
                <div>设备状态</div>
            </div>
            <!-- <div class='c-t-center' @click='gotoUrl("/device/reboot")'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/shebeichongqi.png")'/>
                <div v-if="cargoStateAuth" class='c-t-center' @click='gotoUrl("/device/cargoLane/index", {deviceId: id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/huodaozhuangtai.png")'/>
                    </div>
                    <div>货道状态</div>
                </div>
                <div>设备重启</div>
            </div> -->
            <div class='c-t-center' @click='gotoUrl("/device/infoLog/index")'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/xinxirizhi.png")'/>
                <div v-if="putDeviceAuth" class='c-t-center' @click='gotoUrl("/device/sell", {id: info.id, status: info.saleStatus})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/zaishoutingshou.png")'/>
                    </div>
                    <div>在售停售</div>
                </div>
                <div>信息日志</div>
                <!-- <div class='c-t-center' @click='gotoUrl("/device/temperature/index", {id: $route.query.id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/shidukongzhi.png")'/>
                    </div>
                    <div>湿度控制</div>
                </div> -->
                <!-- <div class='c-t-center' @click='gotoUrl("/device/status", {id: info.id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/shebeizhuangtai.png")'/>
                    </div>
                    <div>设备状态</div>
                </div> -->
                <!-- <div class='c-t-center' @click='gotoUrl("/device/reboot")'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/shebeichongqi.png")'/>
                    </div>
                    <div>设备重启</div>
                </div> -->
                <!-- <div class='c-t-center' @click='gotoUrl("/device/infoLog/index")'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/xinxirizhi.png")'/>
                    </div>
                    <div>信息日志</div>
                </div> -->
            </div>
            <div class='c-t-center' @click='gotoUrl("/device/sell", {id: info.id, status: info.saleStatus})'>
                <div>
                    <van-image class='ability' :src='require("@/assets/images/zaishoutingshou.png")'/>
        </div>
        <div class="mt10 bgc-fff c-border-tb">
            <div class="panel-title">操作日志</div>
            <div class='grid-4 c-f14 c-333 ptb15'>
                <div class='c-t-center' @click='gotoUrl("/device/infoLog/index")'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/xinxirizhi.png")'/>
                    </div>
                    <div>信息日志</div>
                </div>
                <div class='c-t-center' @click='gotoUrl("/replenishment/picking/list", {deviceId: id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/beihuojilu.png")'/>
                    </div>
                    <div>备货记录</div>
                </div>
                <div>在售停售</div>
                <div class='c-t-center' @click='gotoUrl("/replenishment/record/list", {deviceId: id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/buhuojilu.png")'/>
                    </div>
                    <div>补货记录</div>
                </div>
                <!-- <div class='c-t-center' @click='gotoUrl("/device/status", {id: info.id})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/shebeizhuangtai.png")'/>
                    </div>
                    <div>设备状态</div>
                </div> -->
                <!-- <div class='c-t-center' @click='gotoUrl("/device/reboot")'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/shebeichongqi.png")'/>
                    </div>
                    <div>设备重启</div>
                </div> -->
                <!-- <div class='c-t-center' @click='gotoUrl("/device/infoLog/index")'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/xinxirizhi.png")'/>
                    </div>
                    <div>信息日志</div>
                </div>
                <div class='c-t-center' @click='gotoUrl("/device/sell", {id: info.id, status: info.saleStatus})'>
                    <div>
                        <van-image class='ability' :src='require("@/assets/images/zaishoutingshou.png")'/>
                    </div>
                    <div>在售停售</div>
                </div> -->
            </div>
        </div>
    </div>
@ -82,13 +164,37 @@ export default {
    data() {
        return {
            info: {},
            id: this.$route.query.id
            id: this.$route.query.id,
            menuAuth: []
        };
    },
    computed:{
        cargoSettingAuth(){
            return this.hasAuth('cargoSetting')
        },
        cargoStateAuth(){
            return this.hasAuth('cargoState')
        },
        temperatureCtrlAuth(){
            return this.hasAuth('temperatureCtrl')
        },
        putDeviceAuth(){
            return this.hasAuth('putDevice')
        },
    },
    created() {
        this.findById()
        this.menuAuth = _.find(_.find(this.$store.state.app.authMenu, v=>{
            return v.url == 'device'
        }).children, v=>{
            return v.url == 'operate'
        }).children
        console.log('this.menuAuth', this.menuAuth)
    },
    methods: {
        $refreshData(){
            this.findById()
        },
        findById(){
            this.$loading('加载中..')
            let p = {
@ -104,14 +210,33 @@ export default {
                .catch(err=>{
                    console.error(err)
                })
        },
        hasAuth(name){
            return _.find(this.menuAuth, v=>{
                return v.url == name
            })
        }
    },
};
</script>
<style scoped lang='scss'>
.deviceDetail {
    .mr2em{
        margin-right: 2em;
    .panel-title{
        position: relative;
        padding: 10px 15px ;
        font-size: 15px;
        &::before{
            content: "";
            display: block;
            position: absolute;
            top: 50%;
            left: 0;
            transform: translateY(-50%);
            height: 15px;
            background: #17b3ec;
            width: 3px;
            border-radius: 3px;
        }
    }
    .grid-4{
        display: grid;

+ 113 - 69
mini-pro-web/src/views/device/index.vue

@ -1,49 +1,52 @@
<template>
    <div class='deviceIndex'>
        <van-sticky :offset-top="offsetTop">
            <van-field
                v-model="searchText"
                center
                clearable
                placeholder="请输入设备名或编号">
                <template #button>
                    <van-button size="small" type="info" @click="onSearch()">搜索</van-button>
                </template>
            </van-field>
        </van-sticky>
        <div class='plr15'>
            <van-swipe-cell class="mt10" v-for='(item, index) in list' :key="index">
                <div class='c-f14 bgc-fff ptb15 c-999 plr10' @click="gotoUrl('/device/detail',{id: item.id})">
                    <div class='f_y_c flex f_x_s'>
                        <span class='c-f16 c-333'>{{item.equName}}</span>
                        <div>
                            <van-tag v-if="item.networkStatus==1" type="success" class='mr10'>{{item.networkStatusName}}</van-tag>
                            <van-tag v-else type="danger" class='mr10'>{{item.networkStatusName}}</van-tag>
<div class='deviceIndex'>
    <van-sticky :offset-top="offsetTop">
        <van-tabs v-model="active">
            <van-tab :name="1" title="全部设备"></van-tab>
            <van-tab :name="0" title="缺货设备"></van-tab>
        </van-tabs>
    </van-sticky>
    <CustomList 
        ref="customList"
        @onLoad="onLoad">
        <div class="list plr15 pt10">
            <van-checkbox-group v-model="result">
                <div @click="gotoUrl('./detail', {id: item.id})" v-for="(item, i) in list" :key="i" class="item bgc-fff plr15 c-333 fs-14">
                    <div class=" ptb10 kitbox">
                        <div class="box-flex-1 fs-14">
                            {{item.equName}}
                            <!-- <van-checkbox :name="item.id">{{item.equName}}</van-checkbox> -->
                        </div>
                        <div class="">
                            <van-tag type="success" v-if="item.networkStatus==1">在线</van-tag>
                            <van-tag type="danger" v-else>离线</van-tag>
                            <van-tag v-if="item.saleStatus==1" type="success">{{item.saleStatusName}}</van-tag>
                            <van-tag v-else type="danger">{{item.saleStatusName}}</van-tag>
                            <van-tag type="success" v-if="item.saleStatus==1" class="ml5">在售</van-tag>
                            <van-tag type="danger" v-else class="ml5">停售</van-tag>
                        </div>
                    </div>
                    <div class='mt10'>
                        <span>设备所属:</span>
                        <span>{{item.community}}</span>
                    </div>
                    <div>
                        <span>设备编号:</span>
                        <span>{{item.equNum}}</span>
                    <div class="kitbox ptb10 pr40">
                        <div class="pt2">空置率:</div>
                        <div class="box-flex-1 pt10"><van-progress :percentage="item.kongzhilv? (item.kongzhilv*100) : 0" /></div>
                    </div>
                    <div>
                        <span>网<i class='mr2em'></i>络:</span>
                        <span>4G</span>
                    <div class="lh20 ptb10 kitbox">
                        <div class="box-flex-1">
                            <div>待补商品数量:{{item.daibushangpinshuliang}}</div>
                            <div>未设商品货道:{{item.weishezhishangpinhuodao}}</div>
                            <div>设备所属:{{item.community}}</div>
                            <div >设备编号:{{item.equNum}}</div>
                            <!-- <div>上次补货时间:{{item.shangyicibuhuoshijian}}</div> -->
                        </div>
                        <div class="fs-20 c-pr">
                            <van-icon name="arrow" />
                        </div>
                    </div>
                </div>
                <!-- <template #right> -->
                    <!-- <van-button square text="解绑" type="danger" class="delete-button" @click='unBind(item)'/> -->
                    <!-- <van-button square text="停售" type="warning" class="delete-button" @click="stopSell(item)"/> -->
                <!-- </template> -->
            </van-swipe-cell>
            </van-checkbox-group>
        </div>
    </div>
    </CustomList>
    
</div>
</template>
<script>
import medicineAbinetApi from '@/api/api-medicineAbinet'
@ -51,58 +54,99 @@ export default{
    name: 'deviceIndex',
    data(){
        return {
            searchText: '',
            list: []
            list: [],
            result: [],
            active: 1
        }
    },
    watch:{
        active(){
            this.$refs.customList.refresh(true)
        }
    },
    created(){
        this.findList();
    created() {
        
    },
    methods:{
        onSearch(){
            this.findList()
        },
        unBind(item){
        $refreshData(){
            this.$refs.customList.refresh(true)
        },
        stopSell(item){
        },
        findList(){
            this.$loading('加载中..')
            this.list = []
            let p = {
                content: this.searchText,
        onLoad({page, pageSize, searchText}){
            var p = {
                content: searchText,
                userId: this.user.id,
                page: 1,
                size: 999
                page: page,
                size: pageSize
            }
            medicineAbinetApi.getDeviceListWithUserId(p)
            var func
            if(this.active === 0){
                func = medicineAbinetApi.getOutOfStockDeviceListByUserId
            } else {
                func = medicineAbinetApi.getDeviceListWithUserId
            }
            console.log('params', p)
            func(p)
                .then(res=>{
                    this.$toast.clear()
                    console.log('getDeviceListWithUserId', res)
                    console.log('getOutOfStockDeviceList', res)
                    if(res.status == 200){
                        this.list = res.detailModelList
                        var list = res.detailModelList
                        this.list = page==1? list : this.list.concat(list)
                        this.$refs.customList.endLoad(true, this.list.length)
                    } else {
                        this.list = []
                        this.$refs.customList.endLoad(false, true)
                    }
                }).catch(err=>{
                    console.error(err)
                    this.list = []
                    this.$refs.customList.endLoad(false, true)
                })
        }
        },
    },
    
}
</script>
<style scoped lang='scss'>
<style lang='scss' scoped>
.deviceIndex{
    .mr2em{
        margin-right: 2em;
    ::v-deep .custom-list .search{
        top: 50px;
    }
    .list{
        .item{
            margin-bottom: 10px;
            border-radius: 5px;
            &:last-child{
                margin-bottom: 0;
            }
            .van-icon{
                position: absolute;
                top: 50%;
                transform: translateY(calc(-50% - 15px));
                right: 0;
                color: #ccc;
            }
        }
    }   
    .bot-banner{
        position: fixed;
        bottom: 0;
        left: 0;
        width: 100%;
        box-shadow: 0 0 5px #ccc;
    }
    ::v-deep .van-list__placeholder{
        height: 60px;
    }
    .delete-button{
        height: 100%;
}
</style>
<style lang="scss">
.mainNobotHasTop{
    .deviceIndex{
        .custom-list {
            height: calc(100vh - 96px);
            .search{
                top: 96px;
            }
        }
    }
}
</style>

+ 2 - 0
mini-pro-web/src/views/device/sell.vue

@ -33,6 +33,8 @@ export default{
				medicineAbinetApi
					.updateSaleStatus(p)
					.then(res => {
                        this.$emitRefreshPage('deviceDetail')
                        this.$emitRefreshPage('deviceIndex')
                        this.$toast('操作成功')
					})
					.catch(err=>{

+ 4 - 4
mini-pro-web/src/views/index/Index.vue

@ -47,25 +47,25 @@
			</div>
		</div>
		<div class="mt10">
		<!-- <div class="mt10">
			<div class="panel cygn">
				<div class="kitbox pt15 plr15">
					<div class="box-flex-1 c-333 fs-16 f-bold">常用功能</div>
				</div>
				<div class="ptb10 plr5">
					<van-row class="">
						<van-col @click="gotoUrl('/order/list')" span="6" class="tc ">
						<van-col @click="$router.replace({path: '/order/list'})" span="6" class="tc ">
							<div class="fs-23 c-17b3ec"><img src="@/assets/images/dingdanguanli.png" alt=""></div>
							<div class="fs-14 c-666 pt5">订单管理</div>
						</van-col>
						<van-col @click="gotoUrl('/device')" span="6" class="tc">
						<van-col @click="$router.replace({path: '/device'})" span="6" class="tc">
							<div class="fs-23 c-ff9526"><img src="@/assets/images/shebeiguanli.png" alt=""></div>
							<div class="fs-14 c-666 pt5">设备管理</div>
						</van-col>
					</van-row>
				</div>
			</div>
		</div>
		</div> -->
	</div>
</template>
<script>

+ 1 - 1
mini-pro-web/src/views/login/FotgetPassword.vue

@ -154,7 +154,7 @@ export default {
                sendCaptcha({
                    type: 2, // 2 找回密码
                    username: this.data.mobile,
                    client_id: this.$root.clientId?this.$root.clientId:process.env.VUE_APP_CLIENTID,
                    client_id: this.$store.getters.clientId,
                    wxId: process.env.VUE_APP_WXID
                }).then((res) => {
                    if(res.status == 200) {

+ 5 - 37
mini-pro-web/src/views/login/Login.vue

@ -63,7 +63,7 @@
</template>
<script>
import { getPublicKey, login, imgCaptcha, sendCaptcha ,findOneUser} from "@/api/login";
import { getPublicKey, login, imgCaptcha, sendCaptcha ,findOneUserFormat} from "@/api/login";
import JSEncrypt from "@/utils/jsencrypt";
import ValidatorUtils from '@/utils/validator'
import { setTimeout } from 'timers';
@ -177,7 +177,7 @@ export default {
                sendCaptcha({
                    type: 1, // 1 登录
                    username: this.data.mobile?this.data.mobile:this.data.idcord,
                    client_id: this.$store.getters.clientId?this.$store.getters.clientId:process.env.VUE_APP_CLIENTID,
                    client_id: this.$store.getters.clientId,
                    wxId: process.env.VUE_APP_WXID
                }).then((res) => {
                    if(res.status == 200) {
@ -263,7 +263,6 @@ export default {
                }
                
                if (res && res.status == 200) {
                   
                    var encrypt = new JSEncrypt()
                    encrypt.setPublicKey(res.obj.publicKey)
                    p = {
@ -284,7 +283,7 @@ export default {
                }
            } else {
                p = {
                    client_id: this.$store.getters.clientId?this.$store.getters.clientId:process.env.VUE_APP_CLIENTID,
                    client_id: this.$store.getters.clientId,
                    username: this.data.mobile?this.data.mobile:this.data.idcord,
                    login_type: 1, // 1-平台管理员  2-医生登录  3-患者登录
                    captcha: this.data.msgCode,
@ -313,40 +312,9 @@ export default {
                    this.$store
                        .dispatch("SetLoginUser", userInfo)
                        .then(() => {
                            findOneUser({
                            findOneUserFormat({
                                id: userInfo.id
                            }).then(res2 => {
                                // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ;  "  "replenisher": "补货员"
                                var temArr = ['saasAdmin', 'regionAdmin', 'communityAdmin', 'replenisher']
                                var roleList = _.map(res2.obj.role, v=>{
                                    return {
                                        id: v.id,
                                        code: v.code,
                                        name: v.name
                                    }
                                })
                                roleList = _.sortBy(roleList, v=>{
                                    return temArr.indexOf(v.code)
                                })
                                // var userArea = _.map(res2.obj.userArea, v=>{
                                //     return {
                                //         id: v.id,
                                //         city: v.city,
                                //         cityName: v.cityName,
                                //         town: v.town,
                                //         townName: v.townName,
                                //         hospital: v.hospital,
                                //         hospitalName: v.hospitalName,
                                //     }
                                // })
                                var curRole = roleList[0]
                                var userInfo2 = {
                                    roleList,
                                    // userArea,
                                    curRoleCode: curRole.code,
                                    curRoleName: curRole.name
                                }
                            }).then(userInfo2 => {
                                userInfo = _.assignIn(userInfo, userInfo2);
                                this.$store
                                    .dispatch("SetLoginUser", userInfo)

+ 2 - 2
mini-pro-web/src/views/login/Register.vue

@ -161,7 +161,7 @@ export default {
                this.countdownSubtract();
                sendCaptcha({
                    username: this.data.mobile,
                    client_id: this.$root.clientId?this.$root.clientId:process.env.VUE_APP_CLIENTID,
                    client_id: this.$store.getters.clientId,
                    wxId: process.env.VUE_APP_WXID
                }).then((res) => {
                    if(res.status == 200) {
@ -268,7 +268,7 @@ export default {
                captcha: this.data.msgCode,
                openid: this.user.openid,
                wxId: process.env.VUE_APP_WXID,
                client_id: this.$store.getters.clientId?this.$store.getters.clientId:process.env.VUE_APP_CLIENTID,
                client_id: this.$store.getters.clientId,
                login_type: 3, // 1-平台管理员  2-医生登录  3-患者登录
                idcard: this.data.idCard,

+ 47 - 4
mini-pro-web/src/views/machine/index.vue

@ -98,7 +98,7 @@ export default {
  	},
  	data() {
    	return {
			isErr: 0,
			isErr: 0, //1设备维护  2正常使用
			deviceNum: this.$route.query.deviceNum || '',//14912202107000001500000000000000    14912202111000001000000000000000
			step: 0, //0启动页  1首页  2扫码页  3订单页
			curImg: '',
@ -121,7 +121,8 @@ export default {
			orderList: [],
			times: 30,
			shippingType: '', //取药方式(1、扫码,2、医保卡)
			inOut: false
			inOut: false,
			eventName: ''
    	}
  	},
	watch:{
@ -389,8 +390,8 @@ export default {
				}).then(() => {
					this.onPrev()
				});
			} else if(msgobj.type == 'PageRload'){
				location.reload(true)
			} else {
				this.checkNextEvent(msgobj.type)
			}
			// var obj = {
@ -614,10 +615,22 @@ export default {
					confirmButtonText: "返回首页"
				}).then(() => {
					this.step = 1
					if(this.eventName){
						var eventName = this.eventName
						this.eventName = ''
						this.checkNextEvent(eventName)
						return
					}
				});
				return
			}
			this.rsType = 4
			if(this.eventName){
				var eventName = this.eventName
				this.eventName = ''
				this.checkNextEvent(eventName)
				return
			}
		},
		countDown(){
			this.times = 30
@ -670,6 +683,36 @@ export default {
				return
			}
			this.$refs.videoSwipe.next()
		},
		systemUpdate(){
			this.$loading('系统将进行更新,请勿操作')
			setTimeout(()=>{
				location.reload(true)
			}, 3000)
		},
		checkNextEvent(eventName){
			if(eventName == 'equ_normal'){
				//设备上线
				if(this.inOut){
					this.eventName = eventName
					return 
				}
				this.isErr = 2
			} else if(eventName == 'equ_maintenance'){
				//设备维护
				if(this.inOut){
					this.eventName = eventName
					return 
				}
				this.isErr = 1
			} else if(eventName == 'systemUpdate'){
				//系统更新
				if(this.inOut){
					this.eventName = eventName
					return 
				}
				this.systemUpdate()
			}
		}
    },
	destroyed() {

+ 422 - 0
mini-pro-web/src/views/order/components/Filter.vue

@ -0,0 +1,422 @@
<template>
    <div class='order-list-filter'>
        <van-popup v-model="filterShow" position="right">
            <div class="fs-14 c-333  filter-panel">
                <div class="inner-content plr15">
                    <div class="ptb10">按社区</div>
                    <div class="drop-menu" :class="{active: drowMenuShow}">
                        <div class="drop-menu-title tc fs-14" @click="drowMenuShow=!drowMenuShow">
                            <span class="v-middle">{{selcommunity? selcommunity.hospitalName : '全部'}}</span>
                            <van-icon name="arrow-down" />
                        </div>
                        <div class="drop-menu-area kitbox">
                            <div class="drop-menu-area-left" v-if="townList&&townList.length">
                                <van-sidebar v-model="activeKey">
                                    <van-sidebar-item v-for="(item, i) in townList" :key="i" :title="item.townName" />
                                </van-sidebar>
                            </div>
                            <div class="drop-menu-area-right">
                                <div v-for="(item, i) in communityList" :key="i" @click="selcommunity=item;drowMenuShow=false;onSearch()">{{item.hospitalName}}</div>
                            </div>
                        </div>
                    </div>
                    <div class="ptb10 mt10">按时间</div>
                    <div class="">
                        <van-tag @click="endDate='';startDate='';dateType=item.value" v-for="(item, i) in dateTypeOpts" :key="i" :class="{active: item.value===dateType}" type="primary" round>{{item.name}}</van-tag>
                        <van-tag @click="pickDate(1)" type="primary" round :class="{active: startDate}">{{(startDate&&$moment(startDate).format('YYYY-MM-DD')) || '请选择日期'}}</van-tag>
                        <van-tag class="small" type="primary" round>至</van-tag>
                        <van-tag @click="pickDate(2)" type="primary" round :class="{active: endDate}">{{(endDate&&$moment(endDate).format('YYYY-MM-DD')) || '请选择日期'}}</van-tag>
                    </div>
                    <div class="ptb10">按类型</div>
                    <div class="">
                        <van-tag @click="state=item.value" v-for="(item, i) in stateOpts" :key="i" :class="{active: item.value===state}" type="primary" round>{{item.name}}</van-tag>
                    </div>
                </div>
                <div class="buttons kitbox ">
                    <div><van-button @click="reset" round block plain  size="small">重置</van-button></div>
                    <div><van-button @click="submit" round block type="primary" color="#17b3ec" size="small">确定</van-button></div>
                </div>
            </div>
        </van-popup>
        <van-popup v-model="datePickerShow" position="bottom"  >
            <van-datetime-picker
                v-model="currentDate"
                @confirm="onPick"
                @cancel="datePickerShow=false"
                type="date"
                title=""
                :max-date="maxDate"
                :min-date="minDate"
            />
        </van-popup>
    </div>
</template>
<script>
import { findOneUser} from "@/api/login";
import medicineAbinetApi from '@/api/api-medicineAbinet'
export default{
    props: ['value'],
    data(){
        return {
            communityText: '全部',
            filterShow: false,
            currentDate: new Date(),
            minDate: this.$moment('2020-01-01').toDate(),
            maxDate: new Date(),
            datePickerShow: false,
            startDate: '',
            endDate: '',
            pickType: 1,
            totalCount: 0,
            totalMoney: 0,
            activeKey: 0,
            value1: '',
            defaultOption: [
                { townName: '全部', townCode: "", children: [{hospitalCode: '', hospitalName: '全部'}] },
            ],
            drowMenuShow: false,
            townList: [],
            communityList: [],
            selcommunity: '',
            stateOpts: [
                {name: '全部', value: ''},
                {name: '未取药', value: 0},
                {name: '已取药', value: 1},
            ],
            state: '',
            dateTypeOpts: [
                {name: '1个月内', value: 1},
                {name: '3个月内', value: 3},
                {name: '6个月内', value: 6},
            ],
            dateType: 3
        }
    },
    watch: {
        value(n){
            this.filterShow = n
        },
        filterShow(n){
            this.$emit('input', n)
        },
        activeKey(n){
            this.loadChildren()
        }
    },
    created() {
        var cur = this.$moment().subtract()
        var year = cur.years()
        this.dateTypeOpts.push(
            {name: '今年', value: year}
        )
        var year = cur.subtract(1, 'years').years()
        this.dateTypeOpts.push(
            {name: year+"年", value: year}
        )
        year = cur.subtract(1, 'years').years()
        this.dateTypeOpts.push(
            {name: year+"年", value: year}
        )
        this.getOrgList()
    },
    methods:{
        reset(){
            this.dateType = 3
            this.selcommunity = ''
            this.state = ''
        },
        submit(){
            var {dateType} = this
            console.log(this.selcommunity, 'this.selcommunity')
            var startTime = '', endTime = ''
            if(dateType==1 || dateType==3 || dateType==6){
                startTime = this.$moment().subtract(dateType, 'months')
                endTime = new Date()
            } else if(dateType > 2000){
                var time = this.$moment().years(dateType)
                startTime = time.startOf('year')
                endTime = time.endOf('year')
            } else {
                if(this.startDate){
                    startTime = this.startDate
                }
                if(this.endDate){
                    endTime = this.endDate
                }
            }
            
            this.$emit('onSubmit', {
                selcommunity: this.selcommunity,
                sellState: this.state,
                startTime,
                endTime
            })
            this.$emit('input', false)
        },
        pickDate(pickType){
            this.pickType = pickType
            this.currentDate = pickType ==1? this.startDate : this.endDate
            this.datePickerShow = true
        },
        onPick(){
            this.dateType = ''
            var date = this.$moment(this.currentDate).toDate()
            if(this.pickType ==1){
                this.startDate = date
            } else {
                this.endDate = date
            }
            this.datePickerShow = false
        },
        getOrgList(){
            findOneUser({
                id: this.user.id
            }).then(async res => {
                // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ; "replenisher": "补货员"
                var role = this.user.curRoleCode
                var userArea = res.obj.userArea
                var townList = [].concat(this.defaultOption)
                if(role=='communityAdmin' || role=="replenisher"){
                    var g = _.groupBy(userArea, 'town')
                    for(var k in g){
                        var tmp = g[k][0].concat([])
                        tmp.children = g[k]
                        townList.push(tmp)
                    }
                    this.townList = townList
                } else {
                    if(role == 'regionAdmin'){
                        userArea.forEach(v => {
                            v.children = []
                        });
                        this.townList = townList.concat(userArea) 
                    } else if(role=='saasAdmin'){
                        await medicineAbinetApi
                            .baseTownList({ filters: "city=350200"})//写死厦门市
                            .then(res => {
                                console.log('baseTownList', res)
                                if (res.status == 200) {
                                    var detailModelList = res.detailModelList;
                                    detailModelList.forEach((item) => {
                                        item.town = item.code
                                        item.townName = item.name
                                        item.children = [];
                                    });
                                    this.townList = townList.concat(detailModelList) 
                                }
                            });
                    }
                }
                this.loadChildren()
            });
        },
        async loadChildren(){
            var item = this.townList[this.activeKey]
            if(!item.children || !item.children.length){
                await medicineAbinetApi
                    .findOrgList({ code: item.town, paeg: 1, pageSize: 999 })
                    .then(res => {
                        console.log('findOrgList', res)
                        if (res.status == 200) {
                            res.detailModelList.forEach(v=>{
                                v.hospitalName = v.name
                                v.hospitalCode = v.code
                            })
                            item.children = res.detailModelList
                        }
                    })
                    .catch(err=>{
                        item.children = []
                    })
            }
            this.communityList = item.children
        }
    },
}
</script>
<style lang='scss' scoped>
.order-list-filter{
    .top-banner{
        .search-date{
            background: #f2f3f5;
        }
        .date-item{
            width: 110px;
            text-align: center;
            padding: 5px 0;
            border: 1px solid #ccc;
            background: #fff;
            color: #333;
            border-radius: 30px;
        }
        .van-button--mini{
            height: 28px;
            width: 60px;
        }
        .drop-menu{
            position: relative;
            .van-sidebar-item--select::before{
                background-color: #17b3ec;
            }
            .drop-menu-title{
                padding: 10px 0;
                background: #fff;
                .van-icon{
                    transform: rotate(90deg);
                }
            }
            .drop-menu-area{
                position: absolute;
                width: 100%;
                left: 0;
                display: none;
                border-top: 1px solid #e1e1e1;
                height: calc(100% - 39px);
                .drop-menu-area-right{
                    height: 100%;
                    overflow-y: auto;
                    background: #fff;
                    -webkit-box-flex: 1;
                    >div{
                        padding: 10px 15px;
                        border-bottom: 1px solid #e1e1e1;
                        &:last-child{
                            border-bottom: 0;
                        }
                    }
                }
            }
            &.active{
                background: rgba($color: #000000, $alpha: .4);
                height: calc(100vh - 49px);
                .drop-menu-area{
                    display: -webkit-box;
                }
               .drop-menu-title{
                   color: #17b3ec;
                    .van-icon{
                        transform: rotate(-90deg);
                    }
                } 
            }
        }
    }
    .filter-panel{
        background: #fff;
        width: 90vw;
        height: 100vh;
        .inner-content{
            overflow-y: auto;
            height: calc(100% - 60px);
        }
        .community-input{
            border: 1px solid #ccc;
            border-radius: 100px;
            line-height: 30px;
            padding: 0 15px;
            position: relative;
            padding-right: 40px;
            .van-icon{
                position: absolute;
                right: 10px;
                top: 50%;
                transform: translateY(-50%);
            }
        }
        .van-tag{
            width: 95px;
            text-align: center;
            background: rgb(242, 242, 242);
            color: #999;
            padding: 5px 0;
            justify-content: center;
            margin-bottom: 10px;
            margin-right: 10px;
            &:nth-child(3n){
                margin-right: 0;
            }
            &.active{
                background: #17b3ec;
                color: #fff;
            }
            &.small{
                width: 20px;
                background: #fff;
            }
        }
        .buttons{
            position: absolute;
            bottom: 15px;
            width: calc(100%);
            >div{
                width: 50%;
                padding: 0 15px;
            }
        }
        .drop-menu{
            position: relative;
            .van-sidebar-item--select::before{
                background-color: #17b3ec;
            }
            .drop-menu-title{
                padding: 5px 15px;
                background: #fff;
                border-radius: 30px;
                border: 1px solid #e1e1e1;
                text-align: left;
                .van-icon{
                    position: absolute;
                    right: 10px;
                    top: 8px;
                }
            }
            .drop-menu-area{
                margin-top: 10px;
                position: absolute;
                width: 100%;
                left: 0;
                display: none;
                border-top: 1px solid #e1e1e1;
                height: calc(100% - 39px);
                .drop-menu-area-right{
                    height: 100%;
                    overflow-y: auto;
                    background: #fff;
                    -webkit-box-flex: 1;
                    >div{
                        padding: 10px 15px;
                        border-bottom: 1px solid #e1e1e1;
                        &:last-child{
                            border-bottom: 0;
                        }
                    }
                }
            }
            &.active{
                height: calc(100vh - 49px);
                .drop-menu-area{
                    display: -webkit-box;
                }
               .drop-menu-title{
                   color: #17b3ec;
                    .van-icon{
                        transform: rotate(-180deg);
                    }
                } 
            }
        }
    }
}
</style>

+ 1 - 0
mini-pro-web/src/views/order/detail/components/DeviceInfo.vue

@ -2,6 +2,7 @@
    <div class='order-detail-device-info lh26 plr15 ptb10 break-all bgc-fff fs-14'>
        <div>出货设备:{{data.equName}}</div>
        <div>设备编号:{{data.equNum}}</div>
        <div>所属社区:{{data.community}}</div>
        <div>设备地址:{{data.deliveryAddress}}</div>
    </div>
</template>

+ 89 - 8
mini-pro-web/src/views/order/list.vue

@ -2,7 +2,22 @@
    <div class='order-list'>
        <van-sticky :offset-top="offsetTop">
            <div class="top-banner  fs-14  ">
                <div @click="drowMenuShow=false" class="kitbox pl15 search-date ptb10">
                <form action="/">
                    <van-search
                        v-model="searchText"
                        placeholder="订单号、金额、手机号"
                        show-action
                        @search="onSearch"
                        shape="round"
                    >
                    <div slot="action" class="plr5">
                        <van-icon @click="filterShow=true" style="vertical-align: text-bottom;" color="#17b3ec" size="20px" name="filter-o" />
                    </div>
                    </van-search>
                </form>
                <!-- <div @click="drowMenuShow=false" class="kitbox pl15 search-date ptb10">
                    <div @click="pickDate(1)" class="date-item">{{$moment(startDate).format('YYYY-MM-DD')}}</div>
                    <div class="ptb5 plr10">至</div>
                    <div @click="pickDate(2)" class="date-item">{{$moment(endDate).format('YYYY-MM-DD')}}</div>
@ -25,9 +40,12 @@
                            <div v-for="(item, i) in communityList" :key="i" @click="selcommunity=item;drowMenuShow=false;onSearch()">{{item.hospitalName}}</div>
                        </div>
                    </div>
                </div>
                </div> -->
            </div>
        </van-sticky>
        
            <!-- searchPlaceholder="订单号、金额、手机号" -->
        <CustomList 
			ref="customList"
            :searchfun="false"
@ -35,11 +53,12 @@
			<div class="list plr15">
                <div @click="gotoUrl('./detail', {id: item.id})" v-for="(item, i) in list" :key="i" class="item plr15 c-333 fs-14">
                    <div class="kitbox ptb10 bb-e1e1e1">
                        <div class="box-flex-1 fs-14">{{item.prescribeNum}}</div>
                        <div v-if="item.sellState==1" class="c-17b3ec">{{item.sellStatusName}}</div>
                        <div v-else class="" >{{item.sellStatusName}}</div>
                        <div class="box-flex-1 fs-14">订单编号:{{item.prescribeNum}}</div>
                        <div v-if="item.sellState==1" class="c-17b3ec">{{item.sellStateName}}</div>
                        <div v-else class="" >{{item.sellStateName}}</div>
                    </div>
                    <div class="lh20 ptb10">
                        <div>来源机构:{{item.community}}</div>
                        <div>订单类型:{{item.orderTypeName || "线上订单"}}</div>
                        <div>开方时间:{{formatDatetime(item.prescribeTime)}}</div>
                        <div>存取信息:取药码 {{item.pickUpNum}}</div>
@ -49,6 +68,28 @@
            </div>
		</CustomList>
        <FilterPanel v-model="filterShow" @onSubmit="onSubmit" ref="Filter"/>
        <!-- <van-popup v-model="filterShow" position="right">
            <div class="fs-14 c-333 plr15 filter-panel">
                <div class="ptb10">按社区</div>
                <div class="ptb10">按时间</div>
                <div class="">
                    <van-tag type="primary" round>全部</van-tag>
                    <van-tag type="primary" round>标签</van-tag>
                    <van-tag type="primary" round>标签</van-tag>
                    <van-tag type="primary" round>标签</van-tag>
                </div>
                <div class="ptb10">按类型</div>
                <div class="">
                    <van-tag type="primary" round>全部</van-tag>
                    <van-tag type="primary" round>标签</van-tag>
                    <van-tag type="primary" round>标签</van-tag>
                </div>
            </div>
        </van-popup> -->
        <van-popup v-model="datePickerShow" position="bottom"  >
            <van-datetime-picker
                v-model="currentDate"
@ -73,12 +114,18 @@
    </div>
</template>
<script>
import FilterPanel from './components/Filter'
import medicineAbinetApi from '@/api/api-medicineAbinet'
import { findOneUser} from "@/api/login";
export default{
    name: 'orderList',
    components:{
        FilterPanel
    },
    data(){
        return {
            filterShow: false,
            searchText: '',
            list: [],
            currentDate: new Date(),
            maxDate: new Date(),
@ -99,6 +146,7 @@ export default{
            townList: [],
            communityList: [],
            selcommunity: '',
            sellState: ''
            
        }
    },
@ -108,7 +156,10 @@ export default{
        }
    },
    created() {
        this.getOrgList()
        // this.getOrgList()
    },
    mounted(){
        this.$refs.Filter.submit()
    },
    methods:{
        onLoad({page, pageSize, searchText}){
@ -118,8 +169,8 @@ export default{
				endTime: endDate? this.$moment(endDate).format('YYYY-MM-DD 23:59:59') : '',
                userId: this.user.id,
				community: this.selcommunity? this.selcommunity.hospitalCode : '',
				// content: searchForm.content,
				// sellState: searchForm.sellStatus,
				content: searchText,
				sellState: this.sellState,
                page: page,
                size: pageSize
            }
@ -227,6 +278,14 @@ export default{
            }
            this.communityList = item.children
        },
        onSubmit(data){
            debugger
            this.startDate = data.startTime
            this.endDate = data.endTime
            this.selcommunity = data.selcommunity
            this.sellState = data.sellState
            this.onSearch()
        }
    },
}
@ -330,6 +389,28 @@ export default{
    ::v-deep .van-list__placeholder{
        height: 40px;
    }
    .filter-panel{
        background: #fff;
        width: 90vw;
        height: 100vh;
        .van-tag{
            width: 95px;
            text-align: center;
            background: rgb(242, 242, 242);
            color: #999;
            padding: 5px 0;
            justify-content: center;
            margin-bottom: 10px;
            margin-right: 10px;
            &:nth-child(3n){
                margin-right: 0;
            }
            &.active{
                background: #17b3ec;
                color: #fff;
            }
        }
    }
}
</style>

+ 2 - 0
mini-pro-web/src/views/replenishment/picking/list.vue

@ -68,6 +68,7 @@ export default{
    name: 'replenishmentDeviceList',
    data(){
        return {
            deviceId: this.$route.query.deviceId,
            list: [],
            active: 0,
            waitCount: 0
@ -79,6 +80,7 @@ export default{
    methods:{
        onLoad({page, pageSize, searchText}){
            var p = {
                deviceId: this.deviceId,
				// startTime: startDate? this.$moment(startDate).format('YYYY-MM-DD 00:00:00') : '',
				// endTime: endDate? this.$moment(endDate).format('YYYY-MM-DD 23:59:59') : '',
				// content: searchForm.content,

+ 59 - 48
mini-pro-web/src/views/replenishment/record/list.vue

@ -10,19 +10,41 @@
        </van-sticky>
        <CustomList
			ref="customList"
            :searchfun='false'
            searchPlaceholder="输入药品名称搜索"
			@onLoad="onLoad">
            <div class="list">
                <van-collapse v-model="activeName" accordion>
                <div class="item" v-for="(citem, k) in list" :key="k">
                    <template>
                        <div>操作时间:{{citem.createTime}}</div>
                        <div>操作货道:{{citem.layerNo}}层{{citem.mergeCargo}}列</div>
                        <div v-if="active==0">补货药品:{{citem.drugName}}</div>
                        <div v-if="active==2">上架药品:{{citem.drugName}}</div>
                        <div v-else-if="active==3">下架药品:{{citem.drugName}}</div>
                        <div>变动数:{{citem.quantity}}</div>
                        <div>操作人员:{{citem.name}}</div>
                    </template>
                    <!-- <template>
                        <div>换货时间:2020-08-24 17:15:19</div>
                        <div>设备编号:149122021070000</div>
                        <div>换货人员:张三</div>
                    </template>
                    <template>
                        <div>上货时间:2020-08-24 17:15:19</div>
                        <div>设备编号:149122021070000</div>
                        <div>上货人员:张三</div>
                    </template> -->
                </div>
                <!-- <van-collapse v-model="activeName" accordion>
                    <van-collapse-item v-for="(item, i) in list" :key="i" :title="item.equName" :name="i">
                        <div class="item" v-for="(citem, k) in item.children" :key="k">
                            <template>
                                <div>补货时间:{{citem.createTime}}</div>
                                <div>操作时间:{{citem.createTime}}</div>
                                <div>设备编号:{{citem.equNum}}</div>
                                <div>商品数量:{{citem.quantity}}</div>
                                <div>补货人员:{{citem.createUserName}}</div>
                                <div>操作人员:{{citem.createUserName}}</div>
                            </template>
                            <!-- <template>
                            <template>
                                <div>换货时间:2020-08-24 17:15:19</div>
                                <div>设备编号:149122021070000</div>
                                <div>换货人员:张三</div>
@ -31,10 +53,10 @@
                                <div>上货时间:2020-08-24 17:15:19</div>
                                <div>设备编号:149122021070000</div>
                                <div>上货人员:张三</div>
                            </template> -->
                            </template>
                        </div>
                    </van-collapse-item>
                </van-collapse>
                </van-collapse> -->
            </div>
        </CustomList>
    </div>
@ -45,6 +67,7 @@ export default{
    name: 'replenishmentRecordList',
    data(){
        return {
            deviceId: this.$route.query.deviceId,
            active: 0,
            activeName: '',
            list: [],
@ -60,18 +83,19 @@ export default{
    },
    methods:{
        onLoad({page, pageSize, searchText}){
            var that = this, 
                params = {
                    type: this.active+1,
                    userId: this.user.id,
                    page: page,
                    size: pageSize
                };
            console.log('getDeviceInventoryRecordListWithUserId', params)
            var params = {
                deviceId: this.deviceId,
                type: this.active+1,
                userId: this.user.id,
                drugName: searchText,
                page: page,
                size: pageSize
            };
            console.log('getDeviceInventoryRecordListByDeviceId', params)
            medicineAbinetApi
                .getDeviceInventoryRecordListWithUserId(params)
                .getDeviceInventoryRecordListByDeviceId(params)
                .then(res=>{
                    console.log('getDeviceInventoryRecordListWithUserId', res)
                    console.log('getDeviceInventoryRecordListByDeviceId', res)
                   if(res.status == 200){
                        var list = res.detailModelList
                        this.list = page==1? list : this.list.concat(list)
@ -85,35 +109,6 @@ export default{
                    this.$refs.customList[this.active].endLoad(false, true)
                })
        },
        // onLoad({page, pageSize, searchText}){
        //     var p = {
        //         userId: this.user.id,
        //         page: 1,
        //         size: pageSize
        //     }
        //     console.log('params', p)
        //     medicineAbinetApi.getDeviceListWithUserId(p)
        //         .then(res=>{
        //             console.log('getDeviceListWithUserId', res)
        //             if(res.status == 200){
        //                 res.detailModelList.forEach(el=>{
        //                     el.children = []
        //                 })
        //                 var list = res.detailModelList
                        
        //                 this.list = page==1? list : this.list.concat(list)
        //                 debugger
        //                 this.$refs.customList.endLoad(res.totalPage<=page, this.list.length)
        //             } else {
        //                 this.list = []
        //                 this.$refs.customList.endLoad(false, true)
        //             }
        //         }).catch(err=>{
        //             console.error(err)
        //             this.list = []
        //             this.$refs.customList.endLoad(false, true)
        //         })
        // },
    },
}
</script>
@ -128,12 +123,28 @@ export default{
            transform: scaleY(1);
        }
        .item{
            padding: 10px 0;
            padding: 10px 15px;
            border-bottom: 1px solid #e1e1e1;
            background: #fff;
            font-size: 14px;
            color: #333;
            // margin-bottom: 10px;
            &:last-child{
                border-bottom: 0 ;
            }
        }
    }   
}
</style>
</style>
<style lang="scss">
.mainNobotHasTop{
    .replenishment-record-list{
        .custom-list {
            height: calc(100vh - 96px);
            .search{
                top: 96px;
            }
        }
    }
}
</style>

+ 2 - 2
mini-pro-web/src/views/replenishment/stockUp/deviceList.vue

@ -34,8 +34,8 @@
                            <div>待补商品数量:{{item.daibushangpinshuliang}}</div>
                            <div>未设商品货道:{{item.weishezhishangpinhuodao}}</div>
                            <div>设备所属:{{item.community}}</div>
                            <div>设备编号:{{item.equNum}}</div>
                            <div>上次补货时间:{{item.shangyicibuhuoshijian}}</div>
                            <div >设备编号:{{item.equNum}}</div>
                            <!-- <div>上次补货时间:{{item.shangyicibuhuoshijian}}</div> -->
                        </div>
                        <div class="fs-20 c-pr">
                            <van-icon name="arrow" />