jiangping
2025-04-14 a0436685d963dd19e0df70d1447ad5efafbfb36e
代码初始化
已添加7个文件
已删除1个文件
已修改16个文件
452 ■■■■ 文件已修改
.idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_4.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/libraries/Maven__commons_io_commons_io_1_3_1.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/libraries/Maven__commons_io_commons_io_2_2.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_mail_2_2_5_RELEASE.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaManagersWindow.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/company.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/managersDca.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/managersDcaAuth.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/managersShe.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/managersSheNotice.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/common/PublicCloudController.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/constants/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Managers.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Workorder.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/job/WorkorderSheEmailJob.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/WorkorderService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/common/CaptchaService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/common/EmailService.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/application-dev.yml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/application-pro.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<component name="libraryTable">
  <library name="Maven: com.sun.activation:jakarta.activation:1.2.2">
    <CLASSES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/sun/activation/jakarta.activation/1.2.2/jakarta.activation-1.2.2.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/sun/activation/jakarta.activation/1.2.2/jakarta.activation-1.2.2-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/sun/activation/jakarta.activation/1.2.2/jakarta.activation-1.2.2-sources.jar!/" />
    </SOURCES>
  </library>
</component>
.idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_4.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<component name="libraryTable">
  <library name="Maven: com.sun.mail:jakarta.mail:1.6.4">
    <CLASSES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/sun/mail/jakarta.mail/1.6.4/jakarta.mail-1.6.4.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/sun/mail/jakarta.mail/1.6.4/jakarta.mail-1.6.4-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/sun/mail/jakarta.mail/1.6.4/jakarta.mail-1.6.4-sources.jar!/" />
    </SOURCES>
  </library>
</component>
.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<component name="libraryTable">
  <library name="Maven: commons-fileupload:commons-fileupload:1.4">
    <CLASSES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4-sources.jar!/" />
    </SOURCES>
  </library>
</component>
.idea/libraries/Maven__commons_io_commons_io_1_3_1.xml
ÎļþÒÑɾ³ý
.idea/libraries/Maven__commons_io_commons_io_2_2.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<component name="libraryTable">
  <library name="Maven: commons-io:commons-io:2.2">
    <CLASSES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-io/commons-io/2.2/commons-io-2.2.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-io/commons-io/2.2/commons-io-2.2-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-io/commons-io/2.2/commons-io-2.2-sources.jar!/" />
    </SOURCES>
  </library>
</component>
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_mail_2_2_5_RELEASE.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-mail:2.2.5.RELEASE">
    <CLASSES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/boot/spring-boot-starter-mail/2.2.5.RELEASE/spring-boot-starter-mail-2.2.5.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/boot/spring-boot-starter-mail/2.2.5.RELEASE/spring-boot-starter-mail-2.2.5.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/boot/spring-boot-starter-mail/2.2.5.RELEASE/spring-boot-starter-mail-2.2.5.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>
admin/src/components/business/OperaManagersWindow.vue
@@ -16,6 +16,14 @@
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item v-if="form.type==3" label="是否企微通知" prop="isQw" class="form-item-switch"  >
        <el-switch v-model="form.isQw"  :active-value="1" :inactive-value="0"/>
        <span class="switch-text"> </span>
      </el-form-item>
      <el-form-item v-if="form.type==3" label="是否邮件通知" prop="isEmail" class="form-item-switch"  >
        <el-switch v-model="form.isEmail"  :active-value="1" :inactive-value="0"/>
        <span class="switch-text"></span>
      </el-form-item>
      <el-form-item label="备注" prop="remark">
        <el-input v-model="form.remark" placeholder="请输入备注" v-trim/>
      </el-form-item>
@@ -26,7 +34,7 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import  { allList } from "@/api/business/member";
import { allList } from '@/api/business/member'
export default {
  name: 'OperaManagersWindow',
@@ -38,7 +46,9 @@
      form: {
        type: '',
        memberId: '',
        remark: ''
        remark: '',
        isQw: 0,
        isEmail: 0
      },
      loading:false,
      memberList: [],
admin/src/views/business/company.vue
@@ -16,7 +16,6 @@
      </el-table>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaInternalCompanyWindow ref="OperaInternalCompanyWindow" :list="list" @success="handlePageChange" />
  </TableLayout>
</template>
@@ -71,7 +70,7 @@
          this.loading = true
          companySync({})
            .then(res => {
              this.$tip.apiSuccess(res || '同步成功')
              this.$tip.apiSuccess('同步成功')
              this.handlePageChange(1)
            })
            .catch(e => {
admin/src/views/business/managersDca.vue
@@ -3,8 +3,8 @@
    <!-- æœç´¢è¡¨å• -->
    <div slot="search-form">
      <el-form ref="searchForm" :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-form-item label="人员搜索 " prop="keyword">
          <el-input v-model="searchForm.keyword" placeholder="可输入姓名/手机号/部门" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <section>
          <el-button type="primary" @click="search">搜索</el-button>
@@ -31,7 +31,7 @@
        <el-table-column prop="memberEmail" label="人员邮箱" min-width="100px"></el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="150px"></el-table-column>
        <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:managers:update', 'business:managers:delete'])"
@@ -72,7 +72,7 @@
    return {
      // æœç´¢
      searchForm: {
        memberName: '',
        keyword: '',
        type: 1
      }
    }
admin/src/views/business/managersDcaAuth.vue
@@ -3,8 +3,8 @@
    <!-- æœç´¢è¡¨å• -->
    <div slot="search-form">
      <el-form ref="searchForm" :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-form-item label="人员搜索 " prop="keyword">
          <el-input v-model="searchForm.keyword" placeholder="可输入姓名/手机号/部门" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <section>
          <el-button type="primary" @click="search">搜索</el-button>
@@ -31,7 +31,7 @@
        <el-table-column prop="memberEmail" label="人员邮箱" min-width="100px"></el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="150px"></el-table-column>
        <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:managers:update', 'business:managers:delete'])"
@@ -72,7 +72,7 @@
    return {
      // æœç´¢
      searchForm: {
        memberName: '',
        keyword: '',
        type: 2
      }
    }
admin/src/views/business/managersShe.vue
@@ -3,8 +3,8 @@
    <!-- æœç´¢è¡¨å• -->
    <div slot="search-form">
      <el-form ref="searchForm" :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-form-item label="人员搜索 " prop="keyword">
          <el-input v-model="searchForm.keyword" placeholder="可输入姓名/手机号/部门" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <section>
          <el-button type="primary" @click="search">搜索</el-button>
@@ -31,7 +31,7 @@
        <el-table-column prop="memberEmail" label="人员邮箱" min-width="100px"></el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="150px"></el-table-column>
        <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:managers:update', 'business:managers:delete'])"
@@ -72,7 +72,7 @@
    return {
      // æœç´¢
      searchForm: {
        memberName: '',
        keyword: '',
        type: 0
      }
    }
admin/src/views/business/managersSheNotice.vue
@@ -3,8 +3,8 @@
    <!-- æœç´¢è¡¨å• -->
    <div slot="search-form">
      <el-form ref="searchForm" :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-form-item label="人员搜索 " prop="keyword">
          <el-input v-model="searchForm.keyword" placeholder="可输入姓名/手机号/部门" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <section>
          <el-button type="primary" @click="search">搜索</el-button>
@@ -30,8 +30,18 @@
        <el-table-column prop="memberPhone" label="人员手机号" min-width="100px"></el-table-column>
        <el-table-column prop="memberEmail" label="人员邮箱" min-width="100px"></el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="isQw" label="企微通知" min-width="80px">
          <template slot-scope="{row}">
            <el-switch v-model="row.isQw"  :active-value="1" :inactive-value="0" @change="updateInfo(row)"/>
          </template>
        </el-table-column>
        <el-table-column prop="isQw" label="邮件通知" min-width="80px">
          <template slot-scope="{row}">
            <el-switch v-model="row.isEmail" :active-value="1" :inactive-value="0" @change="updateEmailInfo(row)"/>
          </template>
        </el-table-column>
        <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="150px"></el-table-column>
        <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:managers:update', 'business:managers:delete'])"
@@ -71,8 +81,9 @@
  data () {
    return {
      // æœç´¢
      updating: false,
      searchForm: {
        memberName: '',
        keyword: '',
        type: 3
      }
    }
@@ -85,6 +96,30 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    updateInfo (row) {
      const newValue = row.isQw
      row.isQw = !row.isQw
      // å¼€å¯
      this.api.updateById({ id: row.id, isQw: newValue }).then(() => {
        this.$tip.success('设置成功!')
        this.search()
      }).final(() => {
        this.updating = false
      })
    },
    updateEmailInfo (row) {
      const newValue = row.isEmail
      row.isEmail = !row.isEmail
      // å¼€å¯
      this.api.updateById({ id: row.id, isEmail: newValue }).then(() => {
        this.$tip.success('设置成功!')
        this.search()
      }).finally(() => {
        this.updating = false
      })
    }
  }
}
</script>
server/pom.xml
@@ -185,6 +185,10 @@
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
  </dependencies>
  <build>
server/src/main/java/com/doumee/api/common/PublicCloudController.java
@@ -11,15 +11,13 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.common.EmailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
@@ -44,10 +42,27 @@
public class PublicCloudController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private EmailService emailService;
    public static FtpUtil ftp  = null;
    @ApiOperation(value = "测试邮件发送")
    @RequestMapping(method= RequestMethod.POST,value="/testEmail")
    @ResponseBody
    public void test(  @RequestParam(required = false) String id, @RequestParam(required = false) String email) throws Exception {
//        sendEmailWithImages(String toEmail, String title, Map<String,String> contentForm, List<String> imgList)
        Map<String,String> content = new HashMap<>();
        content.put("标题","这是标题");
        content.put("简介","这是简介");
        List<String> list = new ArrayList<>();
        list.add("https://dmtest.ahapp.net/file/workorder/20250410/1.jpg");
        list.add("https://dmtest.ahapp.net/file/workorder/20250410/2.png");
        list.add("https://dmtest.ahapp.net/file/workorder/20250410/4.png");
        emailService.sendEmailWithImages(StringUtils.defaultString(email,"jp@doumee.com"),"来自蹄蹄的邮件"+DateUtil.getPlusTime2(new Date()),content,list);
    }
    @ApiOperation(value = "批量上传文件到FTP")
    @RequestMapping(method= RequestMethod.POST,value="/uploadBatch")
    @ResponseBody
server/src/main/java/com/doumee/core/constants/Constants.java
@@ -29,6 +29,7 @@
    public static final Integer TWO = 2;
    public static final Integer ZERO = 0;
    public static final Integer THREE = 3;
    public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
    public static  boolean DEALING_COMPANY_SYNC = false ;
    public static  boolean DEALING_MEMBER_SYNC = false ;
    public static final String WORKORDER_FILE_PATH ="WORKORDER_FILE_PATH" ;
server/src/main/java/com/doumee/dao/business/model/Managers.java
@@ -55,6 +55,10 @@
    @ApiModelProperty(value = "类型 0SHE负责人 1DCA手动抄送人员 2DCA权限人员", example = "1")
    private Integer type;
    @ApiModelProperty(value = "是否企微消息通知 0否 1是", example = "1")
    private Integer isQw;
    @ApiModelProperty(value = "是否邮箱发送 0否 1是", example = "1")
    private Integer isEmail;
    @ApiModelProperty(value = "人员编码(关联member)", example = "1")
    private Integer memberId;
server/src/main/java/com/doumee/dao/business/model/Workorder.java
@@ -51,6 +51,12 @@
    @ApiModelProperty(value = "状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理  3SHE关闭 4WTS关闭 5工程师关闭", example = "1")
    private Integer status;
    @ApiModelProperty(value = "邮件通知状态 0待通知 1已通知 2通知失败", example = "1")
    private Integer emailStatus;
    @ApiModelProperty(value = "邮件通知时间", example = "1")
    private Integer emailDate;
    @ApiModelProperty(value = "邮件通知备注", example = "1")
    private Integer emailInfo;
    @ApiModelProperty(value = "排序码", example = "1")
    private Integer sortnum;
server/src/main/java/com/doumee/job/WorkorderSheEmailJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.doumee.job;
import com.doumee.core.job.BaseJob;
import com.doumee.core.job.JobContext;
import com.doumee.core.job.JobParam;
import com.doumee.service.business.WorkorderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * æ›´æ–°ä¼ä¸šå¾®ä¿¡è‡ªå»ºåº”用token
 * @author  dm
 * @since 2025/03/31 16:44
 */
@Slf4j
@Component("workorderSheEmailJob")
public class WorkorderSheEmailJob extends BaseJob {
    @Autowired
    private WorkorderService workorderService;
    @Override
    public JobContext execute(JobParam param) {
        JobContext jobContext = new JobContext();
        try {
            workorderService.sendSheEmail();
            jobContext.setContext("定时发送SHE邮件通知");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jobContext;
    }
}
server/src/main/java/com/doumee/service/business/WorkorderService.java
@@ -149,4 +149,5 @@
     */
    void sendCopy(SendCopyDTO sendCopyDTO);
    void sendSheEmail();
}
server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
@@ -22,6 +22,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.Manager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
@@ -42,6 +43,7 @@
 * @since 2025/04/02 17:49
 */
@Service
@Slf4j
public class WorkorderServiceImpl implements WorkorderService {
    @Autowired
@@ -592,73 +594,6 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        MPJLambdaWrapper<Workorder> queryWrapper = getJoinQueryMapper(pageWrap.getModel());
        queryWrapper
                .selectAll(Workorder.class)
                .selectAs(Member::getName,Workorder::getMemberName)
                .selectAs(Member::getCompanyName,Workorder::getCompanyName)
                .selectAs(Member::getPhone,Workorder::getMemberPhone)
                .select(" c2.name ",Workorder::getCategoryName)
                .select(" c3.name ",Workorder::getTypeName)
                .select(" c4.name ",Workorder::getProblemName)
                .leftJoin(Member.class,Member::getId,Workorder::getMemberId)
                .leftJoin(" category c3 on  t.TYPE_ID = c3.id   ") //风险类型
                .leftJoin(" category c4 on  t.PROBLEM_ID = c4.id   ") //DCA问题编码
                .leftJoin(" category c2 on  t.CATEGORY_ID = c2.id   ") //DCA问题编码
                .apply(Objects.nonNull(pageWrap.getModel().getMyWorkOrder())&& org.apache.commons.lang3.StringUtils.isNotBlank(pageWrap.getModel().getQwId())
                                &&Constants.equalsInteger(Constants.ONE,pageWrap.getModel().getMyWorkOrder()),
                        " ( t.id in (  select OBJ_ID from notices where param1 = '"+pageWrap.getModel().getQwId()+"' ))  ")
                .eq(pageWrap.getModel().getId() != null, Workorder::getId, pageWrap.getModel().getId())
                .eq(pageWrap.getModel().getCreator() != null, Workorder::getCreator, pageWrap.getModel().getCreator())
                .ge(pageWrap.getModel().getCreateDate() != null, Workorder::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
                .le(pageWrap.getModel().getCreateDate() != null, Workorder::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
                .eq(pageWrap.getModel().getEditor() != null, Workorder::getEditor, pageWrap.getModel().getEditor())
                .ge(pageWrap.getModel().getEditDate() != null, Workorder::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
                .le(pageWrap.getModel().getEditDate() != null, Workorder::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
                .eq(pageWrap.getModel().getIsdeleted() != null, Workorder::getIsdeleted, pageWrap.getModel().getIsdeleted())
                .eq(pageWrap.getModel().getCategoryId() != null, Workorder::getCategoryId, pageWrap.getModel().getCategoryId())
                .eq(pageWrap.getModel().getRemark() != null, Workorder::getRemark, pageWrap.getModel().getRemark())
                .eq(pageWrap.getModel().getStatus() != null, Workorder::getStatus, pageWrap.getModel().getStatus())
                .eq(pageWrap.getModel().getSortnum() != null, Workorder::getSortnum, pageWrap.getModel().getSortnum())
                .eq(pageWrap.getModel().getType() != null, Workorder::getType, pageWrap.getModel().getType())
                .eq(pageWrap.getModel().getMemberId() != null, Workorder::getMemberId, pageWrap.getModel().getMemberId())
                .eq(pageWrap.getModel().getCompanyId() != null, Workorder::getCompanyId, pageWrap.getModel().getCompanyId())
                .eq(pageWrap.getModel().getSubmitDate() != null, Workorder::getSubmitDate, pageWrap.getModel().getSubmitDate())
                .eq(pageWrap.getModel().getMemberType() != null, Workorder::getMemberType, pageWrap.getModel().getMemberType())
                .eq(pageWrap.getModel().getMemberQwids() != null, Workorder::getMemberQwids, pageWrap.getModel().getMemberQwids())
                .like(pageWrap.getModel().getMemberNames() != null, Workorder::getMemberNames, pageWrap.getModel().getMemberNames())
                .eq(pageWrap.getModel().getLocaltionId() != null, Workorder::getLocaltionId, pageWrap.getModel().getLocaltionId())
                .eq(pageWrap.getModel().getOutJiuyi() != null, Workorder::getOutJiuyi, pageWrap.getModel().getOutJiuyi())
                .eq(pageWrap.getModel().getIsYiwushi() != null, Workorder::getIsYiwushi, pageWrap.getModel().getIsYiwushi())
                .eq(pageWrap.getModel().getIsHurted() != null, Workorder::getIsHurted, pageWrap.getModel().getIsHurted())
                .eq(pageWrap.getModel().getWorkRelated() != null, Workorder::getWorkRelated, pageWrap.getModel().getWorkRelated())
                .eq(pageWrap.getModel().getEventInfo() != null, Workorder::getEventInfo, pageWrap.getModel().getEventInfo())
                .eq(pageWrap.getModel().getEmialMemberIds() != null, Workorder::getEmialMemberIds, pageWrap.getModel().getEmialMemberIds())
                .eq(pageWrap.getModel().getQwnoticeMemberIds() != null, Workorder::getQwnoticeMemberIds, pageWrap.getModel().getQwnoticeMemberIds())
                .eq(pageWrap.getModel().getHappenTime() != null, Workorder::getHappenTime, pageWrap.getModel().getHappenTime())
                .eq(pageWrap.getModel().getTypeId() != null, Workorder::getTypeId, pageWrap.getModel().getTypeId())
                .eq(pageWrap.getModel().getRiskInfo() != null, Workorder::getRiskInfo, pageWrap.getModel().getRiskInfo())
                .eq(pageWrap.getModel().getManagerId() != null, Workorder::getManagerId, pageWrap.getModel().getManagerId())
                .eq(pageWrap.getModel().getDealerId() != null, Workorder::getDealerId, pageWrap.getModel().getDealerId())
                .ge(pageWrap.getModel().getDispatchTime() != null, Workorder::getDispatchTime, Utils.Date.getStart(pageWrap.getModel().getDispatchTime()))
                .le(pageWrap.getModel().getDispatchTime() != null, Workorder::getDispatchTime, Utils.Date.getEnd(pageWrap.getModel().getDispatchTime()))
                .eq(pageWrap.getModel().getDispatchInfo() != null, Workorder::getDispatchInfo, pageWrap.getModel().getDispatchInfo())
                .ge(pageWrap.getModel().getDealTime() != null, Workorder::getDealTime, Utils.Date.getStart(pageWrap.getModel().getDealTime()))
                .le(pageWrap.getModel().getDealTime() != null, Workorder::getDealTime, Utils.Date.getEnd(pageWrap.getModel().getDealTime()))
                .eq(pageWrap.getModel().getDealInfo() != null, Workorder::getDealInfo, pageWrap.getModel().getDealInfo())
                .eq(pageWrap.getModel().getProblemTitle() != null, Workorder::getProblemTitle, pageWrap.getModel().getProblemTitle())
                .eq(pageWrap.getModel().getProblemId() != null, Workorder::getProblemId, pageWrap.getModel().getProblemId())
                .eq(pageWrap.getModel().getProblemInfo() != null, Workorder::getProblemInfo, pageWrap.getModel().getProblemInfo())
                .eq(pageWrap.getModel().getLocationName() != null, Workorder::getLocationName, pageWrap.getModel().getLocationName())
                .like(pageWrap.getModel().getCode() != null, Workorder::getCode, pageWrap.getModel().getCode())
                .eq(pageWrap.getModel().getDcaYesNum() != null, Workorder::getDcaYesNum, pageWrap.getModel().getDcaYesNum())
                .eq(pageWrap.getModel().getDcaNoNum() != null, Workorder::getDcaNoNum, pageWrap.getModel().getDcaNoNum())
                .eq(pageWrap.getModel().getDcaRecordId() != null, Workorder::getDcaRecordId, pageWrap.getModel().getDcaRecordId())
                .eq(pageWrap.getModel().getDcaCsIds() != null, Workorder::getDcaCsIds, pageWrap.getModel().getDcaCsIds()) ;
        if (pageWrap.getModel().getMemberName() != null) {
            queryWrapper.and( ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
                    .or().like(Member::getPhone,pageWrap.getModel().getMemberName()) );
        }
        queryWrapper.orderByDesc(Workorder::getCreateDate);
        return PageData.from(workorderMapper.selectJoinPage(page,Workorder.class, queryWrapper));
    }
@@ -864,6 +799,27 @@
        }
    }
    @Override
    public void sendSheEmail(){
        if(Constants.WORKORDER_SHE_EMAIL_SENDING){
            return;
        }
        Constants.WORKORDER_SHE_EMAIL_SENDING = true;
        try {
            List<Notices> list = noticesMapper.selectList(new QueryWrapper<Notices>().lambda()
                    .eq(Notices::getIsdeleted,Constants.ZERO)
                    .eq(Notices::getStatus,Constants.ZERO)
                    .eq(Notices::getType,Constants.THREE)//邮箱通知
            );
        }catch (Exception e){
            log.error("==================定时发生SHE邮件失败:"+e.getMessage());
        }finally {
            Constants.WORKORDER_SHE_EMAIL_SENDING = false;
        }
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
server/src/main/java/com/doumee/service/common/CaptchaService.java
@@ -127,17 +127,13 @@
    @Data
    @ApiModel("验证码对象")
    public static class Captcha {
        @ApiModelProperty(value = "验证码UUID")
        private String uuid;
        @JsonIgnore
        @ApiModelProperty(value = "验证码", hidden = true)
        private String text;
        @ApiModelProperty(value = "验证码Base64")
        private String image;
        Captcha (String text, BufferedImage image) {
            this.uuid = UUID.randomUUID().toString();
            this.text = text;
server/src/main/java/com/doumee/service/common/EmailService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.doumee.service.common;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;
import java.util.Map;
@Service
public class EmailService {
    @Autowired
    private JavaMailSender javaMailSender;//注入JavaMailSender
    @Value("${spring.mail.username}")
    private String fromEmail;
    public boolean sendEmailWithLocalFiles(String toEmail, String title, String content, List<Map<String,Object>> fileList) {
        try {
                AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
                context.refresh();
                MimeMessage message = javaMailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setTo(toEmail);
                helper.setFrom(fromEmail);
                helper.setSubject(title);
                helper.setText(content);
                if(fileList!=null){
                    for (Map<String,Object> f : fileList){
                        // è®¾ç½®é™„ä»¶
                        helper.addAttachment((String) f.get("name"),new FileSystemResource((File) f.get("file")));
                    }
                }
            javaMailSender.send(message);
                    System.out.println("邮件发送成功!");
                    return true;
            } catch (Exception e) {
            e.printStackTrace();
                    return false;
                }
            }
    public boolean sendEmailWithImages(String toEmail, String title, Map<String,String> contentForm, List<String> imgList) {
        try {
                AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
                context.refresh();
                MimeMessage message = javaMailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setTo(toEmail);
                helper.setFrom(fromEmail);
                helper.setSubject(title);
                String content = "<html><body>";
                if(contentForm!=null){
                    for (Map.Entry<String, String> f : contentForm.entrySet()) {
                        // è®¾ç½®é™„ä»¶
                        content += "<div style='display:block;'>"+f.getKey()+":"+f.getValue()+"</p>";
                    }
                }
                if(imgList!=null){
                    content += "<div style='display:block;'> ";
                    for (String f : imgList){
                        // è®¾ç½®é™„ä»¶
                        content += "<img style='width:200px;margin:5px' src='"+f+"'/>";
                    }
                }
            content += "</div></body><html>";
            helper.setText(content,true);
            javaMailSender.send(message);
                    System.out.println("邮件发送成功!");
                    return true;
            } catch (Exception e) {
            e.printStackTrace();
                    return false;
                }
            }
    }
server/src/main/resources/application-dev.yml
@@ -15,7 +15,36 @@
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
#  mail:
#    username: jiangping0849@outlook.com
#    password: mwzaislgioyhxnig
#    host: smtp-mail.outlook.com
#    port: 587
#    default-encoding: UTF-8
#    properties:
#      mail:
#        debug: true
#        smtp:
#          ssl:
#            socketFactory:
#              class: com.sun.mail.util.MailSSLSocketFactory
#              fallback: false
#          auth: true
#          starttls:
#            enable: true
#            required: true
  mail:
    host: smtp.exmail.qq.com
    username: jp@doumee.com
    password: 2Jz9HFW2U7vRnCRu
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true
        starttls:
          enable: true
          required: true
debug_model: true
server/src/main/resources/application-pro.yml
@@ -15,7 +15,18 @@
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  mail:
    host: smtp.exmail.qq.com
    username: jp@doumee.com
    password: 2Jz9HFW2U7vRnCRu
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true
        starttls:
          enable: true
          required: true
debug_model: true