MrShi
2025-02-07 364d3221b9a8e6dd3a19701d30c4dc4239ef8abf
Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/funingyunwei into 2.0.1
已添加3个文件
已修改28个文件
1497 ■■■■■ 文件已修改
admin/src/api/store/index.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/stock/components/AssetSel.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/stock/components/OutEdit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/stock/components/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/stock/out.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/inventory/detail.vue 1024 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/login.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/polling/empty.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/wait.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/SmsEmailColudController.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwOutinboundController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStockController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/MemberExcelVO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelInVO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelOutVO.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-dev.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-pro.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-test.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/store/index.js
@@ -7,7 +7,8 @@
}
export function ywOutinboundEx (data) {
  return request.post('/visitsAdmin/cloudService/business/ywOutinbound/exportExcel', data, {
    trim: true
    trim: true,
    download: true
  })
}
export function ywOutinboundDetail (id) {
admin/src/views/stock/components/AssetSel.vue
@@ -21,14 +21,14 @@
    </el-form>
    <!--  -->
    <el-table @selection-change="handleSelectionChange" :data="list" stripe>
      <el-table-column type="selection"  width="55" />
      <el-table-column type="selection" width="55" />
      <el-table-column prop="code" label="物料编码" min-width="100px"></el-table-column>
      <el-table-column prop="name" label="物料名称" min-width="80px"></el-table-column>
      <el-table-column prop="qrcode" label="条码" min-width="100px"></el-table-column>
      <el-table-column prop="brand" label="品牌" min-width="80px"></el-table-column>
      <el-table-column prop="attr" label="规格型号" min-width="80px"></el-table-column>
      <el-table-column prop="unitName" label="单位" min-width="80px"></el-table-column>
      <el-table-column prop="maxStock" label="库存" min-width="80px"></el-table-column>
      <el-table-column v-if="isOut" prop="maxStock" label="库存" min-width="80px"></el-table-column>
    </el-table>
    <Pagination class="mt10" @size-change="handleSizeChange" @current-change="getList" :pagination="pagination">
    </Pagination>
@@ -82,19 +82,19 @@
    getList(page) {
      const { pagination, searchForm, isOut, warehouseId } = this
      this.listLoading = true
      if(page){pagination.page = page}
      console.log('isOut', isOut);
      if (page) { pagination.page = page }
      console.log('isOut', isOut)
      let fn = isOut ? ywStockPage : fetchList
      fn({
        capacity: pagination.pageSize,
        page: pagination.page,
        model: {...searchForm,status: 0, warehouseId}
        model: { ...searchForm, status: 0, warehouseId }
      }).then((res) => {
        this.listLoading = false
        this.list = res.records
        this.pagination.total = res.total || 0
        if(isOut){
        if (isOut) {
          this.list.forEach(item => {
            item.brand = item.materialBrand
            item.attr = item.materialAttr
@@ -123,7 +123,7 @@
      if (e && e.length == 2) {
        this.$set(this.searchForm, 'cateId', e[1])
        this.$set(this.searchForm, 'parentCateId', '')
      }else if((e && e.length == 1)){
      } else if ((e && e.length == 1)) {
        this.$set(this.searchForm, 'parentCateId', e[0])
        this.$set(this.searchForm, 'cateId', '')
      } else {
admin/src/views/stock/components/OutEdit.vue
@@ -82,7 +82,7 @@
      rules,
      storeList: [],
      list: [],
      StoreTypeOps: StoreTypeOps.filter(i => i.type == 1),
      StoreTypeOps: StoreTypeOps.filter(i => i.type == 1 && i.id != 10),
      dataList: [],
    }
admin/src/views/stock/components/config.js
@@ -4,13 +4,13 @@
  { name: '库存调整', id: 2, type: 0 },
  { name: '其它入库', id: 3, type: 0 },
  { name: '盘盈入库', id: 4, type: 0 },
  { name: '领用出库', id: 5, type: 1 },
  { name: '仓库出单', id: 6, type: 1 },
  { name: '调整出库', id: 7, type: 1 },
  { name: '采购出库', id: 8, type: 1 },
  { name: '其它出库', id: 9, type: 1 },
  { name: '盘出出库', id: 10, type: 1 },
  { name: '盘亏出库', id: 10, type: 1 },
]
export const rules = {
  warehouseId: [{ required: true, message: '请选择', trigger: 'blur' }],
admin/src/views/stock/out.vue
@@ -40,7 +40,7 @@
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration)
import { ywOutinboundPage } from '@/api'
import { ywOutinboundPage, ywOutinboundEx } from '@/api'
import { fetchList as getStoreList } from '@/api/ywWarehouse'
import { StoreTypeOps, rules } from './components/config'
export default {
h5/pages/inventory/detail.vue
@@ -32,7 +32,7 @@
                        <view class="line">规格型号:{{ item.materialAttr }}</view>
                        <view class="line" v-if="item.status == 0">
                            <view class="">账面数量:{{ item.stock }}{{ item.materialUnitName }}</view>
                            <view @click.stop="openEheck(item)" class="btn">执行盘点</view>
                            <view v-if="info.status == 1" @click.stop="openEheck(item)" class="btn">执行盘点</view>
                        </view>
                        <view class="static" v-if="item.status == 1">
                            <view class="ite">
@@ -81,13 +81,15 @@
                        <view class="line">
                            <view class="la">盘点数量:</view>
                            <view class="val">
                                <view class="wrap">
                                    <template v-if="!modalForm.handleType">
                                        <image v-if="!modalForm.actStock" src="@/static/side/btn_jian_grey@2x.png" mode=""></image>
                                        <image v-else @click="changeAct(-1)" src="@/static/side/btn_jian@3x.png" mode=""></image>
                                <view class="wrap">
                                    <template v-if="!modalForm.handleType">
                                        <image v-if="!modalForm.actStock" src="@/static/side/btn_jian_grey@2x.png" mode=""></image>
                                        <image v-else @click="changeAct(-1)" src="@/static/side/btn_jian@3x.png" mode=""></image>
                                    </template>
                                    <input :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" type="digit" v-model="modalForm.actStock"></input>
                                    <image v-if="!modalForm.handleType" @click="changeAct(1)" src="@/static/side/btn_jia@3x.png" mode=""></image>
                                    <input :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" type="digit"
                                        v-model="modalForm.actStock"></input>
                                    <image v-if="!modalForm.handleType" @click="changeAct(1)" src="@/static/side/btn_jia@3x.png" mode="">
                                    </image>
                                </view>
                                <view class="unit">{{ modalForm.materialUnitName }}</view>
                            </view>
@@ -95,8 +97,9 @@
                    </view>
                    <view class="remark">
                        <view class="la">备注:</view>
                        <textarea v-model="modalForm.remark" :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" placeholder="请填写备注" :maxlength="-1" placeholder-class="placeholder9"
                            cols="30" rows="10"></textarea>
                        <textarea v-model="modalForm.remark"
                            :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" placeholder="请填写备注"
                            :maxlength="-1" placeholder-class="placeholder9" cols="30" rows="10"></textarea>
                    </view>
                    <view v-if="!modalForm.handleType" class="btns">
                        <view class="btn" @click="showModal = false">取消</view>
@@ -127,557 +130,574 @@
</template>
<script>
import {
    ywStocktakingDetail,
    getYwStocktakingRecord,
    takingDataOpen,
    ywStocktaFinishById
} from '@/api'
import {
    Html5Qrcode
} from 'html5-qrcode'
export default {
    data() {
        return {
            param: {},
            info: {},
            id: '',
            activeTab: 0,
    import {
        ywStocktakingDetail,
        getYwStocktakingRecord,
        takingDataOpen,
        ywStocktaFinishById
    } from '@/api'
    import {
        Html5Qrcode
    } from 'html5-qrcode'
    export default {
        data() {
            return {
                param: {},
                info: {},
                id: '',
                activeTab: 0,
            list: [],
            page: 0,
            total: 0,
                list: [],
                page: 0,
                total: 0,
            showModal: false,
            showTip: false,
            modalForm: {},
                showModal: false,
                showTip: false,
                modalForm: {},
            html5Qrcode: null,
            isScaning: false,
                html5Qrcode: null,
                isScaning: false,
        }
    },
    onLoad(op) {
        this.id = op.id
        this.getDetail()
        this.getList()
    },
    methods: {
        itemClick(item) {
            if(item.status == 1){
                this.showItem(item)
            }
        },
        showItem(item){
            this.showModal = true
            this.modalForm = {
                ...item,
                handleType: this.info.status != 1 ? 'detail' : ''
            }
            console.log('modalForm', this.modalForm);
        },
        getDetail() {
            const {
                id
            } = this
            ywStocktakingDetail(id).then(res => {
                this.info = res.data
            })
        },
        handleQuery(str) {
            this.list = []
            this.page = 1
            this.getList(str)
        },
        getList(str) {
            const {
                page,
                activeTab,
                id,
                param
            } = this
            getYwStocktakingRecord({
                capacity: 20,
                page,
                model: {
                    status: str || activeTab,
                    stocktakingId: id,
                    ...param
                }
            }).then(res => {
                this.list = [...this.list, ...res.data.records]
                this.total = res.data.total
                if (this.param.materialQrcode && this.list.length == 1) {
                    this.openEheck(this.list[0])
                    this.$set(this.param, 'materialQrcode', null)
                }
            })
        },
        scrolltolower() {
            const {
                total,
                list
            } = this
            if (list.length < total) {
                this.page = this.page + 1
                this.getList()
            } else {
                this.showToast('暂无更多数据')
            }
        },
        openEheck(item) {
            this.modalForm = {
                ...item
            }
            this.showModal = true
        },
        onSubmit() {
            const {
                modalForm
            } = this
            if (!modalForm.actStock) return this.showToast('请输入正确的盘点数量')
            takingDataOpen({
                ...modalForm
            }).then(res => {
                if (res.code == 200) {
                    this.showToast('提交成功')
                    this.handleQuery()
                    this.getDetail()
                    this.showModal = false
                }
            })
        },
        changeAct(val) {
            const actStock = this.modalForm.actStock || 0
            this.$set(this.modalForm, 'actStock', actStock + val)
        },
        tabsClick(val) {
            this.activeTab = val
            this.page = 0
            this.list = []
        onLoad(op) {
            this.id = op.id
            this.getDetail()
            this.getList()
        },
        tipSub() {
            const { info } = this
            ywStocktaFinishById(info.id).then(res => {
                this.showTip = false
                uni.navigateBack()
            })
        },
        openQrcode() {
            this.isScaning = true
            Html5Qrcode.getCameras().then((devices) => {
                if (devices && devices.length) {
                    this.html5Qrcode = new Html5Qrcode('reader')
                    this.html5Qrcode.start({
                        facingMode: 'environment'
                    }, {
                        focusMode: 'continuous', //设置连续聚焦模式
                        fps: 5, //设置扫码识别速度
                        qrbox: 280 //设置二维码扫描框大小
                    },
                        (decodeText, decodeResult) => {
                            if (decodeText) { //这里decodeText就是通过扫描二维码得到的内容
                                this.stopScan()
                                this.$set(this.param, 'materialQrcode', decodeText)
                                this.handleQuery('null')
                            }
                        },
                        (err) => {
                            // console.log(err);  //错误信息
                        }
                    )
        methods: {
            itemClick(item) {
                if (item.status == 1) {
                    this.showItem(item)
                }
            })
        },
            },
            showItem(item) {
                this.showModal = true
                this.modalForm = {
                    ...item,
                    handleType: this.info.status != 1 ? 'detail' : ''
                }
                console.log('modalForm', this.modalForm);
            },
            getDetail() {
                const {
                    id
                } = this
                ywStocktakingDetail(id).then(res => {
                    this.info = res.data
        stopScan() {
            console.log('停止扫码')
            this.isScaning = false
            if (this.html5Qrcode) {
                this.html5Qrcode.stop()
                })
            },
            handleQuery() {
                this.list = []
                this.page = 1
                this.getList()
            },
            getList() {
                const {
                    page,
                    activeTab,
                    id,
                    param
                } = this
                getYwStocktakingRecord({
                    capacity: 20,
                    page,
                    model: {
                        status: activeTab,
                        stocktakingId: id,
                        ...param
                    }
                }).then(res => {
                    this.list = [...this.list, ...res.data.records || []]
                    this.total = res.data.total
                    if (this.param.materialQrcode && this.total == 1) {
                        this.openEheck(this.list[0])
                        this.param = {}
                    } else if (this.param.materialQrcode && this.total == 0) {
                        this.param = {}
                        uni.showModal({
                            content: '未匹配到物料,请重新扫码',
                            showCancel: false,
                            success: (res) => {
                                if (res.confirm) {
                                    this.getList()
                                }
                            }
                        });
                    }
                })
            },
            scrolltolower() {
                const {
                    total,
                    list
                } = this
                if (list.length < total) {
                    this.page = this.page + 1
                    this.getList()
                } else {
                    this.showToast('暂无更多数据')
                }
            },
            openEheck(item) {
                this.modalForm = {
                    ...item
                }
                this.showModal = true
            },
            onSubmit() {
                const {
                    modalForm
                } = this
                if (!modalForm.actStock) return this.showToast('请输入正确的盘点数量')
                takingDataOpen({
                    ...modalForm
                }).then(res => {
                    if (res.code == 200) {
                        this.showToast('提交成功')
                        this.handleQuery()
                        this.getDetail()
                        this.showModal = false
                    }
                })
            },
            changeAct(val) {
                const actStock = this.modalForm.actStock || 0
                this.$set(this.modalForm, 'actStock', actStock + val)
            },
            tabsClick(val) {
                this.activeTab = val
                this.page = 0
                this.list = []
                this.getList()
            },
            tipSub() {
                const {
                    info
                } = this
                ywStocktaFinishById(info.id).then(res => {
                    this.showTip = false
                    uni.navigateBack()
                })
            },
            openQrcode() {
                this.isScaning = true
                Html5Qrcode.getCameras().then((devices) => {
                    if (devices && devices.length) {
                        this.html5Qrcode = new Html5Qrcode('reader')
                        this.html5Qrcode.start({
                                facingMode: 'environment'
                            }, {
                                focusMode: 'continuous', //设置连续聚焦模式
                                fps: 5, //设置扫码识别速度
                                qrbox: 280 //设置二维码扫描框大小
                            },
                            (decodeText, decodeResult) => {
                                if (decodeText) { //这里decodeText就是通过扫描二维码得到的内容
                                    this.stopScan()
                                    this.$set(this.param, 'materialQrcode', decodeText)
                                    this.handleQuery()
                                }
                            },
                            (err) => {
                                // console.log(err);  //错误信息
                            }
                        )
                    }
                })
            },
            stopScan() {
                console.log('停止扫码')
                this.isScaning = false
                if (this.html5Qrcode) {
                    this.html5Qrcode.stop()
                }
            }
        }
    }
}
</script>
<style lang="scss">
.main_app {
    padding: 0 30rpx;
    overflow: hidden;
}
    .main_app {
        padding: 0 30rpx;
        overflow: hidden;
    }
.tabs {
    display: flex;
    width: 750rpx;
    margin: 12rpx -30rpx 20rpx;
    border-bottom: 1rpx solid #E5E5E5;
    .tab {
        font-size: 30rpx;
        color: #666666;
        flex: 1;
    .tabs {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: flex-end;
        height: 72rpx;
        width: 750rpx;
        margin: 12rpx -30rpx 20rpx;
        border-bottom: 1rpx solid #E5E5E5;
        .name {
        .tab {
            font-size: 30rpx;
            color: #666666;
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: flex-end;
            height: 72rpx;
            .name {
                display: flex;
                align-items: center;
            }
            .border {
                width: 54rpx;
                height: 6rpx;
                background-color: #fff;
                border-radius: 3rpx;
                margin-top: 12rpx;
            }
        }
        .active {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            .border {
                background-color: $primaryColor;
            }
        }
    }
    .head_wrap {
        display: flex;
        align-items: center;
        margin-bottom: 36rpx;
        .search_wrap {
            display: flex;
            align-items: center;
            width: 100%;
            height: 76rpx;
            background: #F7F7F7;
            border-radius: 38rpx;
            padding-left: 30rpx;
            input {
                flex: 1;
            }
            .search {
                width: 28rpx;
                height: 28rpx;
            }
        }
        .border {
            width: 54rpx;
            height: 6rpx;
    }
    .scroll_Y {
        height: calc(100vh - 350rpx);
    }
    .list {
        .item {
            border-bottom: 1rpx solid #E5E5E5;
            padding-bottom: 24rpx;
            margin-bottom: 16rpx;
            .title {
                font-weight: 600;
                font-size: 34rpx;
                color: #222222;
                margin-bottom: 10rpx;
                flex: 1;
            }
            .head {
                display: flex;
                // align-items: center;
                justify-content: space-between;
                color: #666666;
                .status {
                    width: 76rpx;
                    text-align: right;
                    padding-top: 3rpx;
                }
            }
            .line {
                height: 60rpx;
                display: flex;
                align-items: center;
                justify-content: space-between;
                color: #666666;
                .btn {
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    height: 60rpx;
                    padding: 0 20rpx;
                    background: #0068FF;
                    box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 104, 255, 0.3);
                    border-radius: 30rpx;
                    font-size: 26rpx;
                    color: #FFFFFF;
                }
            }
            .static {
                display: flex;
                height: 84rpx;
                background: #F7F7F7;
                font-size: 30rpx;
                margin-top: 12rpx;
                padding: 16rpx 0;
                .spi {
                    border: 1rpx solid #E5E5E5;
                }
                .ite {
                    flex: 1;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    .val {
                        font-weight: 500;
                    }
                }
            }
        }
    }
    .footer_btn {
        padding: 20rpx 40rpx 0;
        border-top: 1px solid #e5e5e5;
        width: 750rpx;
        margin: 0 -30rpx;
        .sweep {
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 32rpx;
            font-weight: 500;
            width: 670rpx;
            height: 88rpx;
            background: #0068FF;
            box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
            border-radius: 44rpx;
            color: #FFFFFF;
        }
        .sub_result {
            background-color: #fff;
            border-radius: 3rpx;
            margin-top: 12rpx;
            color: #FF0000;
            border: 1rpx solid #FF0000;
            box-shadow: none
        }
        image {
            width: 32rpx;
            height: 32rpx;
            margin-right: 6rpx;
        }
    }
    .active {
        font-weight: 600;
        font-size: 32rpx;
        color: #222222;
    .modal_wrap {
        padding: 36rpx 30rpx;
        .border {
            background-color: $primaryColor;
        .modal_title {
            font-weight: 500;
            font-size: 32rpx;
            color: #222222;
            margin-bottom: 40rpx;
            text-align: center;
        }
    }
}
.head_wrap {
    display: flex;
    align-items: center;
    margin-bottom: 36rpx;
    .search_wrap {
        display: flex;
        align-items: center;
        width: 100%;
        height: 76rpx;
        background: #F7F7F7;
        border-radius: 38rpx;
        padding-left: 30rpx;
        input {
            flex: 1;
        }
        .search {
            width: 28rpx;
            height: 28rpx;
        }
    }
}
.scroll_Y {
    height: calc(100vh - 350rpx);
}
.list {
    .item {
        border-bottom: 1rpx solid #E5E5E5;
        padding-bottom: 24rpx;
        margin-bottom: 16rpx;
        .title {
            font-weight: 600;
            font-size: 34rpx;
            color: #222222;
            margin-bottom: 10rpx;
            flex: 1;
        }
        .head{
            display: flex;
            // align-items: center;
            justify-content: space-between;
            color: #666666;
            .status{
                width: 76rpx;
                text-align: right;
                padding-top: 3rpx;
            }
        }
        .line {
            height: 60rpx;
        .item {
            font-size: 28rpx;
            color: #666666;
            height: 56rpx;
            display: flex;
            align-items: center;
            justify-content: space-between;
            color: #666666;
            .btn {
                display: flex;
                align-items: center;
                justify-content: center;
                height: 60rpx;
                padding: 0 20rpx;
                background: #0068FF;
                box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 104, 255, 0.3);
                border-radius: 30rpx;
                font-size: 26rpx;
                color: #FFFFFF;
            }
        }
        .static {
            display: flex;
            height: 84rpx;
            background: #F7F7F7;
            font-size: 30rpx;
            margin-top: 12rpx;
            padding: 16rpx 0;
        .content {
            border-top: 1rpx solid #E5E5E5;
            margin-top: 16rpx;
            .spi {
                border: 1rpx solid #E5E5E5;
            }
            .ite {
                flex: 1;
            .line {
                height: 84rpx;
                display: flex;
                align-items: center;
                justify-content: center;
                justify-content: space-between;
                .la {
                    font-weight: 500;
                    font-size: 32rpx;
                    color: #222222;
                }
                .val {
                    font-weight: 500;
                }
            }
        }
    }
}
.footer_btn {
    padding: 20rpx 40rpx 0;
    border-top: 1px solid #e5e5e5;
    width: 750rpx;
    margin: 0 -30rpx;
    .sweep {
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 32rpx;
        font-weight: 500;
        width: 670rpx;
        height: 88rpx;
        background: #0068FF;
        box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
        border-radius: 44rpx;
        color: #FFFFFF;
    }
    .sub_result {
        background-color: #fff;
        color: #FF0000;
        border: 1rpx solid #FF0000;
        box-shadow: none
    }
    image {
        width: 32rpx;
        height: 32rpx;
        margin-right: 6rpx;
    }
}
.modal_wrap {
    padding: 36rpx 30rpx;
    .modal_title {
        font-weight: 500;
        font-size: 32rpx;
        color: #222222;
        margin-bottom: 40rpx;
        text-align: center;
    }
    .title {
        font-weight: 600;
        font-size: 34rpx;
        color: #222222;
    }
    .item {
        font-size: 28rpx;
        color: #666666;
        height: 56rpx;
        display: flex;
        align-items: center;
    }
    .content {
        border-top: 1rpx solid #E5E5E5;
        margin-top: 16rpx;
        .line {
            height: 84rpx;
            display: flex;
            align-items: center;
            justify-content: space-between;
            .la {
                font-weight: 500;
                font-size: 32rpx;
                color: #222222;
            }
            .val {
                display: flex;
                justify-content: flex-end;
                align-items: center;
                flex: 1;
                .wrap {
                    display: flex;
                    justify-content: flex-end;
                    align-items: center;
                    flex: 1;
                    input {
                        width: 120rpx;
                        height: 72rpx;
                        border-radius: 8rpx;
                        border: 2rpx solid #0068FF;
                        margin: 0 16rpx;
                        padding: 0 10rpx;
                        text-align: center;
                    .wrap {
                        display: flex;
                        align-items: center;
                        input {
                            width: 120rpx;
                            height: 72rpx;
                            border-radius: 8rpx;
                            border: 2rpx solid #0068FF;
                            margin: 0 16rpx;
                            padding: 0 10rpx;
                            text-align: center;
                        }
                    }
                    .unit {
                        font-size: 30rpx;
                        color: #666666;
                        margin-left: 20rpx;
                    }
                }
                .unit {
                    font-size: 30rpx;
                    color: #666666;
                    margin-left: 20rpx;
                image {
                    width: 72rpx;
                    height: 72rpx;
                }
            }
        }
        .remark {
            margin-top: 16rpx;
            .la {
                font-size: 30rpx;
                color: #222222;
                margin-bottom: 16rpx;
            }
            textarea {
                width: 690rpx;
                height: 240rpx;
                background: #F7F7F7;
                border-radius: 12rpx;
                padding: 10rpx 20rpx;
            }
        }
        .btns {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-top: 80rpx;
            .btn {
                width: 336rpx;
                height: 88rpx;
                border-radius: 44rpx;
                border: 2rpx solid $primaryColor;
                display: flex;
                align-items: center;
                justify-content: center;
                font-size: 32rpx;
                color: $primaryColor;
            }
            .sub {
                background-color: $primaryColor;
                color: #fff;
            }
        }
    }
    .modal_t {
        width: 520rpx;
        text-align: center;
        display: flex;
        flex-direction: column;
        .h1 {
            height: 86rpx;
            font-weight: 500;
            font-size: 32rpx;
            color: #333333;
            display: flex;
            align-items: flex-end;
            justify-content: center;
        }
        .content {
            flex: 1;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            padding: 30rpx 0;
        }
        .btns {
            height: 102rpx;
            display: flex;
            align-items: center;
            border-top: 1rpx solid #E5E5E5;
            .btn {
                height: 102rpx;
                flex: 1;
                display: flex;
                align-items: center;
                justify-content: center;
                border-right: 1rpx solid #E5E5E5;
                font-weight: 400;
                font-size: 32rpx;
                color: #999999;
                &:nth-last-child(1) {
                    border-right: none;
                }
            }
            image {
                width: 72rpx;
                height: 72rpx;
            .sub {
                color: $primaryColor;
            }
        }
    }
    .remark {
        margin-top: 16rpx;
        .la {
            font-size: 30rpx;
            color: #222222;
            margin-bottom: 16rpx;
        }
        textarea {
            width: 690rpx;
            height: 240rpx;
            background: #F7F7F7;
            border-radius: 12rpx;
            padding: 10rpx 20rpx;
        }
    .reader-box {
        position: fixed;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        background-color: rgba(0, 0, 0, 0.5);
    }
    .btns {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-top: 80rpx;
        .btn {
            width: 336rpx;
            height: 88rpx;
            border-radius: 44rpx;
            border: 2rpx solid $primaryColor;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 32rpx;
            color: $primaryColor;
        }
        .sub {
            background-color: $primaryColor;
            color: #fff;
        }
    .reader {
        width: 100%;
        // width: 540rpx;
        // height: 540rpx;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }
}
.modal_t {
    width: 520rpx;
    text-align: center;
    display: flex;
    flex-direction: column;
    .h1 {
        height: 86rpx;
        font-weight: 500;
        font-size: 32rpx;
        color: #333333;
        display: flex;
        align-items: flex-end;
        justify-content: center;
    }
    .content {
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        padding: 30rpx 0;
    }
    .btns {
        height: 102rpx;
        display: flex;
        align-items: center;
        border-top: 1rpx solid #E5E5E5;
        .btn {
            height: 102rpx;
            flex: 1;
            display: flex;
            align-items: center;
            justify-content: center;
            border-right: 1rpx solid #E5E5E5;
            font-weight: 400;
            font-size: 32rpx;
            color: #999999;
            &:nth-last-child(1) {
                border-right: none;
            }
        }
        .sub {
            color: $primaryColor;
        }
    }
}
.reader-box {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: rgba(0, 0, 0, 0.5);
}
.reader {
    width: 100%;
    // width: 540rpx;
    // height: 540rpx;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
</style>
h5/pages/login.vue
@@ -101,7 +101,7 @@
                                        })
                                    } else {
                                        uni.redirectTo({
                                            url: "/pages/polling/empty"
                                            url: "/pages/polling/empty?message=" + res.message
                                        })
                                    }
                                })
@@ -164,7 +164,7 @@
                                        })
                                    } else {
                                        uni.redirectTo({
                                            url: "/pages/polling/empty"
                                            url: "/pages/polling/empty?message=" + res.message
                                        })
                                    }
                                })
h5/pages/polling/empty.vue
@@ -1,6 +1,7 @@
<template>
    <view class="main_app">
        <image class="logo" src="@/static/side/default_empty@2x.png" mode=""></image>
        <view class="message">{{message}}</view>
        <view class="btn" @click="backHome">返回主页</view>
    </view>
</template>
@@ -9,8 +10,11 @@
    export default {
        data() {
            return {
            };
                message: ''
            };
        },
        onLoad(op) {
            this.message = op.message || ''
        },
        methods: {
            backHome(){
@@ -29,6 +33,13 @@
        height: 228rpx;
        margin: 60% auto 0;
    }
    .message{
        font-weight: 500;
        font-size: 30rpx;
        color: #222222;
        margin-top: 20rpx;
        text-align: center;
    }
    .btn{
        position: fixed;
        bottom: 64rpx;
h5/pages/workOrder/wait.vue
@@ -28,7 +28,7 @@
                            <view v-if="item.status == 0 && item.param3 == 0 && (item.type == 0 || item.type == 1)" class="status">未开始
                            </view>
                            <view v-if="item.status == 0 && item.param3 == 1 && (item.type == 0 || item.type == 1)"
                                class="status green">进行中</view>
                                class="status green">{{ item.type == 0 ? '盘点中' : '进行中' }}</view>
                            <view v-if="item.status == 1 && item.type == 2" class="status gray">已处理</view>
                            <view v-if="item.status == 1 && (item.type == 0 || item.type == 1)" class="status gray">已完成</view>
                        </view>
@@ -37,7 +37,7 @@
                            <view class="text">执行时间:{{item.obj.key3}}</view>
                            <view class="text">
                                <view class="">巡检负责人:{{item.obj.key4}}</view>
                                <view class="btn" @click.stop="openSc(item)">
                                <view v-if="queryStatus == 0" class="btn" @click.stop="openSc(item)">
                                    <image src="@/static/side/ic_saoma@2x.png" mode=""></image>
                                    <view v-if="item.status == 0" class="">扫码巡检</view>
                                </view>
@@ -249,7 +249,7 @@
        .tabs {
            display: flex;
            width: 750rpx;
            margin: 12rpx 0rpx 0;
            margin: 0rpx 0rpx 0;
            border-bottom: 1rpx solid #E5E5E5;
            background-color: #fff;
server/system_gateway/src/main/resources/application.yml
@@ -1,6 +1,6 @@
# é¡¹ç›®ä¿¡æ¯é…ç½®
project:
  name: å®‰æ³°ç‰©æµè®¿å®¢ç³»ç»Ÿ
  name: é˜œå®åœºé¦†è¿ç»´
  version: 1.0.0
  env: development
#  env: production
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
@@ -20,6 +20,7 @@
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.MemberCard;
import com.doumee.dao.business.model.MemberRole;
import com.doumee.dao.business.vo.MemberExcelVO;
import com.doumee.dao.system.dto.UpdatePwdDto;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.ext.ERPSyncService;
@@ -27,6 +28,7 @@
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromSelfServiceImpl;
import io.swagger.annotations.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -412,4 +414,18 @@
        return ApiResponse.success(memberService.ywFindPage(pageWrap));
    }
    @ApiOperation("阜宁 - å¯¼å‡ºExcel")
    @PostMapping("/ywExportExcel")
    @CloudRequiredPermission("business:member:exportExcel")
    public void ywExportExcel (@RequestBody PageWrap<Member> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        List<Member> memberList =  memberService.ywFindPage(pageWrap).getRecords();
        List<MemberExcelVO> memberExcelVOList = new ArrayList<MemberExcelVO>();
        for (Member member:memberList) {
            MemberExcelVO memberExcelVO = new MemberExcelVO();
            BeanUtils.copyProperties(member,memberExcelVO);
            memberExcelVOList.add(memberExcelVO);
        }
        ExcelExporter.build(MemberExcelVO.class).export(memberExcelVOList, "人员信息表", response);
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/SmsEmailColudController.java
@@ -49,11 +49,30 @@
    @LoginNoRequired
    @PreventRepeat
    @ApiOperation("自定义短信内容")
    @PostMapping("/testSendSms")
    public ApiResponse testSendSms(@RequestBody SmsEmail smsEmail) {
    @ApiOperation("自定义短信内容hk")
    @PostMapping("/testSendSmsHk")
    public ApiResponse testSendSmsHk(@RequestBody SmsEmail smsEmail) {
        emayService.sendSmsByHk(smsEmail.getPhone(),smsEmail.getContent());
        return ApiResponse.success("操作成功");
    }
    @LoginNoRequired
    @PreventRepeat
    @ApiOperation("自定义短信内容")
    @PostMapping("/testSendSms")
    public ApiResponse testSendSms(@RequestBody SmsEmail smsEmail) {
        smsEmailService.sendBillSms(smsEmail.getContent(),smsEmail.getPhone(),null);
        return ApiResponse.success("操作成功");
    }
    @LoginNoRequired
    @PreventRepeat
    @ApiOperation("自定义邮件内容")
    @PostMapping("/testSendEmail")
    public ApiResponse testSendEmail(@RequestBody SmsEmail smsEmail) {
        smsEmailService.sendEmail(smsEmail.getEmail(),smsEmail.getContent(),null);
        return ApiResponse.success("操作成功");
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwOutinboundController.java
@@ -1,5 +1,6 @@
package com.doumee.cloud.admin;
import cn.emay.sdk.util.StringUtil;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.core.annotation.excel.ExcelExporter;
@@ -9,10 +10,13 @@
import com.doumee.core.model.PageData;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.YwOutinbound;
import com.doumee.dao.business.model.YwOutinboundRecord;
import com.doumee.dao.business.vo.YwOutinboundExcelInVO;
import com.doumee.dao.business.vo.YwOutinboundExcelOutVO;
import com.doumee.service.business.YwOutinboundService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@@ -82,7 +86,37 @@
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:ywoutinbound:exportExcel")
    public void exportExcel (@RequestBody PageWrap<YwOutinbound> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(YwOutinbound.class).export(ywOutinboundService.findPage(pageWrap).getRecords(), "运维出入库信息表", response);
        List<YwOutinbound> ywOutinboundList = ywOutinboundService.findPage(pageWrap).getRecords();
        Integer inOut = pageWrap.getModel().getInOut();
        if(Constants.equalsInteger(inOut,Constants.ZERO)){
            List<YwOutinboundExcelInVO> inList = new ArrayList<>();
            for (YwOutinbound ywOutinbound:ywOutinboundList) {
                YwOutinboundExcelInVO inVO = new YwOutinboundExcelInVO();
                BeanUtils.copyProperties(ywOutinbound,inVO);
                List<YwOutinboundRecord> ywOutinboundRecordList = ywOutinbound.getRecordList();
                StringBuffer stringBuffer = new StringBuffer();
                for (YwOutinboundRecord ywOutinboundRecord:ywOutinboundRecordList) {
                    stringBuffer.append(ywOutinboundRecord.getMaterialName()+"["+ywOutinboundRecord.getMaterialCode()+"]*"+ywOutinboundRecord.getStock()+ywOutinboundRecord.getMaterialUnitName()+";");
                }
                inVO.setOutMaterialNum(stringBuffer.toString());
                inList.add(inVO);
            }
            ExcelExporter.build(YwOutinboundExcelInVO.class).export(inList, "入库信息表", response);
        }else{
            List<YwOutinboundExcelOutVO> outList = new ArrayList<>();
            for (YwOutinbound ywOutinbound:ywOutinboundList) {
                YwOutinboundExcelOutVO ywOutinboundExcelOutVO = new YwOutinboundExcelOutVO();
                BeanUtils.copyProperties(ywOutinbound,ywOutinboundExcelOutVO);
                List<YwOutinboundRecord> ywOutinboundRecordList = ywOutinbound.getRecordList();
                StringBuffer stringBuffer = new StringBuffer();
                for (YwOutinboundRecord ywOutinboundRecord:ywOutinboundRecordList) {
                    stringBuffer.append(ywOutinboundRecord.getMaterialName()+"["+ywOutinboundRecord.getMaterialCode()+"]*"+ywOutinboundRecord.getStock()+ywOutinboundRecord.getMaterialUnitName()+";");
                }
                ywOutinboundExcelOutVO.setOutMaterialNum(stringBuffer.toString());
                outList.add(ywOutinboundExcelOutVO);
            }
            ExcelExporter.build(YwOutinboundExcelOutVO.class).export(outList, "出库信息表", response);
        }
    }
    @ApiOperation("根据ID查询")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwStockController.java
@@ -8,7 +8,9 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.YwPatrolTask;
import com.doumee.dao.business.model.YwStock;
import com.doumee.dao.business.model.YwWorkorder;
import com.doumee.service.business.YwStockService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -80,9 +82,10 @@
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:ywstock:exportExcel")
    public void exportExcel (@RequestBody PageWrap<YwStock> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(YwStock.class).export(ywStockService.findPage(pageWrap).getRecords(), "运维库存信息表", response);
        ExcelExporter.build(YwStock.class).export(ywStockService.findPage(pageWrap).getRecords(), "库存信息表_"+System.currentTimeMillis(), response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:ywstock:query")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -222,7 +222,6 @@
    private String email;
    @ApiModelProperty(value = "最后操作人")
    @TableField(exist = false)
    private String editorName;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java
@@ -32,7 +32,7 @@
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间",index = 5, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ExcelColumn(name="创建时间",index = 5, dateFormat = "yyyy-MM-dd HH:mm:ss",width = 16)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
@@ -50,7 +50,7 @@
    private String remark;
    @ApiModelProperty(value = "状态 0正常 1损坏 2报废", example = "1")
    @ExcelColumn(name="设备状态",index = 3, valueMapping = "0=正常;1=损坏;2=报废;")
    @ExcelColumn(name="设备状态",index = 3, valueMapping = "0=正常;1=损坏;2=报废;",width = 10)
    private Integer status;
    @ApiModelProperty(value = "设备型号", example = "1")
@@ -67,7 +67,7 @@
    private Date company;
    @ApiModelProperty(value = "情况说明")
    @ExcelColumn(name="运维备注",index = 4)
    @ExcelColumn(name="运维备注",index = 4,width = 30)
    private String content;
    @ApiModelProperty(value = "运维时间")
@@ -75,17 +75,17 @@
    private Date dealDate;
    @ApiModelProperty(value = "设备名称")
    @ExcelColumn(name="设备名称",index = 2)
    @ExcelColumn(name="设备名称",index = 2,width = 20)
    @TableField(exist = false)
    private String deviceName;
    @ApiModelProperty(value = "设备编号")
    @ExcelColumn(name="设备编号",index = 1)
    @ExcelColumn(name="设备编号",index = 1,width = 10)
    @TableField(exist = false)
    private String deviceCode;
    @ApiModelProperty(value = "运维人名称")
    @ExcelColumn(name="运维人",index = 0)
    @ExcelColumn(name="运维人",index = 0,width = 10)
    @TableField(exist = false)
    private String realName;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java
@@ -75,15 +75,15 @@
    @ApiModelProperty(value = "处理时间")
    @ExcelColumn(name="处理时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dealDate;
    @ApiModelProperty(value = "是否巡检  0=待开始;1=已巡检;", example = "1")
    @ExcelColumn(name="是否巡检  0=待开始;1=已巡检")
    private Integer status;
    @ApiModelProperty(value = "巡检结果  0=正常;1=异常", example = "1")
    @ExcelColumn(name="巡检结果  0=正常;1=异常")
    @ApiModelProperty(value = "巡检结果  0=正常;1=异常;2=跳过;", example = "1")
    @ExcelColumn(name="巡检结果  0=正常;1=异常;2=跳过;")
    private Integer dealStatus;
    @ApiModelProperty(value = "处理备注")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -20,65 +21,60 @@
@Data
@ApiModel("运维库存信息表")
@TableName("`yw_stock`")
public class YwStock {
public class YwStock  extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "仓库编码(关联yw_warehouse)")
    @ExcelColumn(name="仓库编码(关联yw_warehouse)")
    private Integer warehouseId;
    @ApiModelProperty(value = "物资编码(关联yw_material)", example = "1")
    @ExcelColumn(name="物资编码(关联yw_material)")
    private Integer materialId;
    @ApiModelProperty(value = "数量", example = "1")
    @ExcelColumn(name="数量")
    @ExcelColumn(name="数量",index = 6,width = 10)
    private BigDecimal stock;
    @ApiModelProperty(value = "资产编码")
    @ApiModelProperty(value = "物料编码")
    @ExcelColumn(name="物料编码",index = 0,width = 10)
    @TableField(exist = false)
    private String materialCode;
    @ApiModelProperty(value = "资产名称")
    @ApiModelProperty(value = "物料名称")
    @ExcelColumn(name="物料名称",index = 1,width = 10)
    @TableField(exist = false)
    private String materialName;
    @ApiModelProperty(value = "资产条形码")
    @ApiModelProperty(value = "条码")
    @ExcelColumn(name="条码",index = 2,width = 10)
    @TableField(exist = false)
    private String materialQrcode;
    @ApiModelProperty(value = "资产品牌")
    @ApiModelProperty(value = "品牌")
    @ExcelColumn(name="品牌",index = 3,width = 10)
    @TableField(exist = false)
    private String materialBrand;
@@ -86,11 +82,13 @@
    @TableField(exist = false)
    private String materialUnitName;
    @ApiModelProperty(value = "资产规格型号")
    @ApiModelProperty(value = "规格型号")
    @ExcelColumn(name="规格型号",index = 4,width = 10)
    @TableField(exist = false)
    private String materialAttr;
    @ApiModelProperty(value = "仓库名称")
    @ApiModelProperty(value = "所在仓库")
    @ExcelColumn(name="所在仓库",index = 5,width = 10)
    @TableField(exist = false)
    private String warehouseName;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/MemberExcelVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.doumee.dao.business.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserModel;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * äººå‘˜ä¿¡æ¯è¡¨
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Data
public class MemberExcelVO {
    @ApiModelProperty(value = "客户名称", example = "1")
    @ExcelColumn(name="客户名称",width = 10,index = 1)
    private String customerName;
    @ApiModelProperty(value = "联系人", example = "1")
    @ExcelColumn(name="联系人",width = 10,index = 2)
    private String name;
    @ApiModelProperty(value = "联系电话", example = "1")
    @ExcelColumn(name="联系电话",width = 10,index = 3)
    private String phone;
    @ApiModelProperty(value = "身份 0老板/超级管理员 1人事/管理员 2员工/普通员工", example = "1")
    @ExcelColumn(name="身份",width = 10,index = 4,valueMapping = "0=老板/超级管理员;1=人事/管理员;2=员工/普通员工;")
    private Integer highCheckor;
    @ApiModelProperty(value = "状态 0正常 1禁用 2拉黑/冻结", example = "1")
    @ExcelColumn(name="身份",width = 10,index = 5,valueMapping = "0=正常;1=禁用;")
    private Integer status;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelInVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.doumee.dao.business.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * è¿ç»´å‡ºå…¥åº“信息表
 * @author æ±Ÿè¹„蹄
 * @date 2025/01/06 11:05
 */
@Data
public class YwOutinboundExcelInVO {
    @ApiModelProperty(value = "单据编号")
    @ExcelColumn(name="入库单号",index = 0,width = 16)
    private String code;
    @ApiModelProperty(value = "仓库名称", example = "1")
    @ExcelColumn(name="入库仓库",index = 1,width = 16)
    private String warehouseName;
    @ApiModelProperty(value = "类型 0采购入库 1领用退回 2调整入库 3其他入库 4盘盈入库 5领用出库 6仓库出库 7调整出库 8采购出库 9其他出库 10盘亏出库", example = "1")
    @ExcelColumn(name="入库类型",index = 2,width = 10,valueMapping = "0=采购入库;1=领用退回;2=调整入库;3=其他入库;4=盘盈入库;5=领用出库;6=仓库出库;7=调整出库;8=采购出库;9=其他出库;10=盘亏出库;")
    private Integer type;
    @ApiModelProperty(value = "出库日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ExcelColumn(name="入库日期",index = 3,width = 16,dateFormat = "yyyy-MM-dd")
    private Date doneDate;
    @ApiModelProperty(value = "出库数量")
    @ExcelColumn(name="入库数量",index = 4,width = 16)
    private String outMaterialNum;
    @ApiModelProperty(value = "操作人名称", example = "1")
    @ExcelColumn(name="操作人",index = 5,width = 16)
    private String createUserName;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelColumn(name="操作时间",index = 6,width = 16,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelOutVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.doumee.dao.business.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.model.YwOutinboundRecord;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * è¿ç»´å‡ºå…¥åº“信息表
 * @author æ±Ÿè¹„蹄
 * @date 2025/01/06 11:05
 */
@Data
public class YwOutinboundExcelOutVO {
    @ApiModelProperty(value = "单据编号")
    @ExcelColumn(name="出库单号",index = 0,width = 16)
    private String code;
    @ApiModelProperty(value = "仓库名称", example = "1")
    @ExcelColumn(name="出库仓库",index = 1,width = 16)
    private String warehouseName;
    @ApiModelProperty(value = "类型 0采购入库 1领用退回 2调整入库 3其他入库 4盘盈入库 5领用出库 6仓库出库 7调整出库 8采购出库 9其他出库 10盘亏出库", example = "1")
    @ExcelColumn(name="出库类型",index = 2,width = 10,valueMapping = "0=采购入库;1=领用退回;2=调整入库;3=其他入库;4=盘盈入库;5=领用出库;6=仓库出库;7=调整出库;8=采购出库;9=其他出库;10=盘亏出库;")
    private Integer type;
    @ApiModelProperty(value = "出库日期")
    @ExcelColumn(name="出库日期",index = 3,width = 16,dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date doneDate;
    @ApiModelProperty(value = "出库数量")
    @ExcelColumn(name="出库数量",index = 4,width = 16)
    private String outMaterialNum;
    @ApiModelProperty(value = "操作人名称", example = "1")
    @ExcelColumn(name="领用人",index = 5,width = 16)
    private String createUserName;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="操作时间",index = 6,width = 16,dateFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -7,8 +7,9 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.CategoryService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -37,6 +38,22 @@
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private YwCustomerMapper ywCustomerMapper;
    @Autowired
    private YwWorkorderMapper ywWorkorderMapper;
    @Autowired
    private YwPatrolPointMapper ywPatrolPointMapper;
    @Autowired
    private YwDeviceMapper ywDeviceMapper;
    @Autowired
    private YwMaterialMapper ywMaterialMapper;
    @Override
    public Integer create(Category category) {
        checkUnique(category);
@@ -61,8 +78,32 @@
        return insert.getId();
    }
    @Override
    public void deleteById(Integer id) {
        Category category = categoryMapper.selectById(id);
        if(Objects.isNull(category)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(categoryMapper.selectCount(new QueryWrapper<Category>().lambda()
                .eq(Category::getIsdeleted,Constants.ZERO)
                .eq(Category::getParentId,id)
        )>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在子集数据,无法进行删除");
        }
        //查询数据是否已使用     3运维-工单分类 4运维-巡检区域 5运维-设备分类 6=客户行业 7=资产分类
        if(Constants.equalsInteger(category.getType(),Constants.THREE)){
            if(ywWorkorderMapper.selectCount(new QueryWrapper<YwWorkorder>().lambda().eq(YwWorkorder::getIsdeleted,Constants.ZERO).eq(YwWorkorder::getCateId,id))>Constants.ZERO)  throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"分类已被使用,无法进行删除");
        }else if (Constants.equalsInteger(category.getType(),Constants.FOUR)){
            if(ywPatrolPointMapper.selectCount(new QueryWrapper<YwPatrolPoint>().lambda().eq(YwPatrolPoint::getIsdeleted,Constants.ZERO).eq(YwPatrolPoint::getAreaId,id))>Constants.ZERO)  throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"分类已被使用,无法进行删除");
        }else if (Constants.equalsInteger(category.getType(),Constants.FIVE)){
            if(ywDeviceMapper.selectCount(new QueryWrapper<YwDevice>().lambda().eq(YwDevice::getIsdeleted,Constants.ZERO).eq(YwDevice::getCateId,id))>Constants.ZERO)  throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"分类已被使用,无法进行删除");
        }else if (Constants.equalsInteger(category.getType(),Constants.SIX)){
            if(ywCustomerMapper.selectCount(new QueryWrapper<YwCustomer>().lambda().eq(YwCustomer::getIsdeleted,Constants.ZERO).eq(YwCustomer::getIndustryId,id))>Constants.ZERO)  throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"分类已被使用,无法进行删除");
        }else if (Constants.equalsInteger(category.getType(),Constants.SEVEN)){
            if(ywMaterialMapper.selectCount(new QueryWrapper<YwMaterial>().lambda().eq(YwMaterial::getIsdeleted,Constants.ZERO).eq(YwMaterial::getCateId,id))>Constants.ZERO)  throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"分类已被使用,无法进行删除");
        }
        categoryMapper.update(null,new UpdateWrapper<Category>().lambda().set(Category::getIsdeleted,Constants.ONE)
                .eq(Category::getId,id)
        );
@@ -195,6 +236,8 @@
        wrapper.lambda()
                .ne(Objects.nonNull(category.getId()),Category::getId,category.getId())
                .eq(Category::getIsdeleted,Constants.ZERO)
                .eq(Objects.nonNull(category.getParentId()),Category::getParentId,category.getParentId())
                .isNull(Objects.isNull(category.getParentId()),Category::getParentId)
                .eq(Category::getType,category.getType())
                .eq(Category::getName,category.getName());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
@@ -106,10 +106,11 @@
        String code = Constants.getRandom6Num();
        SmsConfig smsConfig = smsConfigMapper.selectOne(new QueryWrapper<SmsConfig>().lambda().eq(SmsConfig::getObjType,
                SmsConstants.inventCode).last(" limit 1 "));
        String comName = systemDictDataBiz.queryByCode(Constants.SMS,Constants.SMS_COMNAME).getCode();
        //开启短信通知
        if(Objects.nonNull(smsConfig) || Constants.equalsInteger(smsConfig.getStatus(),Constants.ZERO)){
            if(StringUtils.isNotBlank(smsConfig.getContent())){
                String content  = smsConfig.getContent().replace("{验证码}",code);
                String content  = comName + smsConfig.getContent().replace("{验证码}",code);
                emayService.sendSingleSms(smsEmail.getPhone(),content);
                smsEmail.setRemark(code);
                smsEmail.setIsdeleted(Constants.ZERO);
@@ -617,6 +618,7 @@
        if(result){
            result=   emailService.sendEmail(email,"账单催费",content,null);
        }
        content = systemDictDataBiz.queryByCode(Constants.SMS,Constants.SMS_COMNAME).getCode() + content;
        SmsEmail smsEmail = new SmsEmail();
        smsEmail.setRemark(result?"邮件发送成功":"邮件发送失败");
        smsEmail.setIsdeleted(Constants.ZERO);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -600,6 +600,7 @@
            .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
            .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
            .eq(YwContractBill::getIsdeleted,Constants.ZERO)
            .eq(YwContractBill::getStatus,Constants.ZERO)
            .in(YwContractBill::getPayStatus,Constants.ZERO,Constants.TWO,Constants.THREE,Constants.FOUR)
            .eq(YwContractBill::getContractId,contractId)
            .orderByDesc(YwContractBill::getId);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java
@@ -249,19 +249,6 @@
                    .set(YwPatrolTask::getEditor,loginUserInfo.getId())
            );
//            if(ywPatrolTaskMapper.selectCount(new QueryWrapper<YwPatrolTask>().lambda()
//                    .eq(YwPatrolTask::getSchemeId,ywPatrolTask.getSchemeId())
//                    .in(YwPatrolTask::getStatus,Constants.ZERO,Constants.ONE)
//                    .ne(YwPatrolTask::getId,ywPatrolTask.getId())
//            )==Constants.ZERO){
//                ywPatrolSchemeMapper.update(null,new UpdateWrapper<YwPatrolScheme>().lambda()
//                        .eq(YwPatrolScheme::getId,ywPatrolScheme.getId())
//                        .set(YwPatrolScheme::getStatus,Constants.TWO)
//                        .set(YwPatrolScheme::getEditDate,DateUtil.getCurrDateTime())
//                        .set(YwPatrolScheme::getEditor,loginUserInfo.getId())
//                );
//            }
            //标记待办已处理
            noticesJoinMapper.update(null,new UpdateWrapper<Notices>().lambda()
                    .set(Notices::getStatus,Constants.ONE)
@@ -279,14 +266,6 @@
                        .set(YwPatrolTask::getEditor,loginUserInfo.getId())
                );
            }
//            if(Constants.equalsInteger(ywPatrolScheme.getStatus(),Constants.ZERO)){
//                ywPatrolSchemeMapper.update(null,new UpdateWrapper<YwPatrolScheme>().lambda()
//                        .eq(YwPatrolScheme::getId,ywPatrolScheme.getId())
//                        .set(YwPatrolScheme::getStatus,Constants.ONE)
//                        .set(YwPatrolScheme::getEditDate,DateUtil.getCurrDateTime())
//                        .set(YwPatrolScheme::getEditor,loginUserInfo.getId())
//                );
//            }
            //标记待办已处理
            noticesJoinMapper.update(null,new UpdateWrapper<Notices>().lambda()
                    .set(Notices::getParam3,Constants.ONE)
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java
@@ -263,7 +263,26 @@
                .le(Objects.nonNull(model.getDealDateEnd()),YwProblem::getDealDate, Utils.Date.getEnd(model.getDealDateEnd()))
                .eq(Objects.nonNull(model.getDealStatus()),YwProblem::getDealStatus,model.getDealStatus())
        ;
        IPage iPage = ywProblemMapper.selectJoinPage(page,YwProblem.class,queryWrapper);
        IPage<YwProblem> iPage = ywProblemMapper.selectJoinPage(page,YwProblem.class,queryWrapper);
        for (YwProblem ywProblem:iPage.getRecords()) {
            List<Multifile> multifiles = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                    .eq(Multifile::getObjId, ywProblem.getId() )
                    .in(Multifile::getObjType, Arrays.asList(new Integer[]{Constants.MultiFile.PROBLEM_FILE.getKey() }))
                    .eq(Multifile::getIsdeleted,Constants.ZERO));
            if(multifiles!=null){
                String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                        +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_WORKORDER_FILE).getCode();
                for(Multifile f : multifiles){
                    if(StringUtils.isBlank(f.getFileurl())){
                        continue;
                    }
                    f.setFileurlFull(path+f.getFileurl());
                }
                ywProblem.setFileList(multifiles);
            }
        }
        return PageData.from(iPage);
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
@@ -138,6 +138,9 @@
        queryWrapper.selectAll(YwRoom.class )
                .selectAs(YwProject::getName,YwRoom::getProjectName)
                .selectAs(YwFloor::getName,YwRoom::getFloorName)
                .select(" ifnull( ( select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
                        "from yw_contract y1 left join yw_contract_room y2 on y1.id = y2.CONTRACT_ID and y2.TYPE = 0  " +
                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1  ) ,0) ",YwRoom::getLeaseStatus)
                .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
@@ -503,6 +503,9 @@
        if (pageWrap.getModel().getRoomId() != null) {
            queryWrapper.eq(YwWorkorder::getRoomId, pageWrap.getModel().getRoomId());
        }
        if (pageWrap.getModel().getFloorId() != null) {
            queryWrapper.eq(YwWorkorder::getFloorId, pageWrap.getModel().getFloorId());
        }
        if (pageWrap.getModel().getUserId() != null) {
            queryWrapper.eq(YwWorkorder::getUserId, pageWrap.getModel().getUserId());
        }
server/visits/dmvisit_service/src/main/resources/application-dev.yml
@@ -15,7 +15,15 @@
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  mail:
    default-encoding: UTF-8
    host: smtp.exmail.qq.com
    username: jp@doumee.com
    password: p7iKUE8VvQQpY58S
    properties:
      mail:
        smtp:
          auth: true
debug_model: true
@@ -26,6 +34,8 @@
  need-deal-img: true #是否需要处理图片数据
########################压缩包文件位置  ########################
zip_file_path: d://
# Swagger配置
swagger:
  host: 127.0.0.1
server/visits/dmvisit_service/src/main/resources/application-pro.yml
@@ -15,10 +15,21 @@
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  mail:
    default-encoding: UTF-8
    host: smtp.exmail.qq.com
    username: jp@doumee.com
    password: p7iKUE8VvQQpY58S
    properties:
      mail:
        smtp:
          auth: true
debug_model: true
########################压缩包文件位置  ########################
zip_file_path: d://
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 0 #组织数据 0自建 2以海康为主 1华晟ERP系统
server/visits/dmvisit_service/src/main/resources/application-test.yml
@@ -15,10 +15,20 @@
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  mail:
    default-encoding: UTF-8
    host: smtp.exmail.qq.com
    username: jp@doumee.com
    password: p7iKUE8VvQQpY58S
    properties:
      mail:
        smtp:
          auth: true
debug_model: true
########################压缩包文件位置  ########################
zip_file_path: d://
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 0 #组织数据 0自建 2以海康为主 1华晟ERP系统