1;营销渠道AI/短信(普通,安全)-30%,差短信集成

2;申请应用,集成饿了么(引入sdk)-10%
3;流水明细过滤条件-完成
4;黑名单,订单查询调整-完成
This commit is contained in:
wangshuai 2024-07-22 15:09:10 +08:00
parent 563aad498b
commit 60b171f166
19 changed files with 159 additions and 29 deletions

View File

@ -123,7 +123,7 @@ public class BusBanOperateController extends BaseController
/** /**
* 删除免运营订单信息 * 删除免运营订单信息
*/ */
@PreAuthorize("@ss.hasPermi('system:info:remove')") // @PreAuthorize("@ss.hasPermi('system:info:remove')")
@Log(title = "免运营订单信息", businessType = BusinessType.DELETE) @Log(title = "免运营订单信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) public AjaxResult remove(@PathVariable Long[] ids)

View File

@ -50,14 +50,15 @@ public class BusIntegralRecordController extends BaseController
public TableDataInfo list(BusIntegralRecord busIntegralRecord) public TableDataInfo list(BusIntegralRecord busIntegralRecord)
{ {
if(!"admin".equals(SecurityUtils.getLoginUser().getUsername())){ if(!"admin".equals(SecurityUtils.getLoginUser().getUsername())){
BusAgentInfo agentInfo = new BusAgentInfo(); // BusAgentInfo agentInfo = new BusAgentInfo();
agentInfo.setSuperiorAgentAccount(SecurityUtils.getLoginUser().getUsername()); // agentInfo.setSuperiorAgentAccount(SecurityUtils.getLoginUser().getUsername());
List<BusAgentInfo> busAgentInfoList = agentInfoService.selectBusAgentInfoList(agentInfo); // List<BusAgentInfo> busAgentInfoList = agentInfoService.selectBusAgentInfoList(agentInfo);
List<String> list = busAgentInfoList.stream() // List<String> list = busAgentInfoList.stream()
.map(BusAgentInfo::getAgentAccount) // 抽取用户名属性 // .map(BusAgentInfo::getAgentAccount) // 抽取用户名属性
.collect(Collectors.toList()); // .collect(Collectors.toList());
list.add(SecurityUtils.getLoginUser().getUsername()); // list.add(SecurityUtils.getLoginUser().getUsername());
busIntegralRecord.setAgentAccount(list); // busIntegralRecord.setAgentAccount(list);
busIntegralRecord.setAccount(SecurityUtils.getLoginUser().getUsername());
} }
startPage(); startPage();
List<BusIntegralRecord> list = busIntegralRecordService.selectBusIntegralRecordListA(busIntegralRecord); List<BusIntegralRecord> list = busIntegralRecordService.selectBusIntegralRecordListA(busIntegralRecord);

View File

@ -1,7 +1,10 @@
package com.ruoyi.business.controller; package com.ruoyi.business.controller;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -42,7 +45,11 @@ public class BusOrderInfoController extends BaseController
public TableDataInfo list(BusOrderInfo busOrderInfo) public TableDataInfo list(BusOrderInfo busOrderInfo)
{ {
startPage(); startPage();
List<BusOrderInfo> list = busOrderInfoService.selectBusOrderInfoList(busOrderInfo); List<BusOrderInfo> list = new ArrayList<>();
if(StringUtils.isEmpty(busOrderInfo.getStoreCode())&&StringUtils.isEmpty(busOrderInfo.getOrderNo())){
return getDataTable(list);
}
list = busOrderInfoService.selectBusOrderInfoListA(busOrderInfo);
// list.forEach(System.out::println); // list.forEach(System.out::println);
return getDataTable(list); return getDataTable(list);
} }

View File

@ -44,4 +44,7 @@ public class ReqBusStoreInfo extends BaseEntity {
/** 店铺状态 */ /** 店铺状态 */
@ApiModelProperty(name = "店铺状态1正常2自配送3删除") @ApiModelProperty(name = "店铺状态1正常2自配送3删除")
private String selfDeliveryStatus; private String selfDeliveryStatus;
/** 回访渠道 */
@ApiModelProperty(name = "回访渠道")
private String marketingChannels;
} }

View File

@ -150,3 +150,8 @@ clientIP:
accountsecretKey: 2xib03rq8uqh15x230ea9emjasiu3exv accountsecretKey: 2xib03rq8uqh15x230ea9emjasiu3exv
secretId: ohrruf71orkzv9l9enhi secretId: ohrruf71orkzv9l9enhi
secretKey: bp4iyx52tc9oe46hj0lriyux2m6hpzvu secretKey: bp4iyx52tc9oe46hj0lriyux2m6hpzvu
eleme:
isSandbox: false
appKey: key
appSecret: secret

View File

@ -124,6 +124,14 @@
<artifactId>tencentcloud-sdk-java</artifactId> <artifactId>tencentcloud-sdk-java</artifactId>
</dependency> </dependency>
<dependency>
<groupId>me.ele.openapi</groupId>
<artifactId>eleme-openapi-sdk</artifactId>
<version>1.30.58</version>
<scope>system</scope>
<systemPath>${project.basedir}/../lib/eleme-openapi-sdk-1.30.58.jar</systemPath>
</dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
@ -152,5 +160,15 @@
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

View File

@ -0,0 +1,18 @@
package com.ruoyi.common.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class ElemeProperties {
@Value("${eleme.isSandbox}")
private String isSandbox;
@Value("${eleme.appKey}")
private String appKey;
@Value("${eleme.appSecret}")
private String appSecret;
}

View File

@ -118,6 +118,16 @@ public class BusStoreInfo extends BaseEntity
private BigDecimal price; private BigDecimal price;
private String marketingChannels;
public String getMarketingChannels() {
return marketingChannels;
}
public void setMarketingChannels(String marketingChannels) {
this.marketingChannels = marketingChannels;
}
public BigDecimal getPrice() { public BigDecimal getPrice() {
return price; return price;
} }

View File

@ -65,4 +65,5 @@ public interface BusOrderInfoMapper
List<BusOrderInfo> selectBusOrderInfoListToAi(@Param("storeCode") String storeCode, @Param("t1") String t1,@Param("t2") String t2); List<BusOrderInfo> selectBusOrderInfoListToAi(@Param("storeCode") String storeCode, @Param("t1") String t1,@Param("t2") String t2);
List<BusOrderInfo> selectBusZpsOrderInfoListToAi(@Param("storeCode") String storeCode, @Param("t2") String t2); List<BusOrderInfo> selectBusZpsOrderInfoListToAi(@Param("storeCode") String storeCode, @Param("t2") String t2);
List<BusOrderInfo> selectBusOrderInfoListA(BusOrderInfo busOrderInfo);
} }

