liukangdong
2024-11-13 84fd4e4fcb9e0862e1d6bd2a7c1f3110cfe72652
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit
已添加1个文件
已修改29个文件
已重命名2个文件
635 ■■■■ 文件已修改
admin/.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprRecord.vue 191 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/UserRelMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/UserRel.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/BookingsServiceImpl.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/SmsConstants.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/business/dao/SmsConfigMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/business/model/SmsConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/business/model/SmsEmail.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/java/com/doumee/api/timer/QuartzCloudController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/HkSmsEmailTimerController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/ChangNeiDiaoduController.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWmsDetail.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/PlatformWorkDataVO.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/SmsEmailService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarUseBookServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsConfigServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/WmsServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/third/BoardService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -1,8 +1,8 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
VUE_APP_API_URL  = 'http://localhost:10010'
#VUE_APP_API_URL  = 'http://localhost:10010'
# VUE_APP_API_URL  = 'http://192.168.0.103:10010'
# VUE_APP_API_URL  = 'http://192.168.0.173/gateway_interface'
# VUE_APP_API_URL  = 'http://10.50.250.253:8088/gateway_interface'
 VUE_APP_API_URL  = 'http://10.50.250.253:8088/gateway_interface'
admin/src/components/common/CommonHeader.vue
@@ -32,8 +32,8 @@
    </div>
    <!-- ä¿®æ”¹å¯†ç  -->
      <GlobalAlertWindow title="修改密码" :visible.sync="visible.changePwd"
        :showClose="!userInfo.needChangePwd || userInfo.needChangePwd == '0'"
        :showCancel="!userInfo.needChangePwd || userInfo.needChangePwd == '0'" @confirm="confirmChangePwd"
        :showClose="userInfo && (!userInfo.needChangePwd || userInfo.needChangePwd == '0')"
        :showCancel="userInfo && (!userInfo.needChangePwd || userInfo.needChangePwd == '0')" @confirm="confirmChangePwd"
        @close="visible.changePwd = false">
        <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules">
          <el-form-item label="原始密码" prop="oldPwd" required>
