doum
9 小时以前 5083abb65d2a6e43603ee11575b0e233b00a085c
最新版本541200007
已修改11个文件
218 ■■■■ 文件已修改
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/device.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWarningRuleWindow.vue 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/warningRule.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -5,7 +5,7 @@
# VUE_APP_API_URL  = 'http://192.168.1.45:10010'
VUE_APP_API_URL  = 'http://192.168.0.7/system_gateway'
#VUE_APP_API_URL  = 'http://192.168.0.7/system_gateway'
VUE_APP_API_URL  = 'http://localhost:10010'
admin/src/api/business/device.js
@@ -17,6 +17,9 @@
export function getList (data) {
  return request.post('/visitsAdmin/cloudService/business/device/getList', data)
}
export function allList (data) {
  return request.post('/visitsAdmin/cloudService/business/device/list', data)
}
export function getDeviceRoleList (data) {
  return request.post('/visitsAdmin/cloudService/business/deviceRole/list', data)
}
admin/src/components/business/OperaWarningRuleWindow.vue
@@ -1,7 +1,7 @@
<template>
  <GlobalWindow
    :title="title"
    width="50%"
    width="80%"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
@@ -11,12 +11,6 @@
      2.发生区域非必填,不填则表示该规则下所有区域的相应报警类型均通知;<br>
    </p>
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="选择签到通知人员" prop="memberIds" style="margin-bottom: 30px" >
        <el-select v-model="memberSelect" filterable multiple clearable  placeholder="请选择" @change="changeMembers">
          <el-option v-for="item in memberList" :key="'member_'+item.id" :label="item.name+'-'+item.companyName" :value="item.id+''">
          </el-option>
        </el-select>
      </el-form-item>
      <div style="display: flex;" v-for="(item,index) in form.detailList" :key="'region_'+item.random" >
        <span style="line-height: 32px;font-size: 14px;"><b style="color: #F56C6C;margin-right: 4px;font-size: 11px;">*</b>{{'规则'+(index +1)}}</span>
        <el-form-item label=""   style="display: inline-block;margin-left: 10px; " >
@@ -53,6 +47,27 @@
      <el-form-item label="发生间隔时间(秒)" prop="intervalSec">
        <el-input type="number" v-model="form.intervalSec" placeholder="请输入多规则间隔时间(秒)" v-trim/>
      </el-form-item>
      <el-form-item label="钉钉通知" prop="memberNotice"  style="display:inline-block;width: 50%;">
        <el-switch    style="margin-right:30px;width:100px"    v-model="form.memberNotice" :active-value="1"  :inactive-value="0" active-text="开" inactive-text="关"></el-switch>
      </el-form-item>
      <el-form-item label="选择钉钉通知人员" v-if="form.memberNotice ==1" prop="memberIds" style="margin-bottom: 30px" >
        <el-select v-model="memberSelect" filterable multiple clearable  placeholder="请选择" @change="changeMembers">
          <el-option v-for="item in memberList" :key="'member_'+item.id" :label="item.name+'-'+item.companyName" :value="item.id+''">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="广播通知" prop="deviceNotice"  style="display:inline-block;width: 50%;" >
        <el-switch    style="margin-right:30px;width: 100px"    v-model="form.deviceNotice" :active-value="1"  :inactive-value="0" active-text="开" inactive-text="关">></el-switch>
      </el-form-item>
      <el-form-item label="选择播报广播" v-if="form.deviceNotice ==1"  prop="deviceIds" style="margin-bottom: 30px" >
        <el-select v-model="deviceSelect" filterable multiple clearable  placeholder="请选择" @change="changeDevices">
          <el-option v-for="item in deviceList" :key="'device_'+item.id" :label="item.name" :value="item.id+''">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="广播播报内容"  v-if="form.deviceNotice ==1" prop="deviceNoticeContent">
        <el-input type="text" v-model="form.deviceNoticeContent" placeholder="请输入播报内容" v-trim/>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
@@ -61,6 +76,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
import { allList as allDveiceList } from '@/api/business/device'
import { allList as warningList, regionList } from '@/api/business/warning'
export default {
  name: 'OperaWarningRuleWindow',
@@ -72,19 +88,28 @@
      form: {
        id: null,
        memberIds: '',
        deviceIds: '',
        deviceNoticeContent: '',
        deviceNotice: 1,
        memberNotice: 1,
        intervalSec: '',
        sortnum: '',
        status: 0,
        detailList: [{ random:Math.random(),regionId: null, regionName: null, regionCode: null ,warningId:null}]
        detailList: [{ random: Math.random(), regionId: null, regionName: null, regionCode: null, warningId: null }]
      },
      deviceSelect: [],
      memberSelect: [],
      memberList: [],
      deviceList: [],
      warningList: [],
      regionList: [],
      // 验证规则
      rules: {
        memberNotice: [{ required: true, message: '请选择钉钉通知' }],
        deviceNotice: [{ required: true, message: '请选择是否广播通知' }],
        deviceIds: [{ required: true, message: '请选择播报广播', tigger: 'blur' }],
        memberIds: [{ required: true, message: '请选择通知人员', tigger: 'blur' }],
        status: [{ required: true, message: '请选择状态'}]
        status: [{ required: true, message: '请选择状态' }]
      }
    }
  },