View File

@ -62,4 +62,6 @@ public interface IBusOrderInfoService
List<BusOrderInfo> selectBusOrderInfoListToAi(String storeCode, String t1, String t2); List<BusOrderInfo> selectBusOrderInfoListToAi(String storeCode, String t1, String t2);
List<BusOrderInfo> selectBusZpsOrderInfoListToAi(String storeCode, String t2); List<BusOrderInfo> selectBusZpsOrderInfoListToAi(String storeCode, String t2);
List<BusOrderInfo> selectBusOrderInfoListA(BusOrderInfo busOrderInfo);
} }

View File

@ -360,7 +360,11 @@ public class AiServiceImpl implements IAiService {
List<BusFifteenInfo> listInfo = fifteenInfoService.selectBusFifteenInfoList(fifteenInfo); List<BusFifteenInfo> listInfo = fifteenInfoService.selectBusFifteenInfoList(fifteenInfo);
if (listInfo.size() == 0) { if (listInfo.size() == 0) {
System.out.println("话术:" + content + "; order" + busOrderInfo.toString()); System.out.println("话术:" + content + "; order" + busOrderInfo.toString());
sendAiTask(content,busOrderInfo); if("AI".equals(busStoreInfo.getMarketingChannels())){
sendAiTask(content,busOrderInfo);
}else{
sendSmsTask();
}
}else { }else {
BusAgentInfo busAgentInfo = agentInfoL.get(0); BusAgentInfo busAgentInfo = agentInfoL.get(0);
int a = 1; int a = 1;
@ -388,6 +392,9 @@ public class AiServiceImpl implements IAiService {
} }
} }
private void sendSmsTask() {
}
private void addAiTaskTest(String apiKey, String content, BusOrderInfo busOrderInfo) { private void addAiTaskTest(String apiKey, String content, BusOrderInfo busOrderInfo) {
// String apiKey = Optional.ofNullable(redisTemplate.opsForValue().get("apiKey")).orElse(null); // String apiKey = Optional.ofNullable(redisTemplate.opsForValue().get("apiKey")).orElse(null);
String phoneNo = busOrderInfo.getPrivcyPhone().split(",")[0]; String phoneNo = busOrderInfo.getPrivcyPhone().split(",")[0];

View File

@ -101,4 +101,9 @@ public class BusOrderInfoServiceImpl implements IBusOrderInfoService
return busOrderInfoMapper.selectBusZpsOrderInfoListToAi(storeCode, t2); return busOrderInfoMapper.selectBusZpsOrderInfoListToAi(storeCode, t2);
} }
@Override
public List<BusOrderInfo> selectBusOrderInfoListA(BusOrderInfo busOrderInfo) {
return busOrderInfoMapper.selectBusOrderInfoListA(busOrderInfo);
}
} }

View File

@ -63,7 +63,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectBusIntegralRecordListA" parameterType="BusIntegralRecord" resultMap="BusIntegralRecordResult"> <select id="selectBusIntegralRecordListA" parameterType="BusIntegralRecord" resultMap="BusIntegralRecordResult">
<include refid="selectBusIntegralRecordVo"/> <include refid="selectBusIntegralRecordVo"/>
<where> <where> update_type != '消耗账分'
<if test="account != null and account != ''"> and account = #{account}</if> <if test="account != null and account != ''"> and account = #{account}</if>
<if test="platform != null and platform != ''"> and platform = #{platform}</if> <if test="platform != null and platform != ''"> and platform = #{platform}</if>
<if test="updateType != null and updateType != ''"> and update_type = #{updateType}</if> <if test="updateType != null and updateType != ''"> and update_type = #{updateType}</if>
@ -76,7 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</if> </if>
</where> </where>
ORDER BY DATE_FORMAT(Integral_update_time,'%Y-%m-%d') desc ORDER BY Integral_update_time desc
</select> </select>
<select id="selectBusIntegralRecordById" parameterType="Long" resultMap="BusIntegralRecordResult"> <select id="selectBusIntegralRecordById" parameterType="Long" resultMap="BusIntegralRecordResult">
<include refid="selectBusIntegralRecordVo"/> <include refid="selectBusIntegralRecordVo"/>

View File

@ -64,6 +64,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="storeCode != null and storeCode != ''"> and a.store_code = #{storeCode}</if> <if test="storeCode != null and storeCode != ''"> and a.store_code = #{storeCode}</if>
<if test="t2 != null and t2 != ''"> and a.order_time &lt;= #{t2}</if> <if test="t2 != null and t2 != ''"> and a.order_time &lt;= #{t2}</if>
</select> </select>
<select id="selectBusOrderInfoListA" resultMap="BusOrderInfoResult">
select store_code, store_name, custom_id, order_no, min(id)
from bus_order_info
<where>
<if test="platformType != null and platformType != ''"> and platform_type = #{platformType}</if>
<if test="storeCode != null and storeCode != ''"> and store_code = #{storeCode}</if>
<if test="customId != null and customId != ''"> and custom_id = #{customId}</if>
<if test="orderNo != null and orderNo != ''"> and order_no = #{orderNo}</if>
</where>
group by store_code, store_name, custom_id, order_no
</select>
<insert id="batchInsertOrder"> <insert id="batchInsertOrder">
insert into bus_order_info (id,store_code,store_name,custom_id,order_no,order_status,complete_time,dayseq,order_count,order_time,is_phf) values insert into bus_order_info (id,store_code,store_name,custom_id,order_no,order_status,complete_time,dayseq,order_count,order_time,is_phf) values

View File

@ -59,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateId != null "> and update_id = #{updateId}</if> <if test="updateId != null "> and update_id = #{updateId}</if>
<if test="updateUser != null "> and update_user = #{updateUser}</if> <if test="updateUser != null "> and update_user = #{updateUser}</if>
<if test="selfDeliveryStatus != null and selfDeliveryStatus != ''"> and self_delivery_status = #{selfDeliveryStatus}</if> <if test="selfDeliveryStatus != null and selfDeliveryStatus != ''"> and self_delivery_status = #{selfDeliveryStatus}</if>
<if test="marketingChannels != null and marketingChannels != ''"> and marketing_channels = #{marketingChannels}</if>
<if test="returnVisitUserRange != null and returnVisitUserRange != ''"> and return_visit_user_range = #{returnVisitUserRange}</if> <if test="returnVisitUserRange != null and returnVisitUserRange != ''"> and return_visit_user_range = #{returnVisitUserRange}</if>
<if test="saleBindId != null "> and sale_bind_id = #{saleBindId}</if> <if test="saleBindId != null "> and sale_bind_id = #{saleBindId}</if>
<if test="saleBindName != null and saleBindName != ''"> and sale_bind_name like concat('%', #{saleBindName}, '%')</if> <if test="saleBindName != null and saleBindName != ''"> and sale_bind_name like concat('%', #{saleBindName}, '%')</if>

View File

@ -98,7 +98,21 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item></el-form-item> <el-form-item label="回访渠道" prop="marketingChannels">
<el-select
v-model="queryParams.marketingChannels"
placeholder="回访渠道"
clearable
style="width: 240px"
>
<el-option
v-for="dict in dict.type.bus_marketing_channels"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item> <el-form-item>
@ -367,7 +381,7 @@ import { listSaleA} from "@/api/business/sale";
export default { export default {
name: "Role", name: "Role",
dicts: ['sys_yes_no','sys_grant_status','sys_platform_type','sys_return_visit_status','bus_script_type'], dicts: ['sys_yes_no','sys_grant_status','sys_platform_type','sys_return_visit_status','bus_script_type','bus_marketing_channels'],
data() { data() {
return { return {
meituanUrl: "https://e.waimai.meituan.com?ABC="+this.$store.state.user.name+":1", meituanUrl: "https://e.waimai.meituan.com?ABC="+this.$store.state.user.name+":1",
@ -411,7 +425,8 @@ export default {
saleBindId: undefined, saleBindId: undefined,
grantStatus: undefined, grantStatus: undefined,
returnVisitStatus: undefined, returnVisitStatus: undefined,
selfDeliveryStatus: 2 selfDeliveryStatus: 2,
marketingChannels: 'AI'
}, },
saleList: [], saleList: [],
timeRange: undefined, timeRange: undefined,

View File

@ -98,7 +98,21 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item></el-form-item> <el-form-item label="回访渠道" prop="marketingChannels">
<el-select
v-model="queryParams.marketingChannels"
placeholder="回访渠道"
clearable
style="width: 240px"
>
<el-option
v-for="dict in dict.type.bus_marketing_channels"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item> <el-form-item>
@ -434,7 +448,7 @@ import { listSaleA} from "@/api/business/sale";
export default { export default {
name: "Role", name: "Role",
dicts: ['sys_yes_no','sys_grant_status','sys_platform_type','sys_return_visit_status','bus_script_type'], dicts: ['sys_yes_no','sys_grant_status','sys_platform_type','sys_return_visit_status','bus_script_type','bus_marketing_channels'],
data() { data() {
return { return {
meituanUrl: "https://e.waimai.meituan.com?ABC="+this.$store.state.user.name+":1", meituanUrl: "https://e.waimai.meituan.com?ABC="+this.$store.state.user.name+":1",
@ -481,7 +495,8 @@ export default {
saleBindId: undefined, saleBindId: undefined,
grantStatus: undefined, grantStatus: undefined,
returnVisitStatus: undefined, returnVisitStatus: undefined,
selfDeliveryStatus: 1 selfDeliveryStatus: 1,
marketingChannels: 'AI'
}, },
queryParams1: { queryParams1: {
content: undefined content: undefined

View File

@ -1,14 +1,14 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="分配账户" prop="account"> <!-- <el-form-item label="分配账户" prop="account">
<el-input <el-input
v-model="queryParams.account" v-model="queryParams.account"
placeholder="分配账户" placeholder="分配账户"
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item> -->
<el-form-item label="变更时间" prop="integralUpdateTime"> <el-form-item label="变更时间" prop="integralUpdateTime">
<el-date-picker clearable <el-date-picker clearable
v-model="queryParams.integralUpdateTime" v-model="queryParams.integralUpdateTime"

View File

@ -1,10 +1,10 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="标识" prop="storeCode"> <el-form-item label="店铺标识" prop="storeCode">
<el-input <el-input
v-model="queryParams.storeCode" v-model="queryParams.storeCode"
placeholder="请输入标识" placeholder="请输入店铺标识"
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
@ -39,7 +39,7 @@
<el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" /> <el-table-column label="ID" align="center" prop="id" />
<el-table-column label="标识" align="center" prop="storeCode" /> <el-table-column label="店铺标识" align="center" prop="storeCode" />
<el-table-column label="店铺名称" align="center" prop="storeName" /> <el-table-column label="店铺名称" align="center" prop="storeName" />
<el-table-column label="禁止运营标识" align="center" prop="banOperateCode" /> <el-table-column label="禁止运营标识" align="center" prop="banOperateCode" />
<el-table-column label="关联订单" align="center" prop="bindOrderCode" /> <el-table-column label="关联订单" align="center" prop="bindOrderCode" />
@ -72,7 +72,7 @@
/> />
<!-- 添加或修改免运营订单信息对话框 --> <!-- 添加或修改免运营订单信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
<el-form ref="form" :model="formParams" :rules="rules" label-width="80px"> <el-form ref="form" :model="formParams" :rules="rules" label-width="80px">
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
@ -80,14 +80,15 @@
<el-input v-model="formParams.orderNo" placeholder="请输入标识" /> <el-input v-model="formParams.orderNo" placeholder="请输入标识" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="8">
<el-form-item label="营销源标识:" prop="storeName" label-width="100px"> <el-form-item label="营销源标识:" prop="storeName" label-width="100px">
<el-input v-model="formParams.storeCode" placeholder="请输入店铺标识" /> <el-input v-model="formParams.storeCode" placeholder="请输入店铺标识" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="8">
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQueryFrom">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQueryFrom">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery1">重置</el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -95,7 +96,7 @@
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="源标识" align="center" prop="storeCode" /> <el-table-column label="源标识" align="center" prop="storeCode" />
<el-table-column label="源名称" align="center" prop="storeName" /> <el-table-column label="源名称" align="center" prop="storeName" />
<el-table-column label="禁止营销标识(用户标识" align="center" prop="customId" /> <el-table-column label="用户标识" align="center" prop="customId" />
<el-table-column label="关联订单" align="center" prop="orderNo" /> <el-table-column label="关联订单" align="center" prop="orderNo" />
</el-table> </el-table>
<pagination <pagination
@ -225,6 +226,15 @@ export default {
this.resetForm("queryForm"); this.resetForm("queryForm");
this.handleQuery(); this.handleQuery();
}, },
resetQuery1() {
this.formParams = {
pageNum: 1,
pageSize: 5,
storeCode: null,
orderNo: null
}
this.resetForm("form");
},
// //
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.id) this.ids = selection.map(item => item.id)