@@ -114,7 +114,7 @@
  },
  mounted() {
    // needChangePwd 0 : é»˜è®¤å¯†ç éœ€è¦ä¿®æ”¹ï¼Œ1 ä¸éœ€è¦
    if (!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0') {
    if (userInfo &&(!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0')) {
      this.visible.changePwd = true
    }
  },
admin/src/views/operation/serviceCar/apprRecord.vue
@@ -1,20 +1,43 @@
<template>
  <TableLayout :permissions="['business:empower:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
    <el-form
      ref="searchForm"
      slot="search-form"
      :model="searchForm"
      label-width="100px"
      inline
    >
      <el-form-item label="申请人" prop="memberName">
        <el-input v-model="searchForm.memberName" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
        <el-input
          v-model="searchForm.memberName"
          placeholder="请输入姓名/手机号"
          @keypress.enter.native="search"
        ></el-input>
      </el-form-item>
      <el-form-item label="申请人组织" prop="companyName">
        <el-input v-model="searchForm.companyName" placeholder="请输入申请人组织" clearable
          @keypress.enter.native="search"></el-input>
        <el-input
          v-model="searchForm.companyName"
          placeholder="请输入申请人组织"
          clearable
          @keypress.enter.native="search"
        ></el-input>
      </el-form-item>
      <el-form-item label="车牌号" prop="carCode">
        <el-input v-model="searchForm.carCode" placeholder="请输入车牌号" clearable
          @keypress.enter.native="search"></el-input>
        <el-input
          v-model="searchForm.carCode"
          placeholder="请输入车牌号"
          clearable
          @keypress.enter.native="search"
        ></el-input>
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status" @change="search" clearable placeholder="状态">
        <el-select
          v-model="searchForm.status"
          @change="search"
          clearable
          placeholder="状态"
        >
          <el-option label="申请中" value="0"></el-option>
          <el-option label="审核中" value="1"></el-option>
          <el-option label="审批通过" value="2"></el-option>
@@ -23,18 +46,36 @@
        </el-select>
      </el-form-item>
      <el-form-item label="目的地类型" prop="type">
        <el-select v-model="searchForm.type" @change="search" clearable placeholder="目的地类型">
        <el-select
          v-model="searchForm.type"
          @change="search"
          clearable
          placeholder="目的地类型"
        >
          <el-option label="市内用车" value="0"></el-option>
          <el-option label="市外用车" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="出发时间" prop="startTime">
        <el-date-picker @change="seleTime" v-model="time" @keypress.enter.native="search" type="datetimerange"
          format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" :default-time="['00:00:00', '23:59:59']"
          range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
        <el-date-picker
          @change="seleTime"
          v-model="time"
          @keypress.enter.native="search"
          type="datetimerange"
          format="yyyy-MM-dd HH:mm:ss"
          value-format="yyyy-MM-dd HH:mm:ss"
          :default-time="['00:00:00', '23:59:59']"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        >
        </el-date-picker>
      </el-form-item>
      <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
      <el-radio-group
        v-model="searchForm.radio"
        size="small"
        @input="changeRadio"
      >
        <el-radio-button label="0">当天</el-radio-button>
        <el-radio-button label="1">近7天</el-radio-button>
        <el-radio-button label="2">近30天</el-radio-button>
@@ -46,31 +87,70 @@
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="[
      <ul
        class="toolbar"
        v-permissions="[
        'business:carusebook:create',
        'business:carusebook:exportExcel',
      ]">
        ]"
      >
        <li>
          <el-button type="primary" @click="handleEdit" icon="el-icon-plus"
            v-permissions="['business:carusebook:create']">新建</el-button>
          <el-button
            type="primary"
            @click="handleEdit"
            icon="el-icon-plus"
            v-permissions="['business:carusebook:create']"
            >新建</el-button
          >
        </li>
        <li>
          <el-button type="primary" @click="handleEx" v-permissions="['business:carusebook:exportExcel']">导出</el-button>
          <el-button
            type="primary"
            @click="handleEx"
            v-permissions="['business:carusebook:exportExcel']"
            >导出</el-button
          >
        </li>
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="carCode" label="车牌号" min-width="100px"></el-table-column>
        <el-table-column prop="memberName" label="提报人" min-width="80px"></el-table-column>
        <el-table-column prop="memberNames" label="乘车人员" min-width="170px"></el-table-column>
        <el-table-column prop="companyName" label="所属组织" min-width="150px"></el-table-column>
        <el-table-column
            prop="carCode"
            label="车牌号"
            min-width="100px"
        ></el-table-column>
        <el-table-column
          prop="memberName"
          label="提报人"
          min-width="80px"
        ></el-table-column>
        <el-table-column
          prop="companyName"
          label="所属组织"
          min-width="150px"
        ></el-table-column>
        <el-table-column label="用车时间" min-width="170px">
          <template slot-scope="{ row }">
            <span v-if="row.startTime">èµ·:{{ row.startTime.slice(0, 16) }}</span><br />
            <span v-if="row.startTime">èµ·:{{ row.startTime.slice(0,16) }}</span
            ><br />
            <span v-if="row.endTime">æ­¢:{{ row.endTime.slice(0, 16) }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="planUseDate" label="出发时间" min-width="150px">
        <el-table-column
            prop="memberNames"
            label="乘车人"
            min-width="180px"
        ></el-table-column>
        <el-table-column
          prop="planUseDate"
          label="出发时间"
          min-width="150px"
        >
          <template slot-scope="{ row }">
            <span v-if="row.planUseDate">{{ row.planUseDate.slice(0, 16) }}</span>
          </template>
@@ -92,28 +172,66 @@
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="申请时间" min-width="150px"></el-table-column>
        <el-table-column prop="editDate" label="操作时间" min-width="150px"></el-table-column>
        <el-table-column label="操作" min-width="160" align="center" fixed="right">
        <el-table-column
          prop="createDate"
          label="申请时间"
          min-width="150px"
        ></el-table-column>
        <el-table-column
          prop="editDate"
          label="操作时间"
          min-width="150px"
        ></el-table-column>
        <el-table-column
          label="操作"
          min-width="160"
          align="center"
          fixed="right"
        >
          <template slot-scope="{ row }">
            <el-button type="text" icon="el-icon-edit"
              @click="$refs.OperaDetailsWindow.open('公务车申请详情', row)">查看详情</el-button>
            <el-button
              type="text"
              icon="el-icon-edit"
              @click="$refs.OperaDetailsWindow.open('公务车申请详情', row)"
              >查看详情</el-button
            >
            <!-- <el-button v-if="(row.status === 1 || row.status === 2) && new Date().getTime() < new Date(row.startTime).getTime()" type="text" icon="el-icon-delete" @click="rowRevokeClick(row)" >撤销</el-button> -->
            <el-button v-if="
            <el-button
              v-if="
              (row.status === 0 || row.status === 1 || row.status === 2) &&
              new Date().getTime() < new Date(row.startTime).getTime()
            " type="text" icon="el-icon-delete" @click="rowRevokeClick(row)">撤销</el-button>
              "
              type="text"
              icon="el-icon-delete"
              @click="rowRevokeClick(row)"
              >撤销</el-button
            >
          </template>
        </el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      </pagination>
    </template>
    <!--  -->
    <el-dialog title="用车撤销" :visible.sync="isShowBack" width="520px">
      <el-form :model="backParam" :rules="rules" ref="backForm" label-width="100px" class="demo-ruleForm">
      <el-form
        :model="backParam"
        :rules="rules"
        ref="backForm"
        label-width="100px"
        class="demo-ruleForm"
      >
        <el-form-item label="说明" prop="info">
          <el-input type="textarea" :rows="4" v-model="backParam.info" placeholder="请输入撤销说明"></el-input>
          <el-input
            type="textarea"
            :rows="4"
            v-model="backParam.info"
            placeholder="请输入撤销说明"
          ></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
@@ -121,7 +239,10 @@
        <el-button type="primary" @click="backSubmit">确定</el-button>
      </span>
    </el-dialog>
    <OperaCarUseBookWindow ref="OperaDetailsWindow" @success="handlePageChange" />
    <OperaCarUseBookWindow
      ref="OperaDetailsWindow"
      @success="handlePageChange"
    />
    <OperaCarUseBookParamWindow ref="OperaParamWindow" @success="search" />
  </TableLayout>
</template>
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/UserRelMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.UserRel;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/05/04 18:18
 */
public interface UserRelMapper extends BaseMapper<UserRel> {
public interface UserRelMapper extends MPJBaseMapper<UserRel> {
}
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/UserRel.java
@@ -67,6 +67,9 @@
    @ApiModelProperty(value = "参会人员名称")
    @TableField(exist = false)
    private String realName;
    @ApiModelProperty(value = "参会人员手机号")
    @TableField(exist = false)
    private String userPhone;
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/BookingsServiceImpl.java
@@ -10,16 +10,15 @@
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.utils.*;
import com.doumee.core.wx.MeetConstants;
import com.doumee.core.wx.SendWxMessage;
import com.doumee.dao.admin.request.BusinessOverDTO;
import com.doumee.dao.admin.request.QrOpenDoorDto;
import com.doumee.dao.admin.response.DevWgResponseParam;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.join.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.RoomStatisticsVo;
@@ -56,6 +55,7 @@
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.Date;
import java.util.stream.Collectors;
/**
@@ -71,6 +71,8 @@
    private String desPwd;
    @Autowired
    private BookingsMapper bookingsMapper;
    @Autowired
    private SmsConfigMapper smsConfigMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
@@ -109,6 +111,8 @@
    @Autowired
    private NoticesJoinMapper noticesMapper;
    @Autowired
    private SmsEmailMapper smsEmailMapper;
    @Autowired
    private UserRelMapper userRelMapper;
@@ -126,6 +130,11 @@
    @Transactional(rollbackFor = {BusinessException.class, Exception.class})
    public Integer create(Bookings bookings) {
        LoginUserInfo user = bookings.getLoginUserInfo();
        Rooms rooms = roomsMapper.selectById(bookings.getRoomId());
        if(rooms==null ){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该会议室暂时无法预约");
        }
        bookings.setRoomName(rooms.getName());
        isCreateParamValid(bookings, user);
        bookings.setCreateDate(new Date());
        bookings.setCreator(user.getId());
@@ -140,7 +149,9 @@
        updateProjectRel(bookings, user);
        handleFile(bookings, user);
        //发送会议预约成功通知
        if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){
        this.sendNotice(bookings, MeetConstants.TWO);
        }
        //发送微信订阅通知
//        sendWxMessage.bookingsReservation(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId()));
@@ -1294,22 +1305,52 @@
        //1、参与会议:参与会议即将开始  ç»™æ¯ä¸ªå‚会人员发送会议通知并且给会议预约人发送预定的会议即将开始 å¦‚果预订人也参与会议,则会有2条会议通知
        //2、会议预定成功,给所有参会人员与预约人都发送
        //3、会议取消 ä¼šè®®å–消,给所有参会人员都发送
        List<UserRel> userRelList = userRelMapper.selectList(new QueryWrapper<UserRel>()
                .eq("OBJ_TYPE", MeetConstants.ONE)
                .eq("OBJ_ID", bookings.getId())
                .eq("ISDELETED", MeetConstants.ZERO)
        List<UserRel> userRelList = userRelMapper.selectJoinList(UserRel.class,new MPJLambdaWrapper<UserRel>()
                .selectAll(UserRel.class)
                .selectAs(SystemUser::getRealname,UserRel::getRealName)
                .selectAs(SystemUser::getMobile,UserRel::getUserPhone)
                .leftJoin(SystemUser.class,SystemUser::getId,UserRel::getUserId)
                .eq(UserRel::getObjType, MeetConstants.ONE)
                .eq(UserRel::getObjId, bookings.getId())
                .eq(UserRel::getIsdeleted, MeetConstants.ZERO)
        );
        List<SmsEmail> smsEmailList = new ArrayList<>();
        List<Notices> noticeList = new ArrayList<>();
        SmsConfig smsConfig = null;
        Constants.NoticeObjectType noticeObjectType = Constants.NoticeObjectType.MEETING_START;
        if (sendType.equals(MeetConstants.THREE)){
            noticeObjectType = Constants.NoticeObjectType.MEETING_CACEL;
        }else   if (sendType.equals(MeetConstants.TWO)){
            noticeObjectType = Constants.NoticeObjectType.MEETING_BOOK_SUCCESS;
            smsConfig   = smsConfigMapper.selectOne(new QueryWrapper<SmsConfig>().lambda().eq(SmsConfig::getCode,
                    SmsConstants.meetingContent.meetingBookJoinUser)
                    .eq(SmsConfig::getIsdeleted,Constants.ZERO)
                    .last(" limit 1 "));
        }
        if(userRelList!=null && userRelList.size()>0){
            for (UserRel i : userRelList) {
                Notices notices = new Notices(noticeObjectType,i.getId(),noticeObjectType.getInfo(), i.getUserId(), Constants.ZERO);
                noticeList.add(notices);
                if (smsConfig!=null && Constants.equalsInteger(smsConfig.getStatus(),Constants.ZERO)){
                    SmsEmail smsEmail = new SmsEmail();
                    //{参会人员姓名},您好!您有一个新的会议,会议主题:{会议主题},会议地点:{会议室名称},会议时间:{会议时间段},请按时参加
                    String timeInfo =DateUtil.getFomartDate( bookings.getStartTime(),"MM/dd HH:mm")+"-"
                            +DateUtil.getFomartDate( bookings.getEndTime(),"HH:mm");
                    smsEmail.setPhone(i.getUserPhone());
                    smsEmail.setRemark("等待发送");
                    smsEmail.setStatus(Constants.TWO);//
                    smsEmail.setIsdeleted(Constants.ZERO);
                    smsEmail.setType(Constants.ZERO);
                    smsEmail.setObjId(bookings.getId());
                    smsEmail.setCreateDate(new Date());
                    smsEmail.setTitle("会议室申请参会通知");
                    smsEmail.setContent(StringUtils.defaultString(smsConfig.getContent(),"")
                            .replace("{参会人员姓名}",StringUtils.defaultString(i.getRealName(),""))
                            .replace("{会议主题}",StringUtils.defaultString(bookings.getName(),""))
                            .replace("{会议室名称}",StringUtils.defaultString(bookings.getRoomName(),""))
                            .replace("{会议时间段}",StringUtils.defaultString(timeInfo,"")));
                    smsEmailList.add(smsEmail);
                }
            }
        }
        //给参会人员插入
@@ -1318,6 +1359,9 @@
        if(noticeList.size()>0){
            noticesMapper.insert(noticeList);
        }
        if(smsEmailList.size()>0){
            smsEmailMapper.insert(smsEmailList);//待发短信数据
        }
    }
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -304,10 +304,10 @@
        }
        int l = s.length();
        if(Constants.equalsInteger(l,7)){
            return s.substring(0,3)+"***"+s.substring(l-1,l);
            return s.substring(0,3)+"**"+s.substring(l-2,l);
        }
        if(l <= 8){
            return s.substring(0,3)+"****"+s.substring(l-1,l);
            return s.substring(0,3)+"***"+s.substring(l-2,l);
        }
        return s;
    }
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -1283,6 +1283,9 @@
     * @return
     */
    public static Date getXMinuteAfterDate(Date date, int minute) {
        if(date ==null){
            date = new Date();
        }
        Calendar now = Calendar.getInstance();
        now.setTime(date);
        now.set(Calendar.MINUTE, now.get(Calendar.MINUTE) + minute);
server/system_service/src/main/java/com/doumee/core/utils/SmsConstants.java
@@ -129,6 +129,13 @@
        //物流车预约-月台停靠超时(给司机)
        String platformJobTimeOut = "platformJobTimeOut";
    }
    /**
     * è®®å®¤ç”³è¯·
     */
    public interface meetingContent{
        // meetingBookJoinUser    ä¼šè®®å®¤ç”³è¯·ï¼ˆé€šçŸ¥å‚会人)
        String meetingBookJoinUser = "meetingBookJoinUser";
    }
server/system_service/src/main/java/com/doumee/dao/business/dao/SmsConfigMapper.java
ÎļþÃû´Ó server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/SmsConfigMapper.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.dao.business;
package com.doumee.dao.business.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.SmsConfig;
server/system_service/src/main/java/com/doumee/dao/business/model/SmsConfig.java
server/system_service/src/main/java/com/doumee/dao/business/model/SmsEmail.java
@@ -74,8 +74,8 @@
    @ExcelColumn(name="邮箱")
    private String email;
    @ApiModelProperty(value = "状态 0未使用 1已使用")
    @ExcelColumn(name="状态 0未使用 1已使用")
    @ApiModelProperty(value = "状态 0未使用 1已使用 2等待发送")
    @ExcelColumn(name="状态 0未使用 1已使用 2等待发送")
    private Integer status;
    @ApiModelProperty(value = "类型 0短信 1邮件")
@@ -87,7 +87,7 @@
    private Integer objId;
    @ApiModelProperty(value = "关联对象类型 0=验证码;1=访客业务;2=访客报备;3=隐患随手拍;4=用车申请;5=会议室信息;6=物流车预约;7=物流车作业")
    @ExcelColumn(name="关联对象类型 0=验证码;1=访客业务;2=访客报备;3=隐患随手拍;4=用车申请;5=会议室信息;6=物流车预约;7=物流车作业")
    @ExcelColumn(name="关联对象类型 0=验证码;1=访客业务;2=访客报备;3=隐患随手拍;4=用车申请;5=会议室信息;6=物流车预约;7=物流车作业;8=会议室申请")
    private String objType;
    @ApiModelProperty(value = "附件集合")
server/system_timer/src/main/java/com/doumee/api/timer/QuartzCloudController.java
@@ -31,6 +31,7 @@
    @PostMapping("/create")
    @CloudRequiredPermission("business:quartz:create")
    public ApiResponse  create(@RequestBody QuartzJob quartzJob ,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
          quartzJob.setState(Constants.ONE);
          quartzJobService.insert(quartzJob) ;
          return ApiResponse.success(null);
    }
server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
@@ -82,6 +82,9 @@
    @ApiOperation("【数字化月台】月台等待作业超时业务")
    @GetMapping("/timer/platformJob/platformJobWaitTimeOut")
    ApiResponse platformJobWaitTimeOut();
    @ApiOperation("【短信通知】定时发送等待短信任务")
    @GetMapping("/timer/sms/sendWaitingSmsNotice")
    ApiResponse sendWaitingSmsNotice();
server/visits/admin_timer/src/main/java/com/doumee/api/HkSmsEmailTimerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.api;
import com.doumee.core.model.ApiResponse;
import com.doumee.service.business.SmsEmailService;
import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Api(tags = "短信发送定时任务")
@RestController
@RequestMapping("/timer/sms")
public class HkSmsEmailTimerController extends BaseController {
    @Autowired
    private SmsEmailService smsEmailService;
    @ApiOperation("开启定时短信发送定时任务")
    @GetMapping("/sendWaitingSmsNotice")
    public ApiResponse sendWaitingSmsNotice() {
        smsEmailService.sendWaitingSmsNotice();
        return ApiResponse.success("开启定时短信发送定时任务成功");
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/ChangNeiDiaoduController.java
@@ -103,22 +103,10 @@
    @ApiOperation("实时作业效率")
    @GetMapping("/workEfficiency")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "查询类型:0=入库;1=出库", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "查询类型:0=入库;1=出库,默认 0", required = true),
    })
    public ApiResponse<List<WorkEfficiencyVO>> workEfficiency(@RequestParam Integer type) {
        List<WorkEfficiencyVO> workEfficiencyVOList = new ArrayList<>();
        Random random = new Random();
        Integer totalWorkNum = 0;
        for (int i = 8; i <= 20; i++) {
            if(i%2==0){
                WorkEfficiencyVO workEfficiencyVO = new WorkEfficiencyVO();
                workEfficiencyVO.setWorkNum(200+random.nextInt(100));
                totalWorkNum = totalWorkNum + workEfficiencyVO.getWorkNum();
                workEfficiencyVO.setTotalWorkNum(totalWorkNum);
                workEfficiencyVO.setWorkTime(StringUtils.leftPad(i+"",2,"0") +":00");
                workEfficiencyVOList.add(workEfficiencyVO);
            }
        }
        List<WorkEfficiencyVO> workEfficiencyVOList = boardService.workEfficiency(type);
        return ApiResponse.success(workEfficiencyVOList);
    }
@@ -129,19 +117,9 @@
    @ApiOperation("实时月台作业信息")
    @GetMapping("/platformWorkData")
    public ApiResponse<List<PlatformWorkDataVO>> platformWorkData() {
        List<PlatformWorkDataVO> platformWorkDataVOList = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 3; i++) {
            PlatformWorkDataVO platformDurationVO = new PlatformWorkDataVO();
            platformDurationVO.setPlatformName(i+"_月台名称");
            platformDurationVO.setCarNo("皖A8" + random.nextInt(9) + random.nextInt(9) + random.nextInt(9) + random.nextInt(9));
            platformDurationVO.setWorkType(random.nextInt(1));
            platformDurationVO.setWorkNum(100+random.nextInt(100));
            platformDurationVO.setFinishTime(Long.valueOf(System.currentTimeMillis()/1000 + 200+random.nextInt(100)));
            platformDurationVO.setStatus(random.nextInt(2));
            platformWorkDataVOList.add(platformDurationVO);
        }
        List<PlatformWorkDataVO> platformWorkDataVOList  = boardService.platformWorkData();
        return ApiResponse.success(platformWorkDataVOList);
    }
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active: dev
    active: pro
  application:
    name: visitsAdmin
    # å®‰å…¨é…ç½®
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java
@@ -25,117 +25,124 @@
public class CarUseBook extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    //@ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    //@ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    //@ExcelColumn(name="创建时间")
    @ExcelColumn(name="申请时间",index =11,width = 10)
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    //@ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    //@ExcelColumn(name="更新时间")
    @ExcelColumn(name="操作时间",index =12,width = 10)
      private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    //@ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    //@ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "车牌号")
    @ExcelColumn(name="车牌号")
    @ExcelColumn(name="车牌号",index =1,width = 8)
    private String carCode;
    @ApiModelProperty(value = "车辆编码(关联cars)", example = "1")
    @ExcelColumn(name="车辆编码(关联cars)")
    //@ExcelColumn(name="车辆编码(关联cars)")
    private Integer carId;
    @ApiModelProperty(value = "开始时间")
    @ExcelColumn(name="开始时间")