@@ -106,22 +131,22 @@
        children: node.childList
      }
    },
    changeSel(opt){
    changeSel (opt) {
      var item = this.form.detailList[opt]
      this.form.detailList[opt].regionCode = null
      this.form.detailList[opt].regionName = null
      if(item.regionId){
      if (item.regionId) {
        var reg = this.getSelectedObject(item.regionId)
        if(reg){
        if (reg) {
          this.form.detailList[opt].regionCode = reg.indexCode
          this.form.detailList[opt].regionName = reg.name
        }
      }
      console.log(" this.form.detailList[opt]",reg, this.form.detailList[opt])
      console.log(' this.form.detailList[opt]', reg, this.form.detailList[opt])
    },
    getSelectedObject(id) {
    getSelectedObject (id) {
      if (!id) {
        return null  // 没有选中项时返回 null 或 {} 根据需要处理
        return null // 没有选中项时返回 null 或 {} 根据需要处理
      }
      const findSelected = (options) => {
        for (const option of options) {
@@ -132,12 +157,12 @@
            if (found) return found // 如果找到返回该对象
          }
        }
        return null; // 未找到返回 null 或 {} 根据需要处理
        return null // 未找到返回 null 或 {} 根据需要处理
      }
      return findSelected(this.regionList); // 开始搜索并返回结果
      return findSelected(this.regionList) // 开始搜索并返回结果
    },
    addDo () {
      this.form.detailList.push({random:Math.random(), regionId: null, regionName: null, regionCode: null,warningId:null })
      this.form.detailList.push({ random: Math.random(), regionId: null, regionName: null, regionCode: null, warningId: null })
    },
    delDo (index) {
      if (this.form.detailList.length > 1 && this.form.detailList.length > index) {
@@ -152,20 +177,34 @@
      }
      this.form.memberIds = this.memberSelect.join(',')
    },
    changeDevices () {
      console.log(this.deviceSelect)
      this.form.deviceIds = ''
      if (!this.deviceSelect || !this.deviceSelect.length) {
        return
      }
      this.form.deviceIds = this.deviceSelect.join(',')
    },
    open (title, target) {
      this.memberSelect =[]
      this.memberSelect = []
      this.deviceSelect = []
      this.title = title
      this.loadMember()
      this.loadDevice()
      this.loadRegions()
      this.loadWarning()
      this.visible = true
      this.form = {
        id: null,
        memberIds: '',
        deviceIds: '',
        intervalSec: '',
        sortnum: '',
        deviceNotice: 1,
        deviceNoticeContent: '',
        memberNotice: 1,
        status: 0,
        detailList: [{ random:Math.random(),regionId: null, regionName: null, regionCode: null,warningId:null }]
        detailList: [{ random: Math.random(), regionId: null, regionName: null, regionCode: null, warningId: null }]
      }
      // 新建
      if (target == null) {
@@ -181,10 +220,13 @@
          this.form[key] = target[key]
        }
        if (!this.form.detailList || !this.form.detailList.length) {
          this.form.detailList = [{ random:Math.random(),regionId: null, regionName: null, regionCode: null,warningId:null }]
          this.form.detailList = [{ random: Math.random(), regionId: null, regionName: null, regionCode: null, warningId: null }]
        }
        if(this.form.memberIds){
          this.memberSelect = this.form.memberIds.split(",")
        if (this.form.memberIds) {
          this.memberSelect = this.form.memberIds.split(',')
        }
        if (this.form.deviceIds) {
          this.deviceSelect = this.form.deviceIds.split(',')
        }
      })
    },
@@ -195,6 +237,13 @@
        this.memberList = res
      })
    },
    loadDevice () {
      allDveiceList({
        type: 4
      }).then(res => {
        this.deviceList = res
      })
    },
    loadWarning () {
      warningList({
      }).then(res => {
admin/src/views/business/warningRule.vue
@@ -8,6 +8,9 @@
      <el-form-item label="人员/部门" prop="memberNames">
        <el-input v-model="searchForm.memberNames" placeholder="请输入人员或部门名" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="广播名称" prop="memberNames">
        <el-input v-model="searchForm.deviceNames" placeholder="请输入广播名称" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态" prop="status" >
        <el-select v-model="searchForm.status" placeholder="请选择状态" clearable @change="search">
          <el-option label="禁用" value="0"></el-option>
@@ -34,7 +37,18 @@
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="title" label="报警规则" min-width="200px" show-tooltip-when-overflow></el-table-column>
        <el-table-column prop="memberNames" label="报警接收人" min-width="200px" show-tooltip-when-overflow></el-table-column>
        <el-table-column prop="memberNames" label="报警接收人" min-width="200px" show-tooltip-when-overflow>
          <template slot-scope="{row}">
           <span v-if="row.memberNotice === 1">{{row.memberNames}}</span>
           <span v-else class="red">未开启</span>
          </template>
        </el-table-column>
        <el-table-column prop="deviceNames" label="报警播报广播" min-width="200px" show-tooltip-when-overflow>
          <template slot-scope="{row}">
            <span v-if="row.deviceNotice === 1">{{row.deviceNames}}</span>
            <span v-else class="red">未开启</span>
          </template>
        </el-table-column>
        <el-table-column prop="intervalSec" label="间隔时间(秒)" min-width="100px" ></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px" >
          <template slot-scope="{row}">
@@ -83,6 +97,7 @@
      searchForm: {
        title: '',
        memberNames: '',
        deviceNames: '',
        status:'',
      }
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java
@@ -88,6 +88,12 @@
    public ApiResponse<PageData<Device>> findPage (@RequestBody PageWrap<Device> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        return ApiResponse.success(deviceService.findPage(pageWrap));
    }
    @ApiOperation("查询全部")
    @PostMapping("/list")
    @CloudRequiredPermission("business:device:query")
    public ApiResponse<List<Device>> findPage (@RequestBody   Device model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        return ApiResponse.success(deviceService.findList(model));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -323,9 +323,9 @@
        param.setWithCameras(0);
        List<PageRegionInfoResponse>  result = new ArrayList<>();
        try {
//            result = boardService.getRegionTree( param);
            result = boardService.getRegionTree( param);
            //------TODO---------测试模拟数据----start-----
            for (int i = 0; i < 5; i++) {
           /* for (int i = 0; i < 5; i++) {
                PageRegionInfoResponse t = new PageRegionInfoResponse();
                t.setName("总区域_"+i);
                t.setIndexCode(i+"_code");
@@ -338,7 +338,7 @@
                    t.getChildList().add(t1);
                }
                result.add(t);
            }
            }*/
            //------TODO---------测试模拟数据----end-----
        }catch (Exception e){
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active: pro
    active: dev
  application:
    name: visitsAdmin
    # 安全配置
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Device;
import com.github.yulichang.base.MPJBaseMapper;
import java.util.Collection;
@@ -9,6 +10,6 @@
 * @author 江蹄蹄
 * @date 2023/11/30 15:33
 */
public interface DeviceMapper extends BaseMapper<Device> {
public interface DeviceMapper extends MPJBaseMapper<Device> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java
@@ -70,6 +70,10 @@
    @ApiModelProperty(value = "状态 0禁用 1启用", example = "1")
    @ExcelColumn(name="状态 0禁用 1启用")
    private Integer status;
    @ApiModelProperty(value = "是否人员通知 0否 1是", example = "1")
    private Integer memberNotice;
    @ApiModelProperty(value = "是否广播通知 0否 1是", example = "1")
    private Integer deviceNotice;
    @ApiModelProperty(value = "报警类型编码(关联warning)", example = "1")
    @ExcelColumn(name="报警类型编码(关联warning)")
@@ -77,6 +81,15 @@
    @ApiModelProperty(value = "通知人员-部门集合,多个英文分号隔开", example = "1")
    private String memberNames;
    @ApiModelProperty(value = "广播编码集合(关联device),多个英文逗号隔开", example = "1")
    private String deviceIds;
    @ApiModelProperty(value = "广播名称集合,多个英文分号隔开", example = "1")
    private String deviceNames;
    @ApiModelProperty(value = "广播播报内容", example = "1")
    private String deviceNoticeContent;
    @ApiModelProperty(value = "人员部门", example = "1")
    @TableField(exist = false)
    private String companyName;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -123,6 +123,7 @@
    @Override
    public List<Device> findList(Device device) {
        device.setIsdeleted(Constants.ZERO);
        QueryWrapper<Device> wrapper = new QueryWrapper<>(device);
        return deviceMapper.selectList(wrapper);
    }
@@ -277,22 +278,14 @@
        }
        String input = "";
        model.setSendInfo(param.getSendInfo());
        return  sendBroadcaseBobaoHttpBiz(model);
    }
    public static String sendBroadcaseBobaoHttpBiz(Device model){
        //重新下发计划
        JSONObject jsonObject = new JSONObject();
      /*  {
            "command": "start",
                "TTSContent": "冀G70122,毛重48.68吨,称重结束,请下磅",
                "audioLevel": 6,
                "audioOutID": [
                        1
              ],
            "audioVolume": 100,
                "voiceType": "female",
                "TTSLanguageType": "chinese"
        }*/
        jsonObject.put("command","start");
        jsonObject.put("TTSContent",param.getSendInfo());
        jsonObject.put("TTSContent",model.getSendInfo());
        jsonObject.put("audioLevel",6);
        jsonObject.put("audioVolume",100);
        jsonObject.put("TTSLanguageType","chinese");
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleServiceImpl.java
@@ -4,6 +4,7 @@
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.DeviceMapper;
import com.doumee.dao.business.WarningMapper;
import com.doumee.dao.business.WarningRuleDetailMapper;
import com.doumee.dao.business.dao.MemberMapper;
@@ -45,6 +46,8 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
    private WarningRuleDetailMapper warningRuleDetailMapper;
    @Override
@@ -82,7 +85,8 @@
            detail.setEditor(warning.getCreator());
        }
        warning.setMemberNames( initMemberInfo(warning));
         initMemberInfo(warning);
        initDeviceInfo(warning);
        warning.setTitle(title);
        warningRuleMapper.insert(warning);
        for(WarningRuleDetail detail : warning.getDetailList()){
@@ -93,6 +97,9 @@
    }
    private String initMemberInfo(WarningRule warning) {
        if(Constants.equalsInteger(warning.getMemberNotice(),Constants.ZERO)){
            return null;
        }
        String[] members = warning.getMemberIds().split(",");
        List<Integer> mIds = new ArrayList<>();
        for(String str :members){
@@ -122,6 +129,39 @@
        warning.setMemberIds(memberIds);
        warning.setMemberNames(memberNames);
        return memberNames;
    }
    private String initDeviceInfo(WarningRule warning) {
        if(Constants.equalsInteger(warning.getDeviceNotice(),Constants.ZERO)){
            return null;
        }
        String[] ids = warning.getDeviceIds().split(",");
        List<Integer> mIds = new ArrayList<>();
        for(String str :ids){
            try {
                mIds.add(Integer.parseInt(str));
            }catch (Exception e){
            }
        }
        if(mIds.size() ==0){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"请选择正确的设备信息");
        }
        List<Device> list = deviceMapper.selectJoinList(Device.class,new MPJLambdaWrapper<Device>()
                .selectAll(Device.class )
                .eq(Device::getIsdeleted,Constants.ZERO )
                .eq(Device::getType,Constants.FOUR )
                .in(Device::getId,mIds ));
        if(list == null || list.size() ==0){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"请选择正确的设备信息!");
        }
        String dids = "";
        String names = "";
        for(Device m : list){
            dids += (StringUtils.isNotBlank(dids)?",":"")+m.getId();
            names += StringUtils.defaultString(m.getName(),"") +"; ";
        }
        warning.setDeviceIds(dids);
        warning.setDeviceNames(names);
        return names;
    }
    @Override
@@ -197,7 +237,8 @@
            detail.setEditDate(warning.getCreateDate());
            detail.setEditor(warning.getCreator());
        }
        warning.setMemberNames( initMemberInfo(warning));
        initMemberInfo(warning);
        initDeviceInfo(warning);
        warning.setTitle(title);
        warningRuleMapper.updateById(warning);
        for(WarningRuleDetail detail : warning.getDetailList()){
@@ -252,6 +293,7 @@
        queryWrapper.selectAll(WarningRule.class );
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getMemberNames()),WarningRule::getMemberNames, pageWrap.getModel().getMemberNames());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTitle()),WarningRule::getTitle, pageWrap.getModel().getTitle());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDeviceNames()),WarningRule::getDeviceNames, pageWrap.getModel().getDeviceNames());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.eq(WarningRule::getId, pageWrap.getModel().getId());
@@ -273,6 +315,12 @@
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.eq(WarningRule::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getMemberNotice() != null) {
            queryWrapper.eq(WarningRule::getMemberNotice, pageWrap.getModel().getMemberNotice());
        }
        if (pageWrap.getModel().getDeviceNotice() != null) {
            queryWrapper.eq(WarningRule::getDeviceNotice, pageWrap.getModel().getDeviceNotice());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.eq(WarningRule::getInfo, pageWrap.getModel().getInfo());
        }