From a0436685d963dd19e0df70d1447ad5efafbfb36e Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期一, 14 四月 2025 17:07:35 +0800
Subject: [PATCH] 代码初始化

---
 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_mail_2_2_5_RELEASE.xml |   13 +
 admin/src/components/business/OperaManagersWindow.vue                                      |   22 ++
 server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java            |   90 ++--------
 server/src/main/resources/application-dev.yml                                              |   31 +++
 admin/src/views/business/managersDca.vue                                                   |    8 
 admin/src/views/business/managersShe.vue                                                   |    8 
 server/src/main/java/com/doumee/service/business/WorkorderService.java                     |    1 
 server/src/main/java/com/doumee/dao/business/model/Managers.java                           |    4 
 .idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml                     |   13 +
 server/src/main/java/com/doumee/api/common/PublicCloudController.java                      |   23 ++
 /dev/null                                                                                  |   13 -
 admin/src/views/business/managersSheNotice.vue                                             |   43 ++++
 server/src/main/java/com/doumee/job/WorkorderSheEmailJob.java                              |   34 ++++
 server/pom.xml                                                                             |    4 
 .idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml                       |   13 +
 server/src/main/java/com/doumee/core/constants/Constants.java                              |    1 
 server/src/main/java/com/doumee/dao/business/model/Workorder.java                          |    6 
 server/src/main/resources/application-pro.yml                                              |   13 +
 .idea/libraries/Maven__commons_io_commons_io_2_2.xml                                       |   13 +
 admin/src/views/business/company.vue                                                       |    3 
 admin/src/views/business/managersDcaAuth.vue                                               |    8 
 server/src/main/java/com/doumee/service/common/CaptchaService.java                         |    4 
 server/src/main/java/com/doumee/service/common/EmailService.java                           |   79 +++++++++
 .idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_4.xml                                 |   13 +
 24 files changed, 346 insertions(+), 114 deletions(-)

diff --git a/.idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml b/.idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml
new file mode 100644
index 0000000..33df932
--- /dev/null
+++ b/.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>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_4.xml b/.idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_4.xml
new file mode 100644
index 0000000..05500cf
--- /dev/null
+++ b/.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>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml b/.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml
new file mode 100644
index 0000000..fd4bc5d
--- /dev/null
+++ b/.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>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_io_commons_io_1_3_1.xml b/.idea/libraries/Maven__commons_io_commons_io_1_3_1.xml
deleted file mode 100644
index 1a19912..0000000
--- a/.idea/libraries/Maven__commons_io_commons_io_1_3_1.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<component name="libraryTable">
-  <library name="Maven: commons-io:commons-io:1.3.1">
-    <CLASSES>
-      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-io/commons-io/1.3.1/commons-io-1.3.1.jar!/" />
-    </CLASSES>
-    <JAVADOC>
-      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-io/commons-io/1.3.1/commons-io-1.3.1-javadoc.jar!/" />
-    </JAVADOC>
-    <SOURCES>
-      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-io/commons-io/1.3.1/commons-io-1.3.1-sources.jar!/" />
-    </SOURCES>
-  </library>
-</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_io_commons_io_2_2.xml b/.idea/libraries/Maven__commons_io_commons_io_2_2.xml
new file mode 100644
index 0000000..fa554ba
--- /dev/null
+++ b/.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>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_mail_2_2_5_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_mail_2_2_5_RELEASE.xml
new file mode 100644
index 0000000..40b8974
--- /dev/null
+++ b/.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>
\ No newline at end of file
diff --git a/admin/src/components/business/OperaManagersWindow.vue b/admin/src/components/business/OperaManagersWindow.vue
index e99f814..e106aac 100644
--- a/admin/src/components/business/OperaManagersWindow.vue
+++ b/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,9 +46,11 @@
       form: {
         type: '',
         memberId: '',
-        remark: ''
+        remark: '',
+        isQw: 0,
+        isEmail: 0
       },
-      loading:false,
+      loading: false,
       memberList: [],
       // 楠岃瘉瑙勫垯
       rules: {
@@ -59,10 +69,10 @@
   methods: {
     loadMember (query) {
       this.memberList = []
-      if(!query || query==''){
+      if (!query || query == '') {
         return
       }
-      this.loading =true
+      this.loading = true
       allList({
         keyword: query
       })
@@ -72,7 +82,7 @@
         .catch(e => {
         })
         .finally(() => {
-          this.loading =false
+          this.loading = false
         })
     },
     open (title, target) {
diff --git a/admin/src/views/business/company.vue b/admin/src/views/business/company.vue
index 5b50d07..e16a296 100644
--- a/admin/src/views/business/company.vue
+++ b/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 => {
diff --git a/admin/src/views/business/managersDca.vue b/admin/src/views/business/managersDca.vue
index f1adef1..a7ce451 100644
--- a/admin/src/views/business/managersDca.vue
+++ b/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
       }
     }
diff --git a/admin/src/views/business/managersDcaAuth.vue b/admin/src/views/business/managersDcaAuth.vue
index 0faccb6..4805f1f 100644
--- a/admin/src/views/business/managersDcaAuth.vue
+++ b/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
       }
     }
diff --git a/admin/src/views/business/managersShe.vue b/admin/src/views/business/managersShe.vue
index 10c282b..52171b8 100644
--- a/admin/src/views/business/managersShe.vue
+++ b/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
       }
     }
diff --git a/admin/src/views/business/managersSheNotice.vue b/admin/src/views/business/managersSheNotice.vue
index 0f8f3a3..44b59bd 100644
--- a/admin/src/views/business/managersSheNotice.vue
+++ b/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>
diff --git a/server/pom.xml b/server/pom.xml
index 0156c1b..d761875 100644
--- a/server/pom.xml
+++ b/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>
diff --git a/server/src/main/java/com/doumee/api/common/PublicCloudController.java b/server/src/main/java/com/doumee/api/common/PublicCloudController.java
index 4ecc8da..abe0006 100644
--- a/server/src/main/java/com/doumee/api/common/PublicCloudController.java
+++ b/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 = "鎵归噺涓婁紶鏂囦欢鍒癋TP")
     @RequestMapping(method= RequestMethod.POST,value="/uploadBatch")
     @ResponseBody
diff --git a/server/src/main/java/com/doumee/core/constants/Constants.java b/server/src/main/java/com/doumee/core/constants/Constants.java
index 265f93c..5dbbe8b 100644
--- a/server/src/main/java/com/doumee/core/constants/Constants.java
+++ b/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" ;
diff --git a/server/src/main/java/com/doumee/dao/business/model/Managers.java b/server/src/main/java/com/doumee/dao/business/model/Managers.java
index 679154a..72d6f2d 100644
--- a/server/src/main/java/com/doumee/dao/business/model/Managers.java
+++ b/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 = "浜哄憳缂栫爜锛堝叧鑱攎ember)", example = "1")
     private Integer memberId;
diff --git a/server/src/main/java/com/doumee/dao/business/model/Workorder.java b/server/src/main/java/com/doumee/dao/business/model/Workorder.java
index 5d4384b..57fddf1 100644
--- a/server/src/main/java/com/doumee/dao/business/model/Workorder.java
+++ b/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;
diff --git a/server/src/main/java/com/doumee/job/WorkorderSheEmailJob.java b/server/src/main/java/com/doumee/job/WorkorderSheEmailJob.java
new file mode 100644
index 0000000..2548de9
--- /dev/null
+++ b/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("瀹氭椂鍙戦�丼HE閭欢閫氱煡");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return jobContext;
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/WorkorderService.java b/server/src/main/java/com/doumee/service/business/WorkorderService.java
index f093ecd..4f12fe8 100644
--- a/server/src/main/java/com/doumee/service/business/WorkorderService.java
+++ b/server/src/main/java/com/doumee/service/business/WorkorderService.java
@@ -149,4 +149,5 @@
      */
     void sendCopy(SendCopyDTO sendCopyDTO);
 
+    void sendSheEmail();
 }
diff --git a/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
index 782492f..dd7ed90 100644
--- a/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
+++ b/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})
diff --git a/server/src/main/java/com/doumee/service/common/CaptchaService.java b/server/src/main/java/com/doumee/service/common/CaptchaService.java
index df4c868..2b00c71 100644
--- a/server/src/main/java/com/doumee/service/common/CaptchaService.java
+++ b/server/src/main/java/com/doumee/service/common/CaptchaService.java
@@ -127,17 +127,13 @@
     @Data
     @ApiModel("楠岃瘉鐮佸璞�")
     public static class Captcha {
-
         @ApiModelProperty(value = "楠岃瘉鐮乁UID")
         private String uuid;
-
         @JsonIgnore
         @ApiModelProperty(value = "楠岃瘉鐮�", hidden = true)
         private String text;
-
         @ApiModelProperty(value = "楠岃瘉鐮丅ase64")
         private String image;
-
         Captcha (String text, BufferedImage image) {
             this.uuid = UUID.randomUUID().toString();
             this.text = text;
diff --git a/server/src/main/java/com/doumee/service/common/EmailService.java b/server/src/main/java/com/doumee/service/common/EmailService.java
new file mode 100644
index 0000000..6467d4c
--- /dev/null
+++ b/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;
+                }
+            }
+    }
diff --git a/server/src/main/resources/application-dev.yml b/server/src/main/resources/application-dev.yml
index e60b0b3..634538d 100644
--- a/server/src/main/resources/application-dev.yml
+++ b/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
 
diff --git a/server/src/main/resources/application-pro.yml b/server/src/main/resources/application-pro.yml
index 8da4bc1..b48a872 100644
--- a/server/src/main/resources/application-pro.yml
+++ b/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
 

--
Gitblit v1.9.3