//
    //@ExcelColumn(name="开始时间")
    @ExcelColumn(name="开始时间",index =4,width = 10,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    @ApiModelProperty(value = "结束时间")
    @ExcelColumn(name="结束时间")
//
    //@ExcelColumn(name="结束时间")
    @ExcelColumn(name="结束时间",index =5,width = 10,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    @ApiModelProperty(value = "预计出发时间")
    @ExcelColumn(name="预计出发时间")
    //@ExcelColumn(name="预计出发时间")
    @ExcelColumn(name="出发时间",index =7,width = 10)
    private String planUseDate;
    @ApiModelProperty(value = "状态 0申请中 1审核中 2审批通过 3审批不通过  4已取消", example = "1")
    @ExcelColumn(name="状态 0申请中 1审核中 2审批通过 3审批不通过  4已取消")
    //@ExcelColumn(name="状态 0申请中 1审核中 2审批通过 3审批不通过  4已取消")
    @ExcelColumn(name="状态",index =10,width = 8,valueMapping = "0=申请中;1=审核中;2=审批通过;3=审批不通过;4=已撤销;")
    private Integer status;
    @ApiModelProperty(value = "审批时间(最近一次)")
    @ExcelColumn(name="审批时间(最近一次)")
    //@ExcelColumn(name="审批时间(最近一次)")
    private Date checkDate;
    @ApiModelProperty(value = "审批人(最近一次)", example = "1")
    @ExcelColumn(name="审批人(最近一次)")
    //@ExcelColumn(name="审批人(最近一次)")
    private Integer checkUserId;
    @ApiModelProperty(value = "审批备注(最近一次)")
    @ExcelColumn(name="审批备注(最近一次)")
    //@ExcelColumn(name="审批备注(最近一次)")
    private String checkInfo;
    @ApiModelProperty(value = "取消类型 0申请人取消 1派车员撤销")
    @ExcelColumn(name="取消类型 0申请人取消 1派车员撤销")
    //@ExcelColumn(name="取消类型 0申请人取消 1派车员撤销")
    private Integer cancelType;
    @ApiModelProperty(value = "是否已取消 0未取消 1已取消")
    @ExcelColumn(name="是否已取消 0未取消 1已取消")
    //@ExcelColumn(name="是否已取消 0未取消 1已取消")
    private Integer cancelStatus;
    @ApiModelProperty(value = "取消时间")
    @ExcelColumn(name="取消时间")
    //@ExcelColumn(name="取消时间")
    private Date cancelTime;
    @ApiModelProperty(value = "取消人", example = "1")
    @ExcelColumn(name="取消人")
    //@ExcelColumn(name="取消人")
    private Integer cancelUser;
    @ApiModelProperty(value = "取消备注")
    @ExcelColumn(name="取消备注")
    //@ExcelColumn(name="取消备注")
    private String cancelInfo;
    @ApiModelProperty(value = "目的地类型 0市内用车 1市外用车", example = "1")
    @ExcelColumn(name="目的地类型 0市内用车 1市外用车")
    //@ExcelColumn(name="目的地类型 0市内用车 1市外用车")
    @ExcelColumn(name="目的地类型",index =8,width = 5,valueMapping = "0=市内用车;1=市外用车")
    private Integer type;
    @ApiModelProperty(value = "乘车人编码集合,多个英文逗号隔开", example = "1")
    @ExcelColumn(name="乘车人编码集合,多个英文逗号隔开")
    //@ExcelColumn(name="乘车人编码集合,多个英文逗号隔开")
    private String memberIds;
    @ApiModelProperty(value = "乘车人姓名集合,多个英文逗号隔开")
    @ExcelColumn(name="乘车人姓名集合,多个英文逗号隔开")
    //@ExcelColumn(name="乘车人姓名集合,多个英文逗号隔开")
    @ExcelColumn(name="乘车人",index =6,width = 10)
    private String memberNames;
    @ApiModelProperty(value = "用车事由")
    @ExcelColumn(name="用车事由")
    //@ExcelColumn(name="用车事由")
    private String content;
    @ApiModelProperty(value = "目的地")
    @ExcelColumn(name="目的地")
    //@ExcelColumn(name="目的地")
    @ExcelColumn(name="目的地",index =9,width = 10)
    private String addr;
    @ApiModelProperty(value = "申请人编码(关联member)", example = "1")
    @ExcelColumn(name="申请人编码(关联member)")
    //@ExcelColumn(name="申请人编码(关联member)")
    private Integer memberId;
    @ApiModelProperty(value = "司机编码(关联memberId)", example = "1")
    @ExcelColumn(name="司机编码(关联memberId)")
    //@ExcelColumn(name="司机编码(关联memberId)")
    private Integer driverId;
    @ApiModelProperty(value = "司机姓名", example = "1")
@@ -146,9 +153,11 @@
    private String driverPhone;
    @ApiModelProperty(value = "申请人姓名", example = "1")
    @TableField(exist = false)
    @ExcelColumn(name="提报人",index =2,width = 8)
    private String memberName;
    @ApiModelProperty(value = "申请人所属组织名称", example = "1")
    @TableField(exist = false)
    @ExcelColumn(name="所属组织",index =3,width = 20)
    private String companyName;
    @ApiModelProperty(value = "申请人手机号", example = "1")
    @TableField(exist = false)
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWmsDetail.java
@@ -92,4 +92,7 @@
    @ApiModelProperty(value = "月分组名称" ,hidden = true)
    @TableField(exist = false)
    private String groupName ;
    @ApiModelProperty(value = "作业完成时间(最终时间)")
    @TableField(exist = false)
    private Date doneDate;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/PlatformWorkDataVO.java
@@ -17,6 +17,10 @@
    @ApiModelProperty(value = "月台名称")
    private String platformName;
    @ApiModelProperty(value = "月台编码")
    private Integer platformId;
    @ApiModelProperty(value = "月台排序")
    private Integer platformSort;
    @ApiModelProperty(value = "车牌号")
    private String carNo;
@@ -28,12 +32,14 @@
    private Integer workType;
    @ApiModelProperty(value = "作业时长 å•位 åˆ†é’Ÿ")
    private Integer workTime;
    private Long workTime;
    @ApiModelProperty(value = "预计完成时间 å•位:时间戳")
    private Long finishTime;
    @ApiModelProperty(value = "预计完成时间 æ ¼å¼HH:mm")
    private String finishTimeStr;
    @ApiModelProperty(value = "月台状态:0=作业中;1=空闲中;2=作业超时")
    @ApiModelProperty(value = "月台状态:0=作业中;1=空闲中;2=作业超时;3=叫号中")
    private Integer status;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/SmsEmailService.java
@@ -97,4 +97,5 @@
     */
    long count(SmsEmail smsEmail);
    void sendWaitingSmsNotice();
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -17,6 +17,7 @@
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.dto.ApproveDTO;
import com.doumee.dao.business.join.ApproveJoinMapper;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarUseBookServiceImpl.java
@@ -8,6 +8,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.*;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.join.ApproveJoinMapper;
import com.doumee.dao.business.join.CarUseBookJoinMapper;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -16,6 +16,7 @@
import com.doumee.core.utils.SmsConstants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.MultifileMapper;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java
@@ -11,6 +11,7 @@
import com.doumee.core.utils.SmsConstants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.join.ApproveJoinMapper;
import com.doumee.dao.business.model.*;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -18,6 +18,7 @@
import com.doumee.core.tms.model.response.TmsLockStatusQueryResponse;
import com.doumee.core.utils.*;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.join.PlatformJobJoinMapper;
import com.doumee.dao.business.join.PlatformJoinMapper;
@@ -693,7 +694,7 @@
            }
        }
        platformJob.dealTime();
        this.getWorkTime(platformJob);
        this.getWorkTime(platformJob,platformLogMapper);
        this.getWmsJobData(platformJob);
        return platformJob;
    }
