diff --git a/pom.xml b/pom.xml index 377320203..b160bf485 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,8 @@ 2.13.0 4.1.2 2.3 + 1.5.5.Final + 1.18.30 @@ -193,6 +195,21 @@ ${ruoyi.version} + + org.mapstruct + mapstruct + ${org.mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 99efa6b2b..1ec03bf13 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -79,6 +79,19 @@ 1.18.30 + + org.mapstruct + mapstruct + + + org.mapstruct + mapstruct-processor + + + org.projectlombok + lombok-mapstruct-binding + + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/PointRechargeOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/PointRechargeOrderController.java new file mode 100644 index 000000000..9ac659d14 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/PointRechargeOrderController.java @@ -0,0 +1,185 @@ +package com.ruoyi.web.controller.sms; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.MonitorAddressInfo; +import com.ruoyi.common.core.domain.entity.PointRechargeOrder; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.vo.MonitorAddressInfoVO; +import com.ruoyi.system.service.IMonitorAddressInfoService; +import com.ruoyi.system.service.IPointRechargeOrderService; +import com.ruoyi.system.service.ISysUserService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 群发充值管理Controller + * + * @author dorion + * @date 2024-07-21 + */ +@Controller +@RequestMapping("/sms/point") +public class PointRechargeOrderController extends BaseController +{ + private String prefix = "sms/point"; + @Autowired + private IMonitorAddressInfoService monitorAddressInfoService; + @Autowired + private IPointRechargeOrderService pointRechargeOrderService; + @Autowired + private ISysUserService sysUserService; + + @RequiresPermissions("sms:point:view") + @GetMapping() + public String point(ModelMap mmap) + { + List sysUserList = sysUserService.selectUserList(new SysUser()); + mmap.put("sysUserList",sysUserList); + return prefix + "/point"; + } + + /** + * 查询群发充值管理列表 + */ + @RequiresPermissions("sms:point:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(PointRechargeOrder pointRechargeOrder) + { + startPage(); + List list = pointRechargeOrderService.selectPointRechargeOrderList(pointRechargeOrder); + return getDataTable(list); + } + + /** + * 导出群发充值管理列表 + */ + @RequiresPermissions("sms:point:export") + @Log(title = "群发充值管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(PointRechargeOrder pointRechargeOrder) + { + List list = pointRechargeOrderService.selectPointRechargeOrderList(pointRechargeOrder); + ExcelUtil util = new ExcelUtil(PointRechargeOrder.class); + return util.exportExcel(list, "群发充值管理数据"); + } + + /** + * 新增群发充值管理 + */ + @GetMapping("/add") + public String add(ModelMap mmap) + { + List sysUserList = sysUserService.selectUserList(new SysUser()); + mmap.put("sysUserList",sysUserList); + return prefix + "/add"; + } + /** + * 新增群发充值管理 + */ + @RequiresPermissions("sms:point:recharge") + @GetMapping("/recharge") + public String rechage(ModelMap mmap) + { + /*List sysUserList = sysUserService.selectUserList(new SysUser()); + mmap.put("sysUserList",sysUserList);*/ + return prefix + "/recharge"; + } + + @RequiresPermissions("sms:point:recharge") + @GetMapping("/rechargeOrder/{idPointRechargeOrder}") + public String rechargeOrder(ModelMap mmap,@PathVariable("idPointRechargeOrder") Long idPointRechargeOrder) + { + PointRechargeOrder pointRechargeOrder = pointRechargeOrderService.selectPointRechargeOrderByIdPointRechargeOrder(idPointRechargeOrder); + BigDecimal amount = pointRechargeOrder.getAmount(); + MonitorAddressInfo monitorAddressInfo = new MonitorAddressInfo(); + monitorAddressInfo.setBusiType(DictUtils.getDictValue("sys_busi_type", "短信群发")); + List list = monitorAddressInfoService.selectMonitorAddressInfoList(monitorAddressInfo); + MonitorAddressInfoVO monitorAddressInfoVO = list.get(0); + String monitorAddress = monitorAddressInfoVO.getMonitorAddress(); + String imageUrl = monitorAddressInfoVO.getImageUrl(); + + mmap.put("amount",amount); + mmap.put("monitorAddress",monitorAddress); + mmap.put("imageUrl",imageUrl); + return prefix + "/rechargeOrder"; + } + + /** + * 新增保存群发充值管理 + */ + @RequiresPermissions("sms:point:add") + @Log(title = "群发充值管理", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(PointRechargeOrder pointRechargeOrder) + { + return toAjax(pointRechargeOrderService.insertPointRechargeOrder(pointRechargeOrder)); + } + + @RequiresPermissions("ssms:point:recharge") + @Log(title = "群发充值管理", businessType = BusinessType.INSERT) + @PostMapping("/rechargeOrder") + @ResponseBody + public Map rechargeOrder(PointRechargeOrder pointRechargeOrder) + { + Map result = new HashMap<>(); + Long idPointRechargeOrder = pointRechargeOrderService.rechargeOrder(pointRechargeOrder); + result.put("success", true); + result.put("newPageUrl", "/sms/point/rechargeOrder/"+idPointRechargeOrder); // 返回新的页面 URL + return result; + } + + /** + * 修改群发充值管理 + */ + @RequiresPermissions("sms:point:edit") + @GetMapping("/edit/{idPointRechargeOrder}") + public String edit(@PathVariable("idPointRechargeOrder") Long idPointRechargeOrder, ModelMap mmap) + { + PointRechargeOrder pointRechargeOrder = pointRechargeOrderService.selectPointRechargeOrderByIdPointRechargeOrder(idPointRechargeOrder); + mmap.put("pointRechargeOrder", pointRechargeOrder); + List sysUserList = sysUserService.selectUserList(new SysUser()); + mmap.put("sysUserList",sysUserList); + return prefix + "/edit"; + } + + /** + * 修改保存群发充值管理 + */ + @RequiresPermissions("sms:point:edit") + @Log(title = "群发充值管理", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(PointRechargeOrder pointRechargeOrder) + { + return toAjax(pointRechargeOrderService.updatePointRechargeOrder(pointRechargeOrder)); + } + + /** + * 删除群发充值管理 + */ + @RequiresPermissions("sms:point:remove") + @Log(title = "群发充值管理", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(pointRechargeOrderService.deletePointRechargeOrderByIdPointRechargeOrders(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/SmsCountryPriceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/SmsCountryPriceController.java new file mode 100644 index 000000000..fbb976bd2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/SmsCountryPriceController.java @@ -0,0 +1,122 @@ +package com.ruoyi.web.controller.sms; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.CountryTbl; +import com.ruoyi.common.core.domain.entity.SmsCountryPrice; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISmsCountryPriceService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 群发国家单价配置Controller + * + * @author dorion + * @date 2024-07-21 + */ +@Controller +@RequestMapping("/sms/country") +public class SmsCountryPriceController extends BaseController { + private String prefix = "sms/country"; + + @Autowired + private ISmsCountryPriceService smsCountryPriceService; + + @RequiresPermissions("sms:country:view") + @GetMapping() + public String country(ModelMap mmp) { + List countries = smsCountryPriceService.selectAllCountries(); + mmp.put("countries", countries); + return prefix + "/country"; + } + + /** + * 查询群发国家单价配置列表 + */ + @RequiresPermissions("sms:country:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(SmsCountryPrice smsCountryPrice) { + startPage(); + List list = smsCountryPriceService.selectSmsCountryPriceList(smsCountryPrice); + return getDataTable(list); + } + + /** + * 导出群发国家单价配置列表 + */ + @RequiresPermissions("sms:country:export") + @Log(title = "群发国家单价配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(SmsCountryPrice smsCountryPrice) { + List list = smsCountryPriceService.selectSmsCountryPriceList(smsCountryPrice); + ExcelUtil util = new ExcelUtil(SmsCountryPrice.class); + return util.exportExcel(list, "群发国家单价配置数据"); + } + + /** + * 新增群发国家单价配置 + */ + @GetMapping("/add") + public String add(ModelMap mmp) { + List countries = smsCountryPriceService.selectAllCountries(); + mmp.put("countries", countries); + return prefix + "/add"; + } + + /** + * 新增保存群发国家单价配置 + */ + @RequiresPermissions("sms:country:add") + @Log(title = "群发国家单价配置", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(SmsCountryPrice smsCountryPrice) { + return toAjax(smsCountryPriceService.insertSmsCountryPrice(smsCountryPrice)); + } + + /** + * 修改群发国家单价配置 + */ + @RequiresPermissions("sms:country:edit") + @GetMapping("/edit/{idSmsCountryPrice}") + public String edit(@PathVariable("idSmsCountryPrice") Long idSmsCountryPrice, ModelMap mmap) { + SmsCountryPrice smsCountryPrice = smsCountryPriceService.selectSmsCountryPriceByIdSmsCountryPrice(idSmsCountryPrice); + mmap.put("smsCountryPrice", smsCountryPrice); + List countries = smsCountryPriceService.selectAllCountries(); + mmap.put("countries", countries); + return prefix + "/edit"; + } + + /** + * 修改保存群发国家单价配置 + */ + @RequiresPermissions("sms:country:edit") + @Log(title = "群发国家单价配置", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(SmsCountryPrice smsCountryPrice) { + return toAjax(smsCountryPriceService.updateSmsCountryPrice(smsCountryPrice)); + } + + /** + * 删除群发国家单价配置 + */ + @RequiresPermissions("sms:country:remove") + @Log(title = "群发国家单价配置", businessType = BusinessType.DELETE) + @PostMapping("/remove") + @ResponseBody + public AjaxResult remove(String ids) { + return toAjax(smsCountryPriceService.deleteSmsCountryPriceByIdSmsCountryPrices(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/SmsMonitorAddressInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/SmsMonitorAddressInfoController.java new file mode 100644 index 000000000..be68b1849 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/SmsMonitorAddressInfoController.java @@ -0,0 +1,157 @@ +package com.ruoyi.web.controller.sms; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.config.ServerConfig; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.MonitorAddressInfo; +import com.ruoyi.common.core.domain.entity.TgMessageInfo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.vo.MonitorAddressInfoVO; +import com.ruoyi.system.service.IAccountAddressInfoService; +import com.ruoyi.system.service.IMonitorAddressInfoService; +import com.ruoyi.system.service.impl.TgMessageInfoServiceImpl; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + +/** + * 监听账户入账Controller + * + * @author dorion + * @date 2024-04-13 + */ +@Controller +@RequestMapping("/sms/monitor") +public class SmsMonitorAddressInfoController extends BaseController +{ + private String prefix = "sms/monitor"; + + @Autowired + private IMonitorAddressInfoService monitorAddressInfoService; + @Autowired + private IAccountAddressInfoService accountAddressInfoService; + @Autowired + private TgMessageInfoServiceImpl tgMessageInfoService; + @Autowired + private ServerConfig serverConfig; + + @RequiresPermissions("sms:monitor:view") + @GetMapping() + public String monitor(ModelMap mmap) + { + TgMessageInfo tgMessageInfo = new TgMessageInfo(); + tgMessageInfo.setMessageType(5L); + mmap.put("topicTgmessageInfoList", tgMessageInfoService.selectTgMessageInfoList(tgMessageInfo)); + return prefix + "/monitor"; + } + + /** + * 查询监听账户入账列表 + */ + @RequiresPermissions("sms:monitor:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(MonitorAddressInfo monitorAddressInfo) + { + startPage(); + monitorAddressInfo.setBusiType(DictUtils.getDictValue("sys_busi_type", "短信群发")); + List list = monitorAddressInfoService.selectMonitorAddressInfoList(monitorAddressInfo); + return getDataTable(list); + } + + /** + * 导出监听账户入账列表 + */ + @RequiresPermissions("sms:monitor:export") + @Log(title = "监听账户入账", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(MonitorAddressInfo monitorAddressInfo) + { + monitorAddressInfo.setBusiType(DictUtils.getDictValue("sys_busi_type", "短信群发")); + List list = monitorAddressInfoService.selectMonitorAddressInfoList(monitorAddressInfo); + ExcelUtil util = new ExcelUtil(MonitorAddressInfoVO.class); + return util.exportExcel(list, "监听账户入账数据"); + } + + /** + * 新增监听账户入账 + */ + @GetMapping("/add") + public String add(ModelMap mmap) + { + TgMessageInfo tgMessageInfo = new TgMessageInfo(); + tgMessageInfo.setMessageType(5L); + mmap.put("topicTgmessageInfoList", tgMessageInfoService.selectTgMessageInfoList(tgMessageInfo)); + return prefix + "/add"; + } + + /** + * 新增保存监听账户入账 + */ + @RequiresPermissions("sms:monitor:add") + @Log(title = "监听账户入账", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(@RequestParam("file") MultipartFile file, MonitorAddressInfo monitorAddressInfo) throws IOException { // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + monitorAddressInfo.setImageUrl(url); + monitorAddressInfo.setBusiType(DictUtils.getDictValue("sys_busi_type", "短信群发")); + return toAjax(monitorAddressInfoService.insertMonitorAddressInfo(monitorAddressInfo)); + } + + /** + * 修改监听账户入账 + */ + @RequiresPermissions("sms:monitor:edit") + @GetMapping("/edit/{idMonitorAddress}") + public String edit(@PathVariable("idMonitorAddress") Long idMonitorAddress, ModelMap mmap) + { + MonitorAddressInfo monitorAddressInfo = monitorAddressInfoService.selectMonitorAddressInfoByIdMonitorAddress(idMonitorAddress); + mmap.put("monitorAddressInfo", monitorAddressInfo); + + TgMessageInfo tgMessageInfo = new TgMessageInfo(); + tgMessageInfo.setMessageType(5L); + mmap.put("topicTgmessageInfoList", tgMessageInfoService.selectTgMessageInfoList(tgMessageInfo)); + return prefix + "/edit"; + } + + /** + * 修改保存监听账户入账 + */ + @RequiresPermissions("sms:monitor:edit") + @Log(title = "监听账户入账", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(MonitorAddressInfo monitorAddressInfo) + { + return toAjax(monitorAddressInfoService.updateMonitorAddressInfo(monitorAddressInfo)); + } + + /** + * 删除监听账户入账 + */ + @RequiresPermissions("sms:monitor:remove") + @Log(title = "监听账户入账", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(monitorAddressInfoService.deleteMonitorAddressInfoByIdMonitorAddresss(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/UserPointController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/UserPointController.java new file mode 100644 index 000000000..27a34b388 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/UserPointController.java @@ -0,0 +1,134 @@ +package com.ruoyi.web.controller.sms; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.entity.UserPoint; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.system.service.IUserPointService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户积分Controller + * + * @author dorion + * @date 2024-07-21 + */ +@Controller +@RequestMapping("/sms/user") +public class UserPointController extends BaseController +{ + private String prefix = "sms/user"; + + @Autowired + private IUserPointService userPointService; + @Autowired + private ISysUserService sysUserService; + + @RequiresPermissions("sms:user:view") + @GetMapping() + public String user(ModelMap mmap) + { + List sysUserList = sysUserService.selectUserList(new SysUser()); + mmap.put("sysUserList",sysUserList); + return prefix + "/user"; + } + + /** + * 查询用户积分列表 + */ + @RequiresPermissions("sms:user:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(UserPoint userPoint) + { + startPage(); + List list = userPointService.selectUserPointList(userPoint); + return getDataTable(list); + } + + /** + * 导出用户积分列表 + */ + @RequiresPermissions("sms:user:export") + @Log(title = "用户积分", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(UserPoint userPoint) + { + List list = userPointService.selectUserPointList(userPoint); + ExcelUtil util = new ExcelUtil(UserPoint.class); + return util.exportExcel(list, "用户积分数据"); + } + + /** + * 新增用户积分 + */ + @GetMapping("/add") + public String add(ModelMap mmap) + { + List sysUserList = sysUserService.selectUserList(new SysUser()); + mmap.put("sysUserList",sysUserList); + return prefix + "/add"; + } + + /** + * 新增保存用户积分 + */ + @RequiresPermissions("sms:user:add") + @Log(title = "用户积分", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(UserPoint userPoint) + { + return toAjax(userPointService.insertUserPoint(userPoint)); + } + + /** + * 修改用户积分 + */ + @RequiresPermissions("sms:user:edit") + @GetMapping("/edit/{idUserPoint}") + public String edit(@PathVariable("idUserPoint") Long idUserPoint, ModelMap mmap) + { + UserPoint userPoint = userPointService.selectUserPointByIdUserPoint(idUserPoint); + mmap.put("userPoint", userPoint); + List sysUserList = sysUserService.selectUserList(new SysUser()); + mmap.put("sysUserList",sysUserList); + return prefix + "/edit"; + } + + /** + * 修改保存用户积分 + */ + @RequiresPermissions("sms:user:edit") + @Log(title = "用户积分", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(UserPoint userPoint) + { + return toAjax(userPointService.updateUserPoint(userPoint)); + } + + /** + * 删除用户积分 + */ + @RequiresPermissions("sms:user:remove") + @Log(title = "用户积分", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(userPointService.deleteUserPointByIdUserPoints(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/WSSmsTaskTblController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/WSSmsTaskTblController.java index 0ad5c572d..b561834dc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/WSSmsTaskTblController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/WSSmsTaskTblController.java @@ -1,15 +1,27 @@ package com.ruoyi.web.controller.sms; +import com.google.common.base.Preconditions; import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.config.ServerConfig; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SmsTaskTbl; import com.ruoyi.common.core.domain.vo.BatchUpdateSmsVO; +import com.ruoyi.common.core.domain.vo.SmsTaskTblPreSummaryVO; +import com.ruoyi.common.core.domain.vo.SmsTaskTblSummaryVO; +import com.ruoyi.common.core.domain.vo.SmsTaskTblVO; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.file.InvalidExtensionException; +import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISmsTaskTblService; +import com.ruoyi.web.controller.sms.converter.SmsTaskTblConverter; +import com.ruoyi.web.controller.sms.converter.SmsTaskTblVOConverter; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; @@ -19,39 +31,51 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; import java.util.List; /** * WS短信任务配置Controller - * + * * @author dorion * @date 2024-06-01 */ @Controller @RequestMapping("/sms/task/ws") -public class WSSmsTaskTblController extends BaseController -{ +public class WSSmsTaskTblController extends BaseController { private String prefix = "sms/task/ws"; @Autowired private ISmsTaskTblService smsTaskTblService; + @Autowired + private ServerConfig serverConfig; + @RequiresPermissions("sms:task:ws:view") @GetMapping() - public String task() - { + public String task() { return prefix + "/task"; } + @RequiresPermissions("sms:task:ws:view") + @GetMapping("/summary") + public String taskSummary() { + return prefix + "/taskSummary"; + } + /** * 查询WS短信任务配置列表 */ @RequiresPermissions("sms:task:ws:list") @PostMapping("/list") @ResponseBody - public TableDataInfo list(SmsTaskTbl smsTaskTbl) - { + public TableDataInfo list(SmsTaskTbl smsTaskTbl) { startPage(); List list = smsTaskTblService.selectSmsTaskTblList(smsTaskTbl); return getDataTable(list); @@ -64,25 +88,31 @@ public class WSSmsTaskTblController extends BaseController @Log(title = "WS短信任务配置", businessType = BusinessType.EXPORT) @PostMapping("/export") @ResponseBody - public AjaxResult export(SmsTaskTbl smsTaskTbl) - { + public AjaxResult export(SmsTaskTbl smsTaskTbl) { List list = smsTaskTblService.selectSmsTaskTblList(smsTaskTbl); - ExcelUtil util = new ExcelUtil(SmsTaskTbl.class); - return util.exportExcel(list, "WS短信任务配置数据"); + List smsTaskTblPreSummaryVOList = SmsTaskTblConverter.INSTANCE.to(list); + ExcelUtil util = new ExcelUtil(SmsTaskTblPreSummaryVO.class); + return util.exportExcel(smsTaskTblPreSummaryVOList, "WS短信任务配置数据"); } /** * 新增WS短信任务配置 */ @GetMapping("/add") - public String add() - { + public String add() { return prefix + "/add"; } + /** + * 新增WS短信任务配置 + */ + @GetMapping("/addBatch") + public String addBatch() { + return prefix + "/addBatch"; + } + @GetMapping("/update/{ids}") - public String update(@PathVariable("ids") String ids, ModelMap mmap) - { + public String update(@PathVariable("ids") String ids, ModelMap mmap) { mmap.put("ids", ids); return prefix + "/update"; } @@ -91,8 +121,7 @@ public class WSSmsTaskTblController extends BaseController @RequiresPermissions("sms:task:ws:edit") @Log(title = "WS短信任务配置", businessType = BusinessType.UPDATE) @ResponseBody - public AjaxResult update(BatchUpdateSmsVO batchUpdateSmsVO) - { + public AjaxResult update(BatchUpdateSmsVO batchUpdateSmsVO) { smsTaskTblService.updateBatchUpdateSmsVO(batchUpdateSmsVO); return toAjax(1); } @@ -104,19 +133,191 @@ public class WSSmsTaskTblController extends BaseController @Log(title = "WS短信任务配置", businessType = BusinessType.INSERT) @PostMapping("/add") @ResponseBody - public AjaxResult addSave(SmsTaskTbl smsTaskTbl) - { - smsTaskTbl.setSmsBusiType("WS"); - return toAjax(smsTaskTblService.insertSmsTaskTbl(smsTaskTbl)); + @RepeatSubmit + public AjaxResult addSave(@RequestParam("file") MultipartFile file, SmsTaskTbl smsTaskTbl) throws IOException { + + String taskName = smsTaskTbl.getTaskName(); + Preconditions.checkState(taskName.matches("^[a-zA-Z0-9_]+$"), "任务名称只能是数字,字母和下划线"); + + String originalFilename = file.getOriginalFilename(); + checkFileExtendName(originalFilename); + + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + + try (InputStream inputStream = file.getInputStream(); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { + + MessageDigest md = MessageDigest.getInstance("MD5"); + long lineCount = 0; + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + + String line; + String phoneNumber = null; + while ((line = bufferedReader.readLine()) != null) { + if (StringUtils.isEmpty(phoneNumber)) { + phoneNumber = line; + } + lineCount++; + byte[] lineBytes = line.getBytes(); + byteArrayOutputStream.write(lineBytes); + byteArrayOutputStream.write('\n'); // 添加换行符 + md.update(lineBytes); + } + + byte[] digest = md.digest(); + String md5 = bytesToHex(digest); +// String base64 = Base64.getEncoder().encodeToString(smsTaskTbl.getContext().getBytes()); + + // 设置SmsTaskTbl对象的属性 + smsTaskTbl.setSmsBusiType("WS"); + smsTaskTbl.setFileMd5(md5); +// smsTaskTbl.setContext(base64); + smsTaskTbl.setFilePath(url); + smsTaskTbl.setFileName(originalFilename); + smsTaskTbl.setTotalCount(lineCount); + smsTaskTbl.setPhoneNumber(phoneNumber); + return toAjax(smsTaskTblService.insertSmsTaskTbl(smsTaskTbl)); + } catch (IOException | NoSuchAlgorithmException e) { + throw new RuntimeException("Failed to process file", e); + } + + } + private static void checkFileExtendName(String originalFilename) { + String[] split = originalFilename.split("."); + Preconditions.checkState("txt".equals(split[split.length - 1]), "文件格式错误,只支持txt文件上传"); + } + + private String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } + + /** + * 新增保存WS短信任务配置 + */ + @RequiresPermissions("sms:task:ws:add") + @Log(title = "WS短信任务批量配置", businessType = BusinessType.INSERT) + @PostMapping("/addBatch") + @ResponseBody + @RepeatSubmit + public AjaxResult addBatchSave(@RequestParam("file") MultipartFile file, SmsTaskTblVO smsTaskTblVO) throws IOException, InvalidExtensionException, NoSuchAlgorithmException { + int splitNumber = 0; + splitNumber = smsTaskTblVO.getSplitNumber(); + String[] allowedExtension = new String[]{"txt"}; +// String baseDir = "/your/upload/directory"; // 上传文件的基础目录 + String filePath = RuoYiConfig.getUploadPath(); + // 拆分文件并上传 + InputStream inputStream = file.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + + String placeHolder = smsTaskTblVO.getPlaceHolder(); + String context = smsTaskTblVO.getContext(); + Preconditions.checkState(context.indexOf(placeHolder) != -1, "文本内容中不存在占位符"); + + String placeHolderFill = smsTaskTblVO.getPlaceHolderFill(); + Preconditions.checkState(StringUtils.isNotEmpty(placeHolderFill), "占位符填充内容不能为空"); + String[] split = placeHolderFill.split("\r\n"); + + Preconditions.checkState(splitNumber > 0, "物料切割数量必须大于0"); + Preconditions.checkState(split.length == splitNumber, "占位填充符数量与物料切割数量不一致"); + + List buffer = new ArrayList<>(); + String line; + String phoneNumber = null; + long lineNumber = 0; + while ((line = reader.readLine()) != null) { + buffer.add(line); + if ( StringUtils.isEmpty(phoneNumber)) { + phoneNumber = line; + } + + lineNumber++; + } + smsTaskTblVO.setLineCount(lineNumber); + reader.close(); + smsTaskTblVO.setPhoneNumber(phoneNumber); + String originalFilename = file.getOriginalFilename(); + int totalLines = buffer.size(); + int linesPerFile = totalLines / splitNumber; + List smsTaskTblList = new ArrayList<>(); + for (int i = 0; i < splitNumber; i++) { + PipedOutputStream pos = new PipedOutputStream(); + PipedInputStream pis = new PipedInputStream(pos); + String outputFileName = originalFilename + "_" + (i + 1) + ".txt"; + + int startLine = i * linesPerFile; +// int endLine = Math.min(startLine + linesPerFile, totalLines); + int endLine = (i == splitNumber - 1) ? totalLines : startLine + linesPerFile; + + MessageDigest md = MessageDigest.getInstance("MD5"); + long lineCount = 0; + + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(pos, StandardCharsets.UTF_8))) { + for (int j = startLine; j < endLine; j++) { + String writeLine = buffer.get(j); + writer.write(writeLine); + writer.newLine(); + md.update(writeLine.getBytes()); + lineCount++; + } + writer.flush(); + } catch (IOException e) { + logger.error("Failed to write file", e); + } finally { + try { + pos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // 调用上传方法 + String fileName = FileUploadUtils.upload(filePath, outputFileName, pis, allowedExtension); + pis.close(); + byte[] digest = md.digest(); + String md5 = bytesToHex(digest); + SmsTaskTbl smsTaskTbl = SmsTaskTblVOConverter.INSTANCE.to(smsTaskTblVO); + smsTaskTbl.setFileName(outputFileName); + smsTaskTbl.setTaskName(smsTaskTblVO.getTaskName() + "_" + (i + 1) + "_" + placeHolder); + smsTaskTbl.setContext(smsTaskTblVO.getContext().replaceAll(placeHolder, split[i])); + smsTaskTbl.setFilePath(serverConfig.getUrl() + fileName); + smsTaskTbl.setFileMd5(md5); + smsTaskTbl.setSmsBusiType("WS"); + smsTaskTbl.setTotalCount(lineCount); + smsTaskTblList.add(smsTaskTbl); + + } + smsTaskTblVO.setSmsTaskTblList(smsTaskTblList); + smsTaskTblService.insertSmsTaskTblBatch(smsTaskTblVO); + return toAjax(split.length); + } + + private int countLines(BufferedReader reader) throws IOException { + int lines = 0; + while (reader.readLine() != null) { + lines++; + } + return lines; + } + + /** * 修改WS短信任务配置 */ @RequiresPermissions("sms:task:ws:edit") @GetMapping("/edit/{idSmsTask}") - public String edit(@PathVariable("idSmsTask") Long idSmsTask, ModelMap mmap) - { + public String edit(@PathVariable("idSmsTask") Long idSmsTask, ModelMap mmap) { SmsTaskTbl smsTaskTbl = smsTaskTblService.selectSmsTaskTblByIdSmsTask(idSmsTask); mmap.put("smsTaskTbl", smsTaskTbl); return prefix + "/edit"; @@ -125,8 +326,7 @@ public class WSSmsTaskTblController extends BaseController @RequiresPermissions("sms:task:ws:export") @GetMapping("/exportTaskDetail/{idSmsTask}") - public ResponseEntity exportTaskDetail(@PathVariable("idSmsTask") Long idSmsTask) - { + public ResponseEntity exportTaskDetail(@PathVariable("idSmsTask") Long idSmsTask) { byte[] report = smsTaskTblService.getReport(idSmsTask); HttpHeaders headers = new HttpHeaders(); @@ -136,6 +336,16 @@ public class WSSmsTaskTblController extends BaseController return new ResponseEntity<>(report, headers, HttpStatus.OK); } + @RequiresPermissions("sms:task:ws:export") + @PostMapping("/exportSummaryTaskUrl") + @ResponseBody + public AjaxResult exportSummaryTaskUrl(SmsTaskTbl smsTaskTbl) { + List list = smsTaskTblService.selectSmsTaskTblList(smsTaskTbl); + List smsTaskTblPreSummaryVOList = SmsTaskTblConverter.INSTANCE.toSmsTaskTblSummaryVOList(list); + ExcelUtil util = new ExcelUtil(SmsTaskTblSummaryVO.class); + return util.exportExcel(smsTaskTblPreSummaryVOList, "WS短信任务配置数据"); + } + /** * 修改保存WS短信任务配置 */ @@ -143,8 +353,8 @@ public class WSSmsTaskTblController extends BaseController @Log(title = "WS短信任务配置", businessType = BusinessType.UPDATE) @PostMapping("/edit") @ResponseBody - public AjaxResult editSave(SmsTaskTbl smsTaskTbl) - { + @RepeatSubmit + public AjaxResult editSave(SmsTaskTbl smsTaskTbl) { return toAjax(smsTaskTblService.updateSmsTaskTbl(smsTaskTbl)); } @@ -153,17 +363,16 @@ public class WSSmsTaskTblController extends BaseController */ @RequiresPermissions("sms:task:ws:remove") @Log(title = "WS短信任务配置", businessType = BusinessType.DELETE) - @PostMapping( "/remove") + @PostMapping("/remove") @ResponseBody - public AjaxResult remove(String ids) - { + public AjaxResult remove(String ids) { return toAjax(smsTaskTblService.deleteSmsTaskTblByIdSmsTasks(ids)); } @RequiresPermissions("sms:task:ws:edit") @Log(title = "租户", businessType = BusinessType.ACTIVE_DATA) - @PostMapping( "/completeTask") + @PostMapping("/completeTask") @ResponseBody public AjaxResult completeTask(String ids) throws Exception { return toAjax(smsTaskTblService.complete(ids)); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/converter/SmsTaskTblConverter.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/converter/SmsTaskTblConverter.java new file mode 100644 index 000000000..45796779f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/converter/SmsTaskTblConverter.java @@ -0,0 +1,24 @@ +package com.ruoyi.web.controller.sms.converter; + +import com.ruoyi.common.core.domain.entity.SmsTaskTbl; +import com.ruoyi.common.core.domain.vo.SmsTaskTblPreSummaryVO; +import com.ruoyi.common.core.domain.vo.SmsTaskTblSummaryVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + + +@Mapper +public interface SmsTaskTblConverter { + + SmsTaskTblConverter INSTANCE = Mappers.getMapper(SmsTaskTblConverter.class); + + SmsTaskTblPreSummaryVO to(SmsTaskTbl smsTaskTbl); + + + List to(List smsTaskTblList); + + SmsTaskTblSummaryVO toSmsTaskTblSummaryVO(SmsTaskTbl smsTaskTbl); + List toSmsTaskTblSummaryVOList(List smsTaskTblList); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/converter/SmsTaskTblVOConverter.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/converter/SmsTaskTblVOConverter.java new file mode 100644 index 000000000..1969d6e02 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sms/converter/SmsTaskTblVOConverter.java @@ -0,0 +1,19 @@ +package com.ruoyi.web.controller.sms.converter; + +import com.ruoyi.common.core.domain.entity.SmsTaskTbl; +import com.ruoyi.common.core.domain.vo.SmsTaskTblVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + + +@Mapper +public interface SmsTaskTblVOConverter { + + SmsTaskTblVOConverter INSTANCE = Mappers.getMapper(SmsTaskTblVOConverter.class); + + @Mapping(target = "fileName",ignore = true) + @Mapping(target = "taskName",ignore = true) + @Mapping(target = "context",ignore = true) + SmsTaskTbl to(SmsTaskTblVO smsTaskTblVO); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DefaultConfiguration.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DefaultConfiguration.java new file mode 100644 index 000000000..154524a6a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DefaultConfiguration.java @@ -0,0 +1,18 @@ +package com.ruoyi.web.core.config; + +import com.ruoyi.common.utils.SnowFlakeUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DefaultConfiguration { + @Value("${snowflake.workerId}") + private long workerId; + @Value("${snowflake.dataCenterId}") + private long dataCenterId; + @Bean + public SnowFlakeUtil getSnowFlakeUtil(){ + return new SnowFlakeUtil(dataCenterId,workerId); + } +} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 3f7281aea..d77eb7e02 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -9,7 +9,7 @@ ruoyi: # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) - profile: D:/ruoyi/uploadPath + profile: D:/ruoyi/uploadPathr # 获取ip地址开关 addressEnabled: false @@ -170,4 +170,9 @@ tg: bot: name: CnRogerBot token: 6559243612:AAFOZU6MFq_pX25w71PH874_lVIM2MIhuSE - chatid: -1002058165663 \ No newline at end of file + chatid: -1002058165663 + + +snowflake: + dataCenterId: 1 + workerId: 1 \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js b/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js index f77d5cf41..6a6170e77 100644 --- a/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js +++ b/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js @@ -405,6 +405,28 @@ var table = { window.location.href = url; $.modal.closeLoading(); + },exportSummaryTaskExcel: function(formId) { + + table.set(); + $.modal.confirm("确定导出所有" + table.options.modalName + "吗?", function() { + var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; + var params = $("#" + table.options.id).bootstrapTable('getOptions'); + var dataParam = $("#" + currentId).serializeArray(); + dataParam.push({ "name": "orderByColumn", "value": params.sortName }); + dataParam.push({ "name": "isAsc", "value": params.sortOrder }); + $.modal.loading("正在导出数据,请稍候..."); + $.post(table.options.exportSummaryTaskUrl, dataParam, function(result) { + if (result.code == web_status.SUCCESS) { + window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true; + } else if (result.code == web_status.WARNING) { + $.modal.alertWarning(result.msg) + } else { + $.modal.alertError(result.msg); + } + $.modal.closeLoading(); + }); + }); + },completeTask: function(formId) { table.set(); @@ -1200,6 +1222,10 @@ var table = { table.set(); $.modal.openTab("添加" + table.options.modalName, $.operate.addUrl(id)); }, + addBatchTab: function (id) { + table.set(); + $.modal.openTab("添加" + table.options.modalName, $.operate.addBatchUrl(id)); + }, // 添加信息 全屏 addFull: function(id) { table.set(); @@ -1210,6 +1236,10 @@ var table = { var url = $.common.isEmpty(id) ? table.options.createUrl.replace("{id}", "") : table.options.createUrl.replace("{id}", id); return url; }, + addBatchUrl: function(id) { + var url = $.common.isEmpty(id) ? table.options.createBatchUrl.replace("{id}", "") : table.options.createBatchUrl.replace("{id}", id); + return url; + }, // 修改信息 edit: function(id) { table.set(); diff --git a/ruoyi-admin/src/main/resources/templates/sms/country/add.html b/ruoyi-admin/src/main/resources/templates/sms/country/add.html new file mode 100644 index 000000000..ae57e62f4 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/country/add.html @@ -0,0 +1,50 @@ + + + + + + + + + + 国家: + + + + + + + + + + + 单价: + + + + + + 备注信息: + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/country/country.html b/ruoyi-admin/src/main/resources/templates/sms/country/country.html new file mode 100644 index 000000000..04561065a --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/country/country.html @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + 国家: + + + + 创建时间: + + - + + + + 搜索 + 重置 + + + + + + + + + 添加 + + + 修改 + + + 删除 + + + 导出 + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/country/edit.html b/ruoyi-admin/src/main/resources/templates/sms/country/edit.html new file mode 100644 index 000000000..58b60781e --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/country/edit.html @@ -0,0 +1,47 @@ + + + + + + + + + + + 国家: + + + + + + + + + 单价: + + + + + + 备注信息: + + [[*{remark}]] + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/monitor/add.html b/ruoyi-admin/src/main/resources/templates/sms/monitor/add.html new file mode 100644 index 000000000..39591cd9e --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/monitor/add.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + 地址别名: + + + + + + 监听地址: + + + + + + + 收款二维码 + + + + 选择文件重新选择 + + × + + + + + + + + + + 备注: + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/monitor/edit.html b/ruoyi-admin/src/main/resources/templates/sms/monitor/edit.html new file mode 100644 index 000000000..b47d6122f --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/monitor/edit.html @@ -0,0 +1,116 @@ + + + + + + + + + + + + + 地址别名: + + + + + + 监听地址: + + + + + + 出账地址: + + + + + + + + + + + TRX兑换单价/TRX: + + + + + + USDT兑换单价/USDT: + + + + + + 是否有效: + + + + + + + + + 绑定时长: + + + + + + + + + 通知消息模版: + + + + + + + + 绑定群组: + + + + + + + + + + 备注: + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/monitor/monitor.html b/ruoyi-admin/src/main/resources/templates/sms/monitor/monitor.html new file mode 100644 index 000000000..627eb330c --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/monitor/monitor.html @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + 监听地址: + + + + + 是否有效: + + 所有 + + + + + + 创建时间: + + - + + + + 搜索 + 重置 + + + + + + + + + 添加 + + + + 删除 + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/point/add.html b/ruoyi-admin/src/main/resources/templates/sms/point/add.html new file mode 100644 index 000000000..f11011a46 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/point/add.html @@ -0,0 +1,49 @@ + + + + + + + + + + 用户: + + + + + + + + + + 充值金额: + + + + + + 支付状态: + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/point/edit.html b/ruoyi-admin/src/main/resources/templates/sms/point/edit.html new file mode 100644 index 000000000..8043cb264 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/point/edit.html @@ -0,0 +1,44 @@ + + + + + + + + + + + 用户: + + + + + + + + + + 支付状态: + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/point/point.html b/ruoyi-admin/src/main/resources/templates/sms/point/point.html new file mode 100644 index 000000000..5330cbb47 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/point/point.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + 充值订单: + + + + 充值金额: + + + + + 支付状态: + + 所有 + + + + + + 创建时间: + + - + + + + + + + + + + + 添加 + + + 修改 + + + 删除 + + + 导出 + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sms/point/recharge.html b/ruoyi-admin/src/main/resources/templates/sms/point/recharge.html new file mode 100644 index 000000000..e49ab116b --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/point/recharge.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + 1 + 创建充值订单 + + + + + 2 + 充值订单信息 + + + + + + + 💰1 USDT兑换 7.2 积分: + + + + + + 充值金额: + + + + USDT + + + + + 保 存 + 关 闭 + + + + + + + + diff --git a/ruoyi-admin/src/main/resources/templates/sms/point/rechargeOrder.html b/ruoyi-admin/src/main/resources/templates/sms/point/rechargeOrder.html new file mode 100644 index 000000000..7349007ff --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sms/point/rechargeOrder.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + 1 + 创建充值订单 + + + + + 2 + 充值订单信息 + + + + + + + 转账时请仔细确认地址和金额是否跟页面一致! + + + + + + + + 充值类型: + + USDT_TRC20 + + + + 转账金额: + + + + + + + 付款地址: + + + + + + + + + + + + + 到账金额 必须确认为 USDT,否则充值不成功。 + 请在 60分钟 内完成转账。 + 交易成功后会自动充值到账。 + 如因转账金额错误导致的充值失败,客服将在 14:00-15:00 时间段集中核对处理。 + + + + + + + + + + + diff --git a/ruoyi-admin/src/main/resources/templates/sms/task/ws/add.html b/ruoyi-admin/src/main/resources/templates/sms/task/ws/add.html index bda9fdf2d..6f08e1475 100644 --- a/ruoyi-admin/src/main/resources/templates/sms/task/ws/add.html +++ b/ruoyi-admin/src/main/resources/templates/sms/task/ws/add.html @@ -8,42 +8,33 @@ - + 任务名称: - + 物料 - - - - - 选择文件重新选择 - - × - + + + 选择文件重新选择 + + × + + + + 文本内容: + + + + + 任务开始时间: @@ -82,7 +73,6 @@ -