lincl 3 سال پیش
والد
کامیت
852871ca6e

+ 35 - 1
mini-pro-web/src/api/api-medicineAbinet.js

@ -579,7 +579,41 @@ let service = {
	},
	
	// 通过设备id获取该设备的缺货信息
	getOutOfStockInfoByDeviceWithPage: function(data) {
		return request({
			url: `${BASE}/baseDevice/getOutOfStockInfoByDeviceWithPage`,
			method: "get",
			params: data
		});
	},
	// 以药品为维度的药品库存统计
	getDrugInventoryCount: function(params) {
		return request({
			url: `${BASE}/baseDevice/getDrugInventoryCount`,
			method: "get",
			params
		});
    },
	//根据用户和设备获取出货单详情
	getOutDetailByUserIdAndDeviceId: function(params) {
		return request({
			url: `${BASE}/baseOut/getOutDetailByUserIdAndDeviceId`,
			method: "get",
			params
		});
    },
	// 批量补货
	batchAddInventory: function(params) {
		return request({
			url: `${BASE}/baseDevice/batchAddInventory`,
			method: "post",
			params
		});
    },
	
};

+ 32 - 4
mini-pro-web/src/components/ProductItem/index.vue

@ -1,5 +1,6 @@
<template>
    <div @click="toSet" class='components-product-item' :class="{'pitem-full':data.cargoCapacity==data.qty, 'pitem-close': data.cargoState!=1, 'pitem-fault': data.faultState==1}">
    <div @click="toSet" class='components-product-item' 
        :class="{'pitem-full':data.cargoCapacity==data.qty, 'pitem-close': data.cargoState!=1, 'pitem-fault': data.faultState==1, 'pitem-active': isActive}">
        <div :style="'height: '+ (rate) +'%'" class="pitem-bg"></div>
        <div class="pitem-inner" >
            <div class="kitbox " >
@ -14,14 +15,15 @@
        </div>
        <div class="tag" v-if="data.state==21">主</div>
        <div class="tag" v-else-if="data.state==20">副</div>
        <img class="gouxuan" src="@/assets/images/gouxuan.png" alt="">
    </div>
</template>
<script>
export default{
    props: ['data', 'index'],
    props: ['data', 'index', 'bussuness'],//bussuness quick快速补货
    data(){
        return {
            
            isActive: false
        }
    },
    computed:{
@ -30,11 +32,24 @@ export default{
            return (data.qty||0) / (data.cargoCapacity||5) * 100
        },
    },
    watch: {
        'data.isActive':{
            handler(n){
                this.isActive = n
            },
            deep: true
        }
    },
    created() {
        
        this.isActive = this.data.isActive
    },
    methods:{
        toSet(){
            if(this.bussuness == 'quick'){
                this.isActive = !this.isActive
                this.$emit('onChange', this.isActive)
                return
            }
            if(this.data.state==20){
                this.$toast('不能操作副通道,如要修改请修改它的主通道')
                return
@ -112,5 +127,18 @@ export default{
            display: none;
        }
    }
    .gouxuan{
        position: absolute;
        right: 0;
        bottom: 0;
        width: 20px;
        display: none;
    }
    &.pitem-active{
        border: 1px solid red;
        .gouxuan{
            display: block;
        }
    }
}
</style>

+ 10 - 0
mini-pro-web/src/router/replenishment.js

@ -116,6 +116,16 @@ const routeMap = [
                },
				component: () => import("@/views/replenishment/start/deviceDetail.vue")
            },
            {
                path: "/replenishment/start/quick",
                name: "replenishmentStartQuick",
                meta: {
                    title: "药品详情",
                    // hasTop: false,
                    hasBot: false
                },
				component: () => import("@/views/replenishment/start/quick.vue")
            },
            {
                path: "/replenishment/start/productDetail",
                name: "replenishmentStartProductDetail",

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

@ -91,7 +91,7 @@ export default{
                    if(res.status == 200){
                        var list = res.detailModelList
                        this.list = page==1? list : this.list.concat(list)
                        this.$refs.customList.endLoad(true, this.list.length)
                        this.$refs.customList.endLoad(res.totalPage<=page || this.active === 0, this.list.length)
                    } else {
                        this.list = []
                        this.$refs.customList.endLoad(false, true)

+ 11 - 2
mini-pro-web/src/views/device/temperature/index.vue

@ -5,7 +5,7 @@
                <span>设备实时温湿度</span>
                <van-button size="small" type="text" class='tbtn w60 bgc-fff c-17B3EC' @click='initMain'>获取</van-button>
            </div>
            <div class='c-f20'>{{form.temperature}}°<span class='ml20'>{{form.humidity}}%</span></div>
            <div class='c-f20'>{{temperature}}°<span class='ml20'>{{humidity}}%</span></div>
            <div class='mt10'>设备实时温度每10分钟会从设备端返回一次</div>
        </div>
        <div class='mt10 p10 bgc-fff c-f14 c-333 c-border-tb'>
@ -78,7 +78,7 @@
                    <van-switch inactive-color='#ccc' active-color='#17b3ec' v-model="checked2" />
                </div>
            </div>
            <div v-if='checked2'>
            <div v-if='checked2&&form.humiditycontrol'>
                <div class='flex c-333 c-f14 bgc-fff p15'>
                    <div class='lh46'>当湿度高于:</div>
                    <div style='flex:1' class='ml10'>
@ -102,6 +102,8 @@ export default{
    name: 'temperatureIndex',
    data(){
        return {
            temperature: '',
            humidity: '',
            checked1: '',
            checked2: '',
            form:{
@ -138,12 +140,16 @@ export default{
                this.form.checked1 = false;
                this.form.temperature = '';
                this.heat = ''
            } else {
                this.form.temperature = this.temperature;
            }
        },
        humidityChange(n){
            if(n==0){
                this.form.checked2 = false;
                this.form.humidity = '';
            } else {
                this.form.humidity = this.humidity
            }
        },
        save(){
@ -216,6 +222,9 @@ export default{
                this.$toast.clear()
                if(res.status==200){
                    console.log(res);
                    this.temperature = res.obj.device.nowTemperature;
                    this.humidity = res.obj.device.nowHumidity;
                    this.form.humidity = res.obj.device.humidity;
                    this.form.humiditycontrol = res.obj.device.humiditycontrol&&res.obj.device.humiditycontrol==1?true:false;
                    this.form.temperature = res.obj.device.temperature;

+ 14 - 5
mini-pro-web/src/views/drug/list.vue

@ -46,8 +46,10 @@
        <SetStockDialog 
            v-model="setStockShow" 
            :trackId="trackId"
            :bussiness="5"
            :drugId="drugId"/>
            :bussiness="bussiness"
            :drugId="drug.id"
            @onConfirm="onConfirm"/>
            
    </div>
</template>
@ -71,10 +73,12 @@ export default {
            value: "",
            list: [],
            setStockShow: false,
            drugId: ''
            bussiness: this.$route.query.bussiness || '',
            drug: ''
        }
    },
    async created(){
        this.bussiness = this.trackId? 5 : this.bussiness
        this.getDrugDictionary()
    },
    methods: {
@ -106,14 +110,19 @@ export default {
            this.$router.back()
        },
        addDrug(item){
            if(this.trackId){
                this.drugId = item.id
            if(this.trackId || this.bussiness==6){
                this.drug = item
                this.setStockShow = true
                return
            }
            this.$EventBus.$emit('drug-sel', item)
            this.$router.back()
        },
        onConfirm(stock){
            this.drug.upInventory = stock
            this.$EventBus.$emit('drug-sel', this.drug)
            this.$router.back()
        }
    }
};
</script>

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

@ -208,7 +208,8 @@ export default {
			// p = {
			// 	deviceId: this.deviceNum, //设备编号
			// 	cardNum: 'DD4517690'
			// 	cardNum: '',
			// 	ehcCard: "2AA15E2786973077D40FF5DEFFB5E7B12D79E3BD50BE59F22559FF361667E22C:0:445D0CE646F8F9DFEF648D36910287B5:3502A0001GZHA0002"
			// }
            console.log('params', p)
            medicineAbinetApi
@ -225,7 +226,7 @@ export default {
								list.forEach(v=>{
									var allPrice = 0
									v.drugList.forEach(d=>{
										allPrice += d.price * Number(d.quantity)
										allPrice += d.price * ((d.quantity&&Number(d.quantity)) || 1)
									})
									v.price = allPrice.toFixed(2)
								})
@ -559,7 +560,7 @@ export default {
				type:"text", text: `备注:${remark||""}\n`,nLan:0,nOrgx:-1,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0
			})
			// if(qrCodeContent){
				printcon.push({type:"qrcode",text: qrCodeContent||"", nWidth:6,nVersion:0,nErrlevenl:4})
				printcon.push({type:"qrcode",text: qrCodeContent||"http://weixin.qq.com/r/hj9vd_LEAL9-raYU92qU", nWidth:6,nVersion:0,nErrlevenl:4})
			// }
			
			printcon.push({type:"nline"})

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

@ -23,8 +23,8 @@
                    <div class=" ptb10 kitbox bb-e1e1e1">
                        <div class="box-flex-1 fs-14">备货单号:{{item.docNum}}</div>
                        <div class="">
                            <span v-if="active===0&&item.state==1" class="c-ff9526">备货中</span>
                            <span v-if="active===0&&item.state!=1" class="c-17b3ec">已备货</span>
                            <span v-if="active===0&&item.state==2" class="c-ff9526">备货中</span>
                            <span v-if="active===0&&item.state==1" class="c-17b3ec">已备货</span>
                            <span v-else-if="active===1" class="c-17b3ec">待领料</span>
                            <span v-else-if="active===2" class="c-999">已领料</span>
                            <!-- <span class="c-ff5e6c">已驳回</span> -->

+ 4 - 4
mini-pro-web/src/views/replenishment/start/components/SetStockDialog.vue

@ -4,10 +4,10 @@
            <div class="plr15 ptb10 c-pr" style="width: 80vw">
                <div class="close fs-20"><van-icon @click="emitValue(false)" name="close" /></div>
                <div class="tc fs-14 c-333">
                    <span>{{bussiness==1? '修改容量' : bussiness==2? '矫正库存' : bussiness==4||bussiness==5? '设置库存' : ''}}</span>
                    <span>{{bussiness==1? '修改容量' : bussiness==2? '矫正库存' : bussiness==4||bussiness==5? '设置库存' : bussiness==6? '新增' : ''}}</span>
                </div>
                <template v-if="bussiness==1||bussiness==4||bussiness==5">
                    <div class="tc pt30 pb20"><van-stepper v-model="stock" min="1" /></div>
                <template v-if="bussiness==1||bussiness==4||bussiness==5||bussiness==6">
                    <div class="tc pt30 pb20"><van-stepper v-model="stock" min="1" max="100" /></div>
                </template>
                <div class="tc" v-else>
                    <div class="pt10">
@ -35,7 +35,7 @@ export default{
    props:{
        value: {},
        bussiness: {
            default: 1 //1修改容量 2矫正库存 4设置库存 5选择商品后 设置库存
            default: 1 //1修改容量 2矫正库存 4设置库存 5选择商品后 设置库存  6备货时选择药品
        },
        data: {
            default: function(){

+ 107 - 15
mini-pro-web/src/views/replenishment/start/deviceDetail.vue

@ -40,23 +40,44 @@
                </div>
            </div>
        </van-sticky>
        <div class="fs-14 pl15 ptb10 bgc-fff">
            <span>从上往下数</span>
            <div class="color-block"></div>
            <span class="ml5 fs-12">已关闭</span>
            <div class="color-block ml10 red"></div>
            <span class="ml5 fs-12">故障</span>
        <div class="fs-14 pl15 ptb10 bgc-fff kitbox">
            <div class="box-flex-1 lh24">
                <span>从上往下数</span>
                <div class="color-block"></div>
                <span class="ml5 fs-12">已关闭</span>
                <div class="color-block ml10 red"></div>
                <span class="ml5 fs-12">故障</span>
            </div>
            <div class="plr15" v-if="this.outDetailList&&this.outDetailList.length">
                <van-button @click="changeShowDrug" type="primary" color="#17b3ec" size="mini">{{showDeviceDrug? '备货单药品' : '设备库存药品'}}</van-button>
            </div>
        </div>
        <div class="kitbox">
            <div class="left-list">
                <van-sidebar v-model="activeKey">
                    <van-sidebar-item v-for="(item, i) in list" :key="i" :title="(i+1)+'层'"  />
                    <van-sidebar-item v-for="(item, i) in list" :key="i" :title="i==0? '药品库' : (i)+'层'"  />
                </van-sidebar>
            </div>
            <div class="list box-flex-1 bgc-fff">
                <div class="item" v-for="(item, k) in curItem.list" :key="k">
                    <ProductItem :data="item" :index="k"/>
                <div v-if="activeKey===0" class="plr10">
                    <div @click="toQuick(item)" class="drug-item kitbox" v-for="(item, k) in curItem.list" :key="k">
                        <div class="photo">
                            <img src="@/assets/images/drug_default.png" alt="">
                        </div>
                        <div class="box-flex-1 pl10">
                            <div class="fs-15 ellipsis_1 c-333">{{item.drugName}}</div>
                            <div class="fs-14 c-666">
                                <div>设备库存:{{item.qty||item.inventoryNum}}</div>
                                <div v-if="!showDeviceDrug">申领数量:{{item.quantity}}</div>
                            </div>
                        </div>
                    </div>
                </div>
                <template v-else>
                    <div class="item" v-for="(item, k) in curItem.list" :key="k">
                        <ProductItem :data="item" :index="k"/>
                    </div>
                </template>
            </div>
        </div>
    </div>
@ -73,12 +94,18 @@ export default{
        return {
            deviceInfo: {device: ''},
            deviceId: this.$route.query.deviceId,
            list: [],
            list: [{
                index: -1,
                list: []
            }],
            activeKey: 0,
            curItem: [],
            openCount: 0,
            closeCount: 0,
            faultCount: 0
            faultCount: 0,
            outDetailList: [],
            deviceDrugList: [],
            showDeviceDrug: true
        }
    },
    watch:{
@ -87,15 +114,58 @@ export default{
        }
    },
    created() {
        this.findMediicinecabinetInventoryByDeviceId()
        this.initPage()
        this.findDeviceById()
    },
    methods:{
        $refreshData(){
            this.findMediicinecabinetInventoryByDeviceId()
        },
        findMediicinecabinetInventoryByDeviceId(){
        async initPage(){
            this.$loading('加载中..')
            await this.getDrugInventoryCount()
            await this.getOutDetailByUserIdAndDeviceId()
            this.findMediicinecabinetInventoryByDeviceId()
        },
        async getDrugInventoryCount(){
            let p = {
                deviceId: this.deviceId
            }
            console.log('getDrugInventoryCount', p)
            await medicineAbinetApi
                .getDrugInventoryCount(p)
                .then(res=>{
                    console.log('getDrugInventoryCount', res)
                    this.list[0].list = res.detailModelList
                    this.deviceDrugList = res.detailModelList
                })
                .catch(err=>{
                    console.error(err)
                })
        },
        async getOutDetailByUserIdAndDeviceId(){
            let p = {
                deviceId: this.deviceId,
                userId: this.user.id
            }
            console.log('getOutDetailByUserIdAndDeviceId', p)
            await medicineAbinetApi
                .getOutDetailByUserIdAndDeviceId(p)
                .then(res=>{
                    console.log('getOutDetailByUserIdAndDeviceId', res)
                    res.detailModelList.forEach(v=>{
                        var exist = _.find(this.deviceDrugList, m=>{
                            return v.drugCode == m.drugCode
                        })
                        v.qty = (exist&&exist.qty) || 0
                    })
                    this.outDetailList = res.detailModelList
                })
                .catch(err=>{
                    console.error(err)
                })
        },
        findMediicinecabinetInventoryByDeviceId(){
            let p = {
                deviceId: this.deviceId
            }
@ -124,7 +194,7 @@ export default{
                        this.closeCount = closeCount
                        this.faultCount = faultCount
                        list = _.sortBy(list, 'index')
                        this.list = list
                        this.list = this.list.concat(list)
                        this.curItem = this.list[this.activeKey]
                        console.log(list, this.curItem)
                    }
@ -149,6 +219,21 @@ export default{
                    console.error(err)
                })
        },
        changeShowDrug(){
            this.showDeviceDrug = !this.showDeviceDrug
            this.list[0].list = this.showDeviceDrug? this.deviceDrugList : this.outDetailList
        },
        toQuick(item){
            console.log(item)
            this.gotoUrl('/replenishment/start/quick', {
                deviceId: this.deviceId,
                drugName: item.drugName,
                drugCode: item.drugCode,
                drugId: item.drugId,
                qty: item.qty||item.inventoryNum,
                quantity: item.quantity,
            })
        }
    },
}
</script>
@ -170,6 +255,13 @@ export default{
                width: 90px;
            }
        }
        .drug-item{
            margin-top: 10px;
            img{
                width: 60px;
                border-radius: 5px;
            }
        }
    }
    .left-list{
        height: calc(100vh - 153px);
@ -192,7 +284,7 @@ export default{
.mainNobotHasTop{
    .replenishment-start-device-detail{
        .list, .left-list{
            height: calc(100vh - 199px);
            height: calc(100vh - 206px);
        }
    }
}

+ 510 - 0
mini-pro-web/src/views/replenishment/start/quick.vue

@ -0,0 +1,510 @@
<template>
    <div class='replenishment-start-quick fs-14'>
        <div class="plr10 bgc-fff ptb10">
            <div class="drug-item kitbox" :key="k">
                <div class="photo">
                    <img src="@/assets/images/drug_default.png" alt="">
                </div>
                <div class="box-flex-1 pl10">
                    <div class="fs-15 ellipsis_1 c-333">{{query.drugName}}</div>
                    <div class="fs-14 c-666 kitbox">
                        <div class="box-flex-1">
                            <div>设备库存:{{query.qty}}</div>
                            <div>申领数量:{{query.quantity}}</div>
                        </div>
                        <div class="stepper kitbox">
                            <van-stepper v-model="num" integer min="0" max="100" />
                            <div v-if="repAll" class="text">补满</div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="fs-14 pl15 ptb10 bgc-fff kitbox">
            <div class="box-flex-1 lh24">
                <span>从上往下数</span>
                <div class="color-block"></div>
                <span class="ml5 fs-12">已关闭</span>
                <div class="color-block ml10 red"></div>
                <span class="ml5 fs-12">故障</span>
            </div>
        </div>
        <div class="kitbox">
            <div class="left-list">
                <van-sidebar v-model="activeKey">
                    <van-sidebar-item v-for="(item, i) in list" :key="i" :title="(i+1)+'层'"  />
                </van-sidebar>
            </div>
            <div class="list box-flex-1 bgc-fff">
                <template v-if="curItem">
                    <div class="item" v-for="(item, k) in curItem.list" :key="k">
                        <ProductItem bussuness="quick" @onChange="onChange($event, item)" :data="item" :index="k"/>
                    </div>
                </template>
            </div>
        </div>
        <div class="bot-banner">
            <div class="kitbox">
                <div class="box-flex-1 plr5"><van-button @click="openAndCloseCargo" block plain color="#17b3ec" size="small" type="primary" round>关闭/开启货道</van-button></div>
                <div class="box-flex-1 plr5"><van-button @click="mergeAndSplitCargo" block plain color="#17b3ec" size="small" type="primary" round>合并/拆分货道</van-button></div>
                <div class="box-flex-1 plr5"><van-button @click="sumit" block color="#17b3ec" size="small" type="primary" round>完成补货({{allNum}})</van-button></div>
            </div>
        </div>
    </div>
</template>
<script>
import medicineAbinetApi from '@/api/api-medicineAbinet'
import ProductItem from '@/components/ProductItem'
export default{
    name: 'replenishmentStartDeviceDetail',
    components: {
        ProductItem
    },
    data(){
        return {
            num: 0,
            query: this.$route.query,
            selItemList: [],
            allNum: 0,
            deviceInfo: {device: ''},
            deviceId: this.$route.query.deviceId,
            list: [],
            activeKey: 0,
            curItem: [],
            openCount: 0,
            closeCount: 0,
            faultCount: 0,
            outDetailList: [],
            deviceDrugList: [],
            showDeviceDrug: true,
            repAll: true
        }
    },
    watch:{
        activeKey(n){
            console.log(this.selItemList, 'this.selItemList')
            this.curItem = ''
            this.$nextTick(()=>{
                this.curItem = this.list[n]
            })
        },
        num(n, o){
            this.repAll = false
            this.accessNum()
        }
    },
    created() {
        this.initPage()
        // this.findDeviceById()
    },
    methods:{
        $refreshData(){
            this.findMediicinecabinetInventoryByDeviceId()
        },
        initPage(){
            this.findMediicinecabinetInventoryByDeviceId()
        },
        findMediicinecabinetInventoryByDeviceId(){
            this.$loading('加载中..')
            let p = {
                deviceId: this.deviceId
            }
            console.log('params', p)
            medicineAbinetApi
                .findMediicinecabinetInventoryByDeviceId(p)
                .then(res=>{
                    console.log('findMediicinecabinetInventoryByDeviceId', res)
                    this.$toast.clear()
                    if(res.detailModelList && res.detailModelList.length){
                        var list = _.map(res.detailModelList, v=>{
                            var key = _.keys(v)[0]
                            return {
                                index: key,
                                list: _.filter(v[key], m=>{
                                    m.isActive = false
                                    return m.drugCode == this.query.drugCode || !m.drugCode
                                }),
                            }
                        })
                        list = _.sortBy(list, 'index')
                        this.list = list
                        this.curItem = this.list[this.activeKey]
                        console.log(list, this.curItem)
                    }
                })
                .catch(err=>{
                    console.error(err)
                })
        },
        findDeviceById(){
            let p = {
                deviceId: this.deviceId
            }
            console.log('params', p)
            medicineAbinetApi
                .findDeviceById(p)
                .then(res=>{
                    console.log('findDeviceById', res)
                    this.$toast.clear()
                    this.deviceInfo = res.obj
                })
                .catch(err=>{
                    console.error(err)
                })
        },
        onChange(isActive, item){
            var num = this.accessItemNum(item)
            item.isActive = isActive
            if(isActive){
                this.selItemList.push(item)
                this.allNum += num
            } else {
                this.selItemList.splice(this.selItemList.indexOf(item), 1)
                this.allNum -= num
            }
            console.log(this.curItem.list.indexOf(item))
        },
        accessItemNum(item){
            var num = 0
            if(this.repAll){
                num += item.cargoCapacity - item.qty
            } else {
                if(this.num - item.qty > 0){
                    num += (this.num - item.qty)
                }
            }
            return num
        },
        accessNum(){
            var num = 0
            this.selItemList.forEach(v=>{
                num += this.accessItemNum(v)
            })
            this.allNum = num
        },
        sumit(){
            if(!this.repAll){
                var exist = _.find(this.selItemList, v=>{
                    return v.qty > this.num
                })
                if(exist){
                    this.$dialog.alert({
                        title: '补货设置',
                        message: `补货数量不能小于当前货道库存,请重新选择数量进行补货`,
                        confirmButtonText: '我已知悉',
                    })
                    return
                }
            }
            this.$dialog.confirm({
                title: '补货设置',
                message: `确定进行补货?`,
                confirmButtonText: '确定',
            })
            .then(() => {
                var list = _.map(this.selItemList, v=>{
                    return {
                        cargoId: v.id,
                        drugId: this.query.drugId,
                        qty: this.repAll? Number(v.cargoCapacity) : this.num
                    }
                }) 
                this.$nextTick(()=>{
                    this.$loading('保存中..')
                    let p = {
                        list: JSON.stringify({list: list}),
                        userId: this.user.id 
                    }
                    console.log('params', p)
                    medicineAbinetApi
                        .batchAddInventory(p)
                        .then(res=>{
                            console.log('batchAddInventory', res)
                            this.selItemList = []
                            this.$toast({
                                message: '操作成功',
                                forbidClick: true,
                                onClose: ()=>{
                                }
                            })
                            this.$refreshData(true)
                        })
                        .catch(err=>{
                            console.error(err)
                        })
                })
            })
            var exist = _.find(this.selItemList, v=>{
                return v.faultState == 1
            })
            // if(exist){
            //     this.$toast('所选货道存在故障货道')
            //     return
            // }
            // batchAddInventory
        },
        checkOpenOrClose(){
            return new Promise((resolve, reject)=>{
                var g = _.groupBy(this.selItemList, 'cargoState')
                if(g[1] && g[0]){
                    this.$dialog.confirm({
                        title: '货道设置',
                        message: `选中货道已包含"关闭"和"开启"货道,请选择`,
                        confirmButtonText: '全部开启',
                        cancelButtonText: '全部关闭'
                    })
                    .then(() => {
                        resolve(1)
                    })
                    .catch(()=>{
                        resolve(0)
                    })
                } else {
                    resolve(g[1]? 0 : 1)
                }
            })
        },
        openAndCloseCargo(){
            if(!this.selItemList || !this.selItemList.length){
                this.$toast('请选择要操作的货道')
                return
            }
            this.checkOpenOrClose().then(cargoState=>{
                this.$nextTick(()=>{
                    var ids = _.map(this.selItemList, v=>{
                        return v.id
                    })
                    this.$loading('保存中..')
                    let p = {
                        cargoIds: ids.join(','),//必穿		货道id,多个id,英文逗号隔开,例如   1,2 		4,5,6
                        cargoState 		//必传		1开启,0关闭
                    }
                    console.log('params', p)
                    medicineAbinetApi
                        .openAndCloseCargo(p)
                        .then(res=>{
                            console.log('openAndCloseCargo', res)
                            this.selItemList.forEach(v=>{
                                v.isActive = false
                                v.cargoState = cargoState
                            })
                            this.selItemList = []
                            this.$toast({
                                message: '操作成功',
                                forbidClick: true,
                                onClose: ()=>{
                                }
                            })
                            // this.$refreshData(true)
                        })
                        .catch(err=>{
                            console.error(err)
                        })
                })
            })
        },
        checkMerge(){
            return new Promise((resolve, reject)=>{
                var exist = _.find(this.selItemList, v=>{
                    return !!v.drugCode
                })
                if(exist){
                    this.$toast.clear()
                    this.$dialog.confirm({
                        message: '当前合并货道存在药品,需把药品下架并取出,如您继续合并默认下架全部药品',
                        confirmButtonText: '继续合并'
                    })
                    .then(() => {
                        this.$loading('保存中..')
                        resolve(true)
                    })
                    .catch(() => {
                        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(){
            this.$loading('保存中..')
            var ids = []
            var g = _.groupBy(this.selItemList, 'state')
            if((g['21'] || g['20']) && g['1']){
                this.$toast.clear()
                this.$dialog.alert({
                    title: '货道设置',
                    message: `当前选中货道包含合并,您需要先手动拆分合并的货道`,
                    confirmButtonText: '我已知悉',
                })
                return
            }
            var isMerge = g['21']? false : true
            if(isMerge){
                console.log(this.selItemList, 'this.selectList')
                if(!this.selItemList.length || this.selItemList.length<2){
                    this.$toast('至少选择两个相邻的货道')
                    return
                }
                var list = _.sortBy(this.selItemList, ['layerNo', 'wayerNo'])
                var exist = _.find(list, (v, i)=>{
                    var next = list[i+1]
                    if(next){
                        if(next && v.layerNo!=next.layerNo){
                            return true
                        }
                        if(Number(v.wayerNo)+1 != Number(next.wayerNo)){
                            return true
                        }
                    }
                    return false
                })
                if(exist){
                    this.$toast('只能选择相邻的货道进行合并')
                    return 
                }
                if(!await this.checkMerge()){
                    return
                }
                ids = _.map(list, v=>{
                    return v.id
                })
            } else {
                if(!this.selItemList.length || this.selItemList.length>1 || this.selItemList[0].state!=21){
                    this.$toast('请选择一个主货道')
                    return
                }
                if(!await this.checkSplit()){
                    return
                }
                this.$loading('保存中..')
                var item = this.selItemList[0]
                // var list = this.list[Number(item.layerNo)-1].list
                ids.push(item.id)
                // for(var i=Number(item.wayerNo); i<list.length; i++){
                //     var v = list[i-1]
                //     if(v.state == 20){
                //         ids.push(v.id)
                //     } else {
                //         break;
                //     }
                // }
            }
            
            var p = {
                cargoIds: ids.join(','),
                isMerge
            }
            console.log(p)
            medicineAbinetApi
                .mergeAndSplitCargo(p)
                .then(res=>{
                    console.log('mergeAndSplitCargo', res)
                    if(res.status == 200){
                        this.selItemList = []
                        this.$toast('操作成功')
                        this.$refreshData()
                    } 
                })
                .catch(err=>{
                    console.error(err)
                })
        },
    },
}
</script>
<style lang='scss' scoped>
.replenishment-start-quick{
    .drug-item{
        img{
            width: 60px;
            border-radius: 5px;
        }
        .stepper{
            -webkit-box-align: end;
            position: relative;
            .text{
                position: absolute;
                background: #f2f3f5;
                width: 30px;
                text-align: center;
                left: 50%;
                transform: translateX(-50%);
                bottom: 0;
                line-height: 27px;
            }
        }
    }
    .list{
        display: flex;
        flex-wrap: wrap;
        height: calc(100vh - 153px);
        overflow-y: auto;
        // min-height: calc(100vh - 130px);
        .item{
            margin-left: 5px;
            margin-bottom: 5px;
            .components-product-item{
                width: 90px;
            }
        }
        
    }
    .left-list{
        height: calc(100vh - 153px);
    }
    .color-block{
        background: #ff9526;
        width: 10px;
        height: 10px;
        display: inline-block;
        margin-left: 20px;
        border-radius: 2px;
        &.red{
            background: #ff5e6c;
        }
    }
    .bot-banner{
        padding: 10px 5px;
        position: absolute;
        bottom: 0;
        width: 100%;
        left: 0;
        background: #fff;
        z-index: 3;
        >div{
            -webkit-box-flex: 1;
        }
    }
}
</style>
<style lang="scss">
.mainNobotHasTop{
    .replenishment-start-quick{
        .list, .left-list{
            height: calc(100vh - 174px);
        }
    }
}
</style>

+ 34 - 33
mini-pro-web/src/views/replenishment/stockUp/detail.vue

@ -12,7 +12,7 @@
            <div v-for="(item, i) in list" :key="i" class="row kitbox">
                <div class="box-flex-1 pl10 ellipsis">{{item.drugName}}</div>
                <div class="tc">{{item.qty}}</div>
                <div class="tc">{{item.upInventory}}</div>
                <div class="tc"><van-stepper v-model="item.upInventory" min="1" max="100"/></div>
                <div class="tc c-red"><span @click="del(item, i)">删除</span></div>
            </div>
        </div>
@ -42,55 +42,58 @@ export default{
    },
    created() {
        this.$EventBus.$on('drug-sel', (item)=>{
            item.qty = 0
            item.upInventory = 5
            var exist = _.find(this.list, v=>{
                return v.drugCode == item.drugCode
            })
            if(exist){
                return
            }
            exist = _.find(this.oriData, v=>{
                return v.drugCode == item.drugCode
            })
            item.qty = exist&&exist.qty || 0
            // item.upInventory = 5
            this.list.push(item)
            console.log('unusedAisles', this.oriData[0].unusedAisles)
        })
        this.getDetialOutOfStock()
        this.getOutOfStockInfoByDeviceWithPage()
    },
    methods:{
        getDetialOutOfStock(){
        getOutOfStockInfoByDeviceWithPage(){
            this.$loading('加载中..')
            let p = {
                ids: this.deviceId
                deviceId: this.deviceId,
                page: 1,
                size: 9999
            }
            console.log('params', p)
            medicineAbinetApi
                .getDetialOutOfStock(p)
                .getOutOfStockInfoByDeviceWithPage(p)
                .then(res=>{
                    console.log('getDetialOutOfStock', res)
                    console.log('getOutOfStockInfoByDeviceWithPage', res)
                    this.$toast.clear()
                    var data = res.detailModelList[0]
                    data.canPickCount = (data.unusedAisles) + (data.children&&data.children.length||0)
                    this.oriData = res.detailModelList
					this.list = res.detailModelList&&res.detailModelList[0].children
                    this.list = res.detailModelList
                    this.oriData = JSON.parse(JSON.stringify(res.detailModelList))
                })
                .catch(err=>{
                    console.error(err)
                })
        },
        submit(){
            if(!this.oriData[0].children.length){
            if(!this.list.length){
                this.$toast('请选择药品')
                return
            }
            this.$loading('保存中..')
            var list = _.map(this.oriData, v=>{
                return {
                    deviceId: v.id,
                    drugs: _.map(v.children, d=>{
            var p = {
                list: [{
                    deviceId: this.deviceId,
                    drugs: _.map(this.list, d=>{
                        return {
                            drugId: d.id,
                            qty: d.upInventory
                        }
                    })
                }
            })
            var p = {
                list
                }]
            }
            console.log('params', p)
            medicineAbinetApi
@ -113,15 +116,9 @@ export default{
        },
        del(item, k){
            this.list.splice(k, 1)
            console.log('unusedAisles', this.oriData[0].unusedAisles)
        },
        toAdd(){
            var device = this.oriData[0]
            if(device.canPickCount <= this.list.length){
				this.$toast(`已达到药柜容量,无法在添加`)
				return
			}
            this.gotoUrl('/drugList', {deviceId: device.id})
            this.gotoUrl('/drugList', {deviceId: this.deviceId, bussiness: 6})
        }
    },
}
@ -133,8 +130,12 @@ export default{
        .row{
            padding: 10px 0;
            border-bottom: 1px solid #e1e1e1;
            >div:nth-child(2), >div:nth-child(3), >div:nth-child(4){
                width: 80px;
            line-height: 28px;
            >div:nth-child(2), >div:nth-child(4){
                width: 60px;
            }
            >div:nth-child(3){
                width: 120px;
            }
            &:last-child{
                border-bottom: 0;