@@ -775,7 +776,7 @@
     * èŽ·å–å·²ä½œä¸šæ—¶é—´
     * @param platformJob
     */
    public Long getWorkTime(PlatformJob platformJob){
    public static Long getWorkTime(PlatformJob platformJob,PlatformLogMapper platformLogMapper){
        List<PlatformLog> platformLogList = platformLogMapper.selectList(new QueryWrapper<PlatformLog>()
                .lambda().eq(PlatformLog::getIsdeleted,Constants.ZERO)
                .eq(PlatformLog::getJobId,platformJob.getId())
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsConfigServiceImpl.java
@@ -3,7 +3,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.model.SmsConfig;
import com.doumee.service.business.SmsConfigService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
@@ -1,7 +1,6 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,13 +8,11 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.*;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.SmsEmailService;
@@ -27,7 +24,6 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.net.URLEncoder;
import java.util.*;
import java.util.Date;
@@ -254,6 +250,32 @@
    public long count(SmsEmail smsEmail) {
        QueryWrapper<SmsEmail> wrapper = new QueryWrapper<>(smsEmail);
        return smsEmailMapper.selectCount(wrapper);
    }
    @Override
    public void sendWaitingSmsNotice(){
        LambdaQueryWrapper<SmsEmail> wrapper = new LambdaQueryWrapper<SmsEmail>()
                .eq(SmsEmail::getIsdeleted,Constants.ZERO)
                .eq(SmsEmail::getStatus,Constants.TWO);
        List<SmsEmail> smsEmails = smsEmailMapper.selectList(wrapper);
        if(smsEmails!=null && smsEmails.size()>0){
            for(SmsEmail model : smsEmails){
                if(model.getPhone() == null){
                    model.setStatus(Constants.THREE);//发送失败
                    model.setRemark("手机号为空,取消任务发送!");
                }else{
                    try {
                        emayService.sendSmsByHk(model.getPhone(),model.getContent());
                        model.setStatus(Constants.ONE);//发送成功
                        model.setRemark("短信任务发送成功");
                    }catch (Exception e){
                        model.setStatus(Constants.THREE);//发送失败
                        model.setRemark("短信任务发送失败!"+e.getMessage());
                    }
                }
                model.setEditDate(new Date());
                smsEmailMapper.updateById(model);
            }
        }
    }
    /**
@@ -546,8 +568,6 @@
            smsEmail.setObjId(objId);
            smsEmailMapper.insert(smsEmail);
            emayService.sendSmsByHk(phone,content);
        }
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -28,6 +28,7 @@
import com.doumee.dao.admin.response.PCWorkPlatformDataVO;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.dto.ResetPasswordDTO;
import com.doumee.dao.business.join.DeviceJoinMapper;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java
@@ -14,11 +14,15 @@
import com.doumee.core.haikang.model.param.respose.PageRegionInfoResponse;
import com.doumee.core.haikang.model.param.respose.PageSensorStatusResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.reqeust.SavePlatformWarnEventDTO;
import com.doumee.dao.web.response.platformReport.*;
import com.doumee.service.business.impl.PlatformJobServiceImpl;
import com.doumee.service.business.third.BoardService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
@@ -26,6 +30,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -253,7 +258,7 @@
                .in(PlatformJob::getStatus, Constants.PlatformJobStatus.DONE.getKey()
                        , Constants.PlatformJobStatus.AUTHED_LEAVE.getKey()
                        , Constants.PlatformJobStatus.LEAVED.getKey())
                .apply("to_days(t1.create_data) = to_days(now())")
                .apply("to_days(t1.create_date) = to_days(now())")
                .groupBy(PlatformGroup::getId)
        );
        if(jobList!=null){
@@ -274,6 +279,140 @@
        );
        carWorkSituationVO.setPlatformLogList(platformLogList);
        return carWorkSituationVO;
    }
    @Override
    public  List<PlatformWorkDataVO> platformWorkData(){
        List<PlatformWorkDataVO> platformWorkDataVOList = new ArrayList<>();
        List<Platform> platformList = platformMapper.selectJoinList(Platform.class, new MPJLambdaWrapper<Platform>()
                .selectAll( Platform.class)
                .eq(Platform::getIsdeleted, Constants.ZERO)
                .orderByAsc(Platform::getSortnum)
        );
        /**
         *    WAIT_CONFIRM(0, "待确认","待确认" ),
     *         WART_SIGN_IN(1, "待签到","待签到" ),
     *         WAIT_CALL(2, "已签到","已签到"),
     *         IN_WAIT(3, "入园等待","入园等待" ),
     *         CALLED(4, "已叫号","已叫号" ),
     *         WORKING(5, "作业中","作业中" ),
     *         DONE(6, "作业完成 ","作业完成" ),
     *         TRANSFERING(7, "转移中","转移中" ),
     *         EXCEPTION(8, "异常挂起","异常挂起" ),
     *         AUTHED_LEAVE(9, "已授权离园","已授权离园" ),
     *         LEAVED(10, "已离园 ","已离园 " ),
     *         OVER_NUMBER(11, "已过号","已过号" ),
     *         CANCEL(12, "已取消","已取消" ),
         */
        if(platformList!=null && platformList.size()>0){
            List<PlatformJob> jobList = platformJobMapper.selectJoinList(PlatformJob.class, new MPJLambdaWrapper<PlatformJob>()
                    .selectAll( PlatformJob.class)
                    .select("( select pl.CREATE_DATE from platform_log pl where t.id = pl.obj_id and pl.OBJ_TYPE = "+Constants.PlatformJobLogType.WORKING.getKey()+"  order by pl.CREATE_DATE desc  limit 1  ) as newStartDate")
                    .select(" (select sum(ifnull(pl.IO_QTY , 0 ))   from platform_wms_detail pl  where   pl.job_id = t.id and pl.isdeleted=0 )",PlatformJob::getWorkNum)
                    .apply("to_days(t.create_date) = to_days(now())")
                    .eq(Platform::getIsdeleted, Constants.ZERO)
                    .in(PlatformJob ::getStatus,new Integer[]{Constants.PlatformJobStatus.WORKING.getKey(),Constants.PlatformJobStatus.CALLED.getKey() })
                    .orderByDesc(PlatformJob::getStatus ));
            //月台状态:0=作业中;1=空闲中;2=作业超时;3=叫号
            for(Platform model : platformList){
                PlatformWorkDataVO platformDurationVO = new PlatformWorkDataVO();
                platformDurationVO.setPlatformName(model.getName());
                platformDurationVO.setPlatformId(model.getId());
                platformDurationVO.setPlatformSort(model.getSortnum());
                PlatformJob job = getJobFromListById(model.getId(),jobList);
                if(job != null){
                    if(Constants.equalsInteger(job.getType(),Constants.ONE) || Constants.equalsInteger(job.getType(),Constants.THREE)){
                        platformDurationVO.setWorkType(Constants.ONE);//如果是装货
                    }else{
                        platformDurationVO.setWorkType(Constants.ZERO);//如果是卸货
                    }
                    Integer workMinute = job.getWorkNum().multiply(new BigDecimal(60)).divide(model.getWorkRate(),0,BigDecimal.ROUND_HALF_UP).intValue();
                    Date overDate = DateUtil.getXMinuteAfterDate(job.getNewStartDate(),workMinute + model.getWorkTimeoutAlarmTime());//预计完成时间
                    platformDurationVO.setFinishTimeStr(DateUtil.DateToStr(overDate,"HH:mm"));
                    platformDurationVO.setWorkNum(Constants.formatBigdecimal(job.getWorkNum()).intValue());
                    platformDurationVO.setCarNo(job.getCarCodeFront());//车牌号
                    if(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.CALLED.getKey() )){
                        platformDurationVO.setStatus(Constants.THREE); //叫号中
                    }else{
                        platformDurationVO.setStatus(Constants.ZERO); //作业中
                        platformDurationVO.setWorkTime(PlatformJobServiceImpl.getWorkTime(job,platformLogMapper));//已工作时间
                        if(overDate.getTime() < System.currentTimeMillis() ){
                            model.setStatus(Constants.TWO); //作业已超时
                        }
                    }
                }else{
                    platformDurationVO.setStatus(Constants.ONE);//空闲中
                }
                platformWorkDataVOList.add(platformDurationVO);
            }
        }
        return  platformWorkDataVOList;
    }
    private PlatformJob getJobFromListById(Integer id, List<PlatformJob> jobList) {
        if(jobList!=null){
            for(PlatformJob job :jobList){
                if(Constants.equalsInteger(job.getPlatformId(),id)){
                    return  job;
                }
            }
        }
        return null;
    }
    /**
     *
     * @param type æŸ¥è¯¢ç±»åž‹ï¼š0=入库;1=出库
     * @return
     */
    @Override
    public   List<WorkEfficiencyVO> workEfficiency(Integer type){
        //作业类型 0自有车卸货 1自有车装货 2外协车卸货 3外协车装货 4市公司外协车卸货
        List<WorkEfficiencyVO> workEfficiencyVOList = new ArrayList<>();
        List<PlatformWmsDetail> jobList = platformWmsDetailMapper.selectJoinList(PlatformWmsDetail.class, new MPJLambdaWrapper<PlatformWmsDetail>()
                .selectAll( PlatformWmsDetail.class)
                .selectAs( PlatformJob::getDoneDate,PlatformWmsDetail::getDoneDate)
                .leftJoin(PlatformJob.class,PlatformJob::getId,PlatformWmsDetail::getJobId)
                .eq(PlatformWmsDetail::getIsdeleted, Constants.ZERO)
                .eq(PlatformJob::getIsdeleted, Constants.ZERO)
                .in(Constants.equalsInteger(type,Constants.ZERO),PlatformJob::getType,new Integer[]{0,2,4})
                .in(Constants.equalsInteger(type,Constants.ONE),PlatformJob::getType,new Integer[]{1,3})
                .in(PlatformJob::getStatus, Constants.PlatformJobStatus.DONE.getKey()
                        , Constants.PlatformJobStatus.AUTHED_LEAVE.getKey()
                        , Constants.PlatformJobStatus.LEAVED.getKey())
                .apply("to_days(t1.create_date) = to_days(now())")
        );
        int curtotalNum = 0;
        Date today =  Utils.Date.getStart(new Date());
        long curTime=0, lastTime=0;
        for (int i = 0; i < 8; i++) {
            lastTime = curTime;//上次的时间
            int curHour = 8+(i*2);
            long time = curHour*60*60*1000 + today.getTime();
            WorkEfficiencyVO workEfficiencyVO = new WorkEfficiencyVO();
            workEfficiencyVO.setWorkTime(curHour+":00");
            if(jobList!=null && jobList.size()>0){
                for(PlatformWmsDetail detail : jobList){
                    if(detail.getDoneDate()!=null && detail.getDoneDate().getTime()<= time){
                        //当前量
                        if(detail.getDoneDate()!=null && detail.getDoneDate().getTime() > lastTime){
                            //区间值 å–实近2小时内的累计值
                            workEfficiencyVO.setWorkNum(Constants.formatIntegerNum(workEfficiencyVO.getWorkNum())+Constants.formatBigdecimal(detail.getIoQty()).intValue());
                        }
                        //累积量
                        curtotalNum += Constants.formatBigdecimal(detail.getIoQty()).intValue();
                    }
                }
            }
            workEfficiencyVO.setTotalWorkNum(curtotalNum);//累计值
            workEfficiencyVOList.add(workEfficiencyVO);
        }
        return workEfficiencyVOList;
    }
    @Override
    public List<PlatformDurationVO> platformDuration(){
@@ -330,7 +469,7 @@
                .selectAll(PlatformJob.class)
                .select("count(id)" ,PlatformJob::getCountum)
                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                .apply("to_days(create_data) = to_days(now())" )
                .apply("to_days(create_date) = to_days(now())" )
                .groupBy(PlatformJob::getStatus )
        );
        if(jobList!=null){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/WmsServiceImpl.java
@@ -13,6 +13,7 @@
import com.doumee.core.wms.model.response.WmsBaseResponse;
import com.doumee.core.wms.model.response.WmsInventoryDataResponse;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.model.*;
@@ -20,7 +21,6 @@
import com.doumee.service.business.third.EmayService;
import com.doumee.service.business.third.WmsService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/third/BoardService.java
@@ -44,4 +44,8 @@
    List<PlatformWarnEvent> warningList(int limit);
    List<PlatformDurationVO> platformDuration();
    List<WorkEfficiencyVO> workEfficiency(Integer type);
    List<PlatformWorkDataVO> platformWorkData();
}