feat: 疗休养优化站内消息发送

This commit is contained in:
2026-11-05 10:23:11 +08:00
parent 8c401a5132
commit 506121ac5f
8 changed files with 187 additions and 66 deletions
@@ -10,6 +10,8 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.ioc.impl.PropertiesProxy;
import org.nutz.lang.Strings;
import java.util.List;
@@ -24,6 +26,8 @@ public class SmsMessageSendStrategy implements GlobalMessageSendStrategy {
private Dao dao;
@Inject
private SmsService smsService;
@Inject
private PropertiesProxy conf;
@Override
public GlobalMessageChannel getChannel() {
@@ -118,7 +122,9 @@ public class SmsMessageSendStrategy implements GlobalMessageSendStrategy {
// 限制短信长度(一般短信限制70个字符)
String smsContent = sb.toString();
if (smsContent.length() > 67) {
boolean intelligenceMode = Strings.isNotBlank(conf.get("custom.msg.platform.app-id"))
&& conf.getBoolean("msg.platform.IntelligenceMode", false);
if (!intelligenceMode && smsContent.length() > 67) {
smsContent = smsContent.substring(0, 67) + "...";
}
@@ -10,6 +10,8 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.ioc.impl.PropertiesProxy;
import org.nutz.lang.Strings;
import java.util.List;
@@ -24,12 +26,20 @@ public class WechatMessageSendStrategy implements GlobalMessageSendStrategy {
private Dao dao;
@Inject
private SmsService smsService;
@Inject
private PropertiesProxy conf;
@Override
public GlobalMessageChannel getChannel() {
return GlobalMessageChannel.WECHAT;
}
@Override
public boolean isEnabled() {
return !(Strings.isNotBlank(conf.get("custom.msg.platform.app-id"))
&& conf.getBoolean("msg.platform.IntelligenceMode", false));
}
@Override
public boolean supportAsync() {
return true;
+1 -1
View File
@@ -34,7 +34,7 @@ sdk:
appSecret: a65cec4fb69980bd88258fc8433a3eef
redirectUri: /platform/wx/oauth2/callback
cas:
enable: true
enable: false
server-url-prefix: https://authserver.zjnu.edu.cn/authserver
server-login-url: https://authserver.zjnu.edu.cn/authserver/login
qi-wx-server-login-url: https://authserver.zjnu.edu.cn/authserver/login
+1 -1
View File
@@ -68,7 +68,7 @@ custom:
msg:
platform:
enabled: true
IntelligenceMode: false
IntelligenceMode: true
app-id: 'MSG45363193'
app-password: 'OGQxNzVmOTJkZjM5NzJhZDg1MDNiZGM0MDQ5ZTJlNDY'
base-url: http://xxt.zjnu.edu.cn
@@ -46,7 +46,7 @@ Vue.component('more', {
}
})
Vue.component('table-tool', {
Vue.component('therapy-table-tool', {
props: {
label: {type: String},
app: {}
@@ -127,3 +127,4 @@ Vue.component('table-tool', {
</el-row>
`,
})
Vue.component('table-tool', Vue.options.components['therapy-table-tool'])
@@ -71,7 +71,7 @@
<div v-if="familyCards" class="therapy-family-list">
<div v-for="(item, index) in viewData.companionList" :key="item.id || index" class="therapy-family-card">
<div class="therapy-family-title">家属 {{ index + 1 }} · {{ item.userName }}</div>
<el-descriptions :column="3" border class="therapy-family-details">
<el-descriptions :column="2" border class="therapy-family-details">
<el-descriptions-item label="姓名">{{ item.userName }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ item.sex }}</el-descriptions-item>
<el-descriptions-item label="关系">{{ item.relation }}</el-descriptions-item>
@@ -115,11 +115,79 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
padding-right: 0;
}
}
.therapy-query-view-dialog .el-dialog__body,
.therapy-query-edit-dialog .el-dialog__body {
padding: 16px 24px;
.therapy-query-view-dialog,
.therapy-query-edit-dialog {
display: flex;
flex-direction: column;
max-width: 1440px;
max-height: calc(100vh - 100px);
margin-top: 50px !important;
}
.therapy-query-view-dialog > .el-dialog__header,
.therapy-query-view-dialog > .el-dialog__footer,
.therapy-query-edit-dialog > .el-dialog__header,
.therapy-query-edit-dialog > .el-dialog__footer {
flex-shrink: 0;
}
.therapy-query-view-dialog > .el-dialog__body,
.therapy-query-edit-dialog > .el-dialog__body {
min-height: 0;
padding: 20px 24px;
overflow: auto;
}
.therapy-query-view-dialog .panel {
margin: 0 0 20px;
overflow: hidden;
border-radius: 4px;
}
.therapy-query-view-dialog .panel-heading {
padding: 12px 16px;
}
.therapy-query-view-dialog .panel-title {
margin: 0;
color: #303133;
font-size: 15px;
font-weight: 600;
line-height: 24px;
}
.therapy-query-view-dialog .panel-body {
padding: 16px;
}
.therapy-query-view-dialog .el-descriptions-item__label,
.therapy-query-edit-dialog .el-descriptions-item__label {
color: #606266;
font-weight: 400;
line-height: 24px;
}
.therapy-query-view-dialog .el-descriptions-item__content,
.therapy-query-edit-dialog .el-descriptions-item__content {
padding: 12px 16px;
line-height: 24px;
}
.therapy-query-edit-dialog .el-form-item__label {
color: #606266;
font-weight: 400;
}
.therapy-query-edit-dialog .therapy-edit-family > .el-form-item__label {
display: block;
float: none;
width: auto !important;
margin-bottom: 12px;
text-align: left;
line-height: 24px;
}
.therapy-query-view-dialog .viewTable .el-descriptions__table {
table-layout: fixed;
}
@@ -135,6 +203,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
}
.therapy-query-edit-dialog .therapy-edit-family > .el-form-item__content {
margin-left: 0 !important;
line-height: normal;
}
@@ -172,24 +241,32 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
white-space: nowrap;
}
@media (max-width: 767px) {
@media (max-width: 1000px) {
.therapy-query-view-dialog,
.therapy-query-edit-dialog {
width: 96% !important;
width: 94% !important;
}
.therapy-query-edit-dialog .el-form > .el-row > .el-col {
width: 100%;
}
.therapy-query-view-dialog .therapy-family-list,
.therapy-query-edit-dialog .therapy-family-list {
overflow-x: auto;
.therapy-query-view-dialog .el-descriptions__row,
.therapy-query-edit-dialog .therapy-family-details .el-descriptions__row {
display: grid;
grid-template-columns: 120px minmax(0, 1fr);
}
.therapy-query-view-dialog .therapy-family-card,
.therapy-query-edit-dialog .therapy-family-card {
min-width: 660px;
.therapy-query-view-dialog .viewTable .el-descriptions-item__label,
.therapy-query-view-dialog .therapy-family-details .el-descriptions-item__label,
.therapy-query-edit-dialog .therapy-family-details .el-descriptions-item__label {
width: auto;
white-space: normal;
}
.therapy-query-view-dialog .el-descriptions-item__content,
.therapy-query-edit-dialog .el-descriptions-item__content {
min-width: 0;
}
}
</style>
@@ -959,40 +1036,40 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
:visible.sync="editVisible"
:close-on-click-modal="false"
width="80%" top="50px">
<el-form :model="editFormData" label-width="120px" :rules="rules" ref="editForm" style="margin-right: 40px">
<el-row>
<el-col span="12">
<el-form :model="editFormData" label-width="120px" :rules="rules" ref="editForm">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item prop="loginName" label="工号">
<el-input v-model="editFormData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-col :span="12">
<el-form-item prop="userName" label="姓名">
<el-input v-model="editFormData.userName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item prop="userName" label="手机号">
<el-input v-model="editFormData.mobile" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-col :span="12">
<el-form-item prop="userName" label="身份证号">
<el-input v-model="editFormData.idCard" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item prop="unionName" label="工会">
<el-input v-model="editFormData.unionName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-col :span="12">
<el-form-item prop="unitName" label="单位">
<el-input v-model="editFormData.unitName" readonly></el-input>
</el-form-item>
@@ -1004,7 +1081,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
<div class="therapy-family-list">
<div v-for="(item, index) in editFormData.companionList" :key="item.id || index" class="therapy-family-card">
<div class="therapy-family-title">家属 {{ index + 1 }} · {{ item.userName }}</div>
<el-descriptions :column="3" border class="therapy-family-details">
<el-descriptions :column="2" border class="therapy-family-details">
<el-descriptions-item label="姓名">{{ item.userName }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ item.sex }}</el-descriptions-item>
<el-descriptions-item label="关系">{{ item.relation }}</el-descriptions-item>
@@ -1171,7 +1248,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
}
},
components: {
'enroll-info': httpVueLoader('/components/staffbenefit/therapyRecuperation/Enrollinfo.vue?v=1.0.2'),
'enroll-info': httpVueLoader('/components/staffbenefit/therapyRecuperation/Enrollinfo.vue?v=1.0.3'),
'line-info': httpVueLoader('/components/staffbenefit/therapyRecuperation/LineInfo.vue')
},
methods: {
@@ -27,6 +27,58 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
}
.therapy-statistics-time-dialog {
width: calc(100% - 32px) !important;
max-width: 960px;
border-radius: 8px;
overflow: hidden;
}
.therapy-statistics-time-dialog .el-dialog__header {
padding: 20px 24px;
border-bottom: 1px solid #ebeef5;
}
.therapy-statistics-time-dialog .el-dialog__body {
padding: 24px;
max-height: calc(84vh - 150px);
overflow-y: auto;
}
.therapy-statistics-time-dialog .statistics-time-fields {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0 24px;
padding: 20px 20px 0;
margin-bottom: 16px;
border: 1px solid #ebeef5;
border-radius: 6px;
background: #fafbfc;
}
.therapy-statistics-time-dialog .el-form-item { min-width: 0; margin-bottom: 22px; }
.therapy-statistics-time-dialog .el-form-item__label {
float: none;
display: block;
width: auto !important;
padding: 0 0 8px;
line-height: 22px;
text-align: left;
}
.therapy-statistics-time-dialog .el-form-item__content { margin-left: 0 !important; }
.therapy-statistics-time-dialog .el-date-editor { width: 100% !important; }
.therapy-statistics-time-dialog .el-dialog__footer {
padding: 16px 24px;
border-top: 1px solid #ebeef5;
background: #fff;
}
@media (max-width: 767px) {
.therapy-statistics-time-dialog .statistics-time-fields { grid-template-columns: minmax(0, 1fr); padding: 16px 16px 0; }
.therapy-statistics-time-dialog .el-dialog__body { padding: 16px; }
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
@@ -164,7 +216,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
<el-card shadow="never" class="mt10">
<table-tool label="" :app="this" ref="table_tool">
<therapy-table-tool label="" :app="this" ref="table_tool">
<template #func>
<el-button @click="showGiveTimes"
size="small"
@@ -191,7 +243,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
class="mr10">导出成团线路人员
</el-button>-->
</template>
</table-tool>
</therapy-table-tool>
<el-table :data="tableData" style="width: 100%"
ref="table"
row-key="lineUId" @sort-change="pageOrder"
@@ -337,69 +389,49 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
<el-dialog :append-to-body="true" :close-on-click-modal="false"
:visible.sync="setGiveLineTimeDialog"
title="统赋出行时间段信息"
width="80%">
width="80%" custom-class="therapy-statistics-time-dialog" top="8vh">
<el-form :model="giveLineTimesData"
:rules="giveLineTimesRules"
label-width="0"
ref="giveLineTimesForm"
size="small">
<div :key="row.id"
class="panel panel-default mt20"
style="border: none"
v-for="(row, index) in giveLineTimesData.times">
<div class="panel-heading"
style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none;display: flex;align-items: center;justify-content: space-between">
<h3 class="panel-title">出行时间段</h3>
</div>
<el-row>
<el-descriptions border :column="3">
<el-descriptions-item label="报名开始时间">
<el-form-item :prop="'times.' + index + '.signUpStartTime'" label-width="0">
<div :key="row.id || index" class="statistics-time-fields" v-for="(row, index) in giveLineTimesData.times">
<el-form-item label="报名开始时间" :prop="'times.' + index + '.signUpStartTime'" label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.signUpStartTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="报名结束时间">
<el-form-item :prop="'times.' + index + '.signUpEndTime'" label-width="0">
<el-form-item label="报名结束时间" :prop="'times.' + index + '.signUpEndTime'" label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.signUpEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="变更截至时间">
<el-form-item :prop="'times.' + index + '.changeEndTime'" label-width="0">
<el-form-item label="变更截至时间" :prop="'times.' + index + '.changeEndTime'" label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.changeEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出行开始时间">
<el-form-item :prop="'times.' + index + '.playStartTime'" label-width="0">
<el-form-item label="出行开始时间" :prop="'times.' + index + '.playStartTime'" label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.playStartTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出行结束时间">
<el-form-item :prop="'times.' + index + '.playEndTime'" label-width="0">
<el-form-item label="出行结束时间" :prop="'times.' + index + '.playEndTime'" label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.playEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="是否开启">
<el-form-item :prop="'times.' + index + '.enable'" label-width="0">
<el-form-item label="是否开启" :prop="'times.' + index + '.enable'" label-width="0">
<el-switch
active-color="#13ce66"
inactive-color="#ff4949"
@@ -408,18 +440,13 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
:inactive-value="false">
</el-switch>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="调剂报名截止时间">
<el-form-item :prop="'times.' + index + '.adjustSignUpEndTime'" label-width="0">
<el-form-item label="调剂报名截止时间" :prop="'times.' + index + '.adjustSignUpEndTime'" label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.adjustSignUpEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-row>
</div>
<el-alert closable
show-icon
@@ -427,10 +454,10 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
title="温馨提醒:变更时间应该大于报名截至时间,小于出行时间。"
type="warning"></el-alert>
</el-form>
<el-row justify="end" type="flex">
<span slot="footer" class="dialog-footer">
<el-button @click="setGiveLineTimeDialog=false">取消</el-button>
<el-button @click="doSetGiveLineTimes" type="primary">提交</el-button>
</el-row>
</span>
</el-dialog>
</guava>
</div>