提交 8e645976 作者: 张小凤

AppletMsg(update)

上级 da73b547
...@@ -13,6 +13,23 @@ ...@@ -13,6 +13,23 @@
<dependencies> <dependencies>
<!-- 微信支付相关 -->
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.4.9</version>
</dependency>
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.10</version>
</dependency>
<!-- apache 提供的一些工具类 --> <!-- apache 提供的一些工具类 -->
<dependency> <dependency>
<groupId>commons-codec</groupId> <groupId>commons-codec</groupId>
......
package com.mmc.csf.infomation.vo;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/8/24 10:49
* @Version 1.0
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AppletMsgVOS implements Serializable {
private static final long serialVersionUID = 2124104608303700492L;
@ApiModelProperty(value = "openid")
@NotBlank
private String touser;
@ApiModelProperty(value = "模板ID")
@NotBlank
private String template_id;
@ApiModelProperty(value = "点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。")
private String page;
@ApiModelProperty(value = "模板内容")
private JSONObject data;
@ApiModelProperty(value = "跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版")
private String miniprogram_state;
@ApiModelProperty(value = "默认为zh_CN")
private String lang;
}
package com.mmc.csf.infomation.vo;
import com.wechat.pay.java.service.refund.model.GoodsDetail;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Author small
* @Date 2023/8/24 14:09
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ApplyRefundVO {
@ApiModelProperty(value = "商户订单号", required = true)
private String outTradeNo;
@ApiModelProperty(value = "退款原因")
private String reason;
@ApiModelProperty(value = "退款金额", required = true)
private Long refund;
@ApiModelProperty(value = "商品信息(可填可不填)")
private List<GoodsDetail> goodsDetail;
}
package com.mmc.csf.release.auth.dto; package com.mmc.csf.release.auth.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -7,23 +8,25 @@ import lombok.NoArgsConstructor; ...@@ -7,23 +8,25 @@ import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
/** /**
* @author 作者 geDuo * @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午8:06:14 * @version 创建时间:2021年8月31日 下午8:06:14
* @explain 类说明 * @explain 类说明
*/ */
@Builder @Builder
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class LoginSuccessDTO implements Serializable { public class LoginSuccessDTO implements Serializable {
private static final long serialVersionUID = -1200834589953161925L; private static final long serialVersionUID = -1200834589953161925L;
private String token; private String token;
private Integer userAccountId; private Integer userAccountId;
private String accountNo; private String accountNo;
private String uid; private String uid;
private String phoneNum; private String phoneNum;
private String userName; private String userName;
private String nickName; private String nickName;
@ApiModelProperty(value = "openid")
private String openid;
// private RoleInfoDTO roleInfo; // private RoleInfoDTO roleInfo;
} }
package com.mmc.csf.release.constant;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
/**
* @Author small
* @Date 2023/8/24 13:28
* @Version 1.0
*/
public class HttpsOpenUtil {
/**
* http请求
*
* @param url 发送请求的URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
* @category 向指定URL发送GET方法的请求
*/
public static String httpSendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
// for (String key : map.keySet()) {
// System.out.println(key + "--->" + map.get(key));
// }
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* http请求
*
* @param url 发送请求的 URL
* @return 所代表远程资源的响应结果
* @category 向指定URL 发送POST方法的请求
*/
public static String httpSendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
package com.mmc.csf.release.constant;
import com.alibaba.fastjson.JSONObject;
import com.mmc.csf.common.util.json.JsonUtil;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Map;
/**
* @Author small
* @Date 2023/8/24 13:27
* @Version 1.0
*/
public class WxApiUtilS {
// 与接口配置信息中的Token要一致
private static final String token = "MMCDingYueHaoToken2020";
public static boolean checkSignature(String signature, String timestrap, String nonce) {
String[] arr = new String[]{token, timestrap, nonce};
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuffer buf = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
buf.append(arr[i]);
}
String temp = getSha1(buf.toString());
return temp.equals(signature);
}
public static String getSha1(String str) {
if (null == str || str.length() == 0) {
return null;
}
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char[] buf = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byTemp = md[i];
buf[k++] = hexDigits[byTemp >>> 4 & 0xf];
buf[k++] = hexDigits[byTemp & 0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
/**
* 截取模板长度
*/
public static JSONObject buildMsgJson(JSONObject jsonObject) {
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
if (entry.getKey().startsWith("thing") && entry.getValue() != null) {
String json = JsonUtil.parseObjToJson(entry.getValue());
JSONObject obj = JSONObject.parseObject(json);
String str = obj.getString("value");
if (str.length() > 20) {
obj.put("value", str.substring(0, 17) + "...");
entry.setValue(obj);
}
}
if (entry.getKey().startsWith("phrase") && entry.getValue() != null) {
String json = JsonUtil.parseObjToJson(entry.getValue());
JSONObject obj = JSONObject.parseObject(json);
String str = obj.getString("value");
if (str.length() > 5) {
obj.put("value", str.substring(0, 5));
entry.setValue(obj);
}
}
if (entry.getKey().startsWith("character_string") && entry.getValue() != null) {
String json = JsonUtil.parseObjToJson(entry.getValue());
JSONObject obj = JSONObject.parseObject(json);
String str = obj.getString("value");
if (str.length() > 32) {
obj.put("value", str.substring(0, 29) + "...");
entry.setValue(obj);
}
}
}
return jsonObject;
}
}
package com.mmc.csf.release.constant;
/**
* @Author small
* @Date 2023/8/24 13:29
* @Version 1.0
*/
public class WxMsgTemplete {
public static final String INDEMNIFY_FOR_PUBLICATION = "0C9uqQymP4k4qiYRA4r-sEHXti_yd3PjHjGMezuGOtc";
}
...@@ -215,7 +215,7 @@ public class RequirementsController extends BaseController { ...@@ -215,7 +215,7 @@ public class RequirementsController extends BaseController {
@PostMapping("droneFlyerCancel") @PostMapping("droneFlyerCancel")
public ResultBody droneFlyerCancel(HttpServletRequest request, @ApiParam(value = "发布服务需求id", required = true) @RequestParam Integer requirementsInfoId) { public ResultBody droneFlyerCancel(HttpServletRequest request, @ApiParam(value = "发布服务需求id", required = true) @RequestParam Integer requirementsInfoId) {
Integer userAccountId = this.getUserLoginInfoFromRedis(request).getUserAccountId(); Integer userAccountId = this.getUserLoginInfoFromRedis(request).getUserAccountId();
return requirementsService.droneFlyerCancel(requirementsInfoId, userAccountId); return requirementsService.droneFlyerCancel(requirementsInfoId, userAccountId, request);
} }
@ApiOperation(value = "new——小程序-—发布者单方便取消订单") @ApiOperation(value = "new——小程序-—发布者单方便取消订单")
...@@ -223,7 +223,7 @@ public class RequirementsController extends BaseController { ...@@ -223,7 +223,7 @@ public class RequirementsController extends BaseController {
@PostMapping("publisherCancel") @PostMapping("publisherCancel")
public ResultBody publisherCancel(HttpServletRequest request, @ApiParam(value = "发布服务需求id", required = true) @RequestParam Integer requirementsInfoId) { public ResultBody publisherCancel(HttpServletRequest request, @ApiParam(value = "发布服务需求id", required = true) @RequestParam Integer requirementsInfoId) {
Integer userAccountId = this.getUserLoginInfoFromRedis(request).getUserAccountId(); Integer userAccountId = this.getUserLoginInfoFromRedis(request).getUserAccountId();
return requirementsService.publisherCancel(requirementsInfoId, userAccountId); return requirementsService.publisherCancel(requirementsInfoId, userAccountId, request);
} }
@ApiOperation(value = "new——小程序-—结算:发布者修改任务佣金") @ApiOperation(value = "new——小程序-—结算:发布者修改任务佣金")
......
...@@ -119,6 +119,19 @@ public class RequirementsInfoDO implements Serializable { ...@@ -119,6 +119,19 @@ public class RequirementsInfoDO implements Serializable {
@ApiModelProperty(value = "原因url") @ApiModelProperty(value = "原因url")
private String url; private String url;
@ApiModelProperty(value = "微信支付订单编号")
private String wechatPayOrderNumber;
@ApiModelProperty(value = "发布者支付任务佣金 佣金金额")
private BigDecimal cashAmount;
private BigDecimal weChat;
private BigDecimal salaryAmount;
public RequirementsInfoVO buildRequirementsInfoVO() { public RequirementsInfoVO buildRequirementsInfoVO() {
return RequirementsInfoVO.builder().id(this.id).requirementTypeId(this.requirementTypeId).userAccountId(this.userAccountId).publishName(this.publishName) return RequirementsInfoVO.builder().id(this.id).requirementTypeId(this.requirementTypeId).userAccountId(this.userAccountId).publishName(this.publishName)
......
package com.mmc.csf.release.entity.requirements; package com.mmc.csf.release.entity.requirements;
import com.alibaba.fastjson.annotation.JSONField;
import com.mmc.csf.config.IsNullConvertZero; import com.mmc.csf.config.IsNullConvertZero;
import com.mmc.csf.infomation.dto.PilotCertificationInteriorDTO; import com.mmc.csf.infomation.dto.PilotCertificationInteriorDTO;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
...@@ -9,6 +10,7 @@ import lombok.NoArgsConstructor; ...@@ -9,6 +10,7 @@ import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/** /**
* @Author small * @Author small
...@@ -59,6 +61,18 @@ public class RequirementsServiceDO implements Serializable { ...@@ -59,6 +61,18 @@ public class RequirementsServiceDO implements Serializable {
@ApiModelProperty(value = "任务流程id", example = "任务流程id") @ApiModelProperty(value = "任务流程id", example = "任务流程id")
private Integer serviceFlowId; private Integer serviceFlowId;
@ApiModelProperty(value = "发布者用户id")
private Integer userAccountId;
@ApiModelProperty(value = "订单编号")
private String publisherNumber;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "任务佣金")
private BigDecimal percentagePenaltyOfOrder;
@ApiModelProperty(value = "发布者订单的任务佣金")
private BigDecimal orderAmount;
@ApiModelProperty(value = "抢单者openid")
private String openid;
public RequirementsServiceDO(PilotCertificationInteriorDTO pilot, ServiceRequirementsDO requirementsInfoDO) { public RequirementsServiceDO(PilotCertificationInteriorDTO pilot, ServiceRequirementsDO requirementsInfoDO) {
this.pilotCertificationId = pilot.getId(); this.pilotCertificationId = pilot.getId();
......
...@@ -134,6 +134,8 @@ public class ServiceRequirementsDO { ...@@ -134,6 +134,8 @@ public class ServiceRequirementsDO {
@ApiModelProperty(value = "置顶/加急 云享金支付多少", example = "100") @ApiModelProperty(value = "置顶/加急 云享金支付多少", example = "100")
@IsNullConvertZero @IsNullConvertZero
private BigDecimal levelCashAmount; private BigDecimal levelCashAmount;
@ApiModelProperty(value = "openid")
private String openid;
public ServiceRequirementsDO(ServiceRequirementsVO serviceRequirementsVO) { public ServiceRequirementsDO(ServiceRequirementsVO serviceRequirementsVO) {
......
...@@ -95,9 +95,9 @@ public interface RequirementsService { ...@@ -95,9 +95,9 @@ public interface RequirementsService {
PageResult myPreempt(Integer userAccountId, MyPreemptQO param); PageResult myPreempt(Integer userAccountId, MyPreemptQO param);
ResultBody droneFlyerCancel(Integer requirementsInfoId, Integer userAccountId); ResultBody droneFlyerCancel(Integer requirementsInfoId, Integer userAccountId, HttpServletRequest request);
ResultBody publisherCancel(Integer requirementsInfoId, Integer userAccountId); ResultBody publisherCancel(Integer requirementsInfoId, Integer userAccountId, HttpServletRequest request);
ResultBody cancelAll(Integer requirementsInfoId, Integer userAccountId); ResultBody cancelAll(Integer requirementsInfoId, Integer userAccountId);
......
...@@ -149,6 +149,8 @@ iuav: ...@@ -149,6 +149,8 @@ iuav:
url: http://pms-svc:8099 url: http://pms-svc:8099
omsapp: omsapp:
url: https://test.iuav.shop/oms/ url: https://test.iuav.shop/oms/
payment:
url: https://test.iuav.shop
#mmc: #mmc:
......
...@@ -147,6 +147,8 @@ iuav: ...@@ -147,6 +147,8 @@ iuav:
url: http://pms-svc:8099 url: http://pms-svc:8099
omsapp: omsapp:
url: https://www.iuav.shop/oms/ url: https://www.iuav.shop/oms/
payment:
url: https://www.iuav.shop
#mmc: #mmc:
# appid: 80001 # appid: 80001
......
...@@ -293,11 +293,11 @@ ...@@ -293,11 +293,11 @@
require_description, create_time, require_description, create_time,
update_time, task_start_time, task_end_time, task_address, longitude, update_time, task_start_time, task_end_time, task_address, longitude,
latitude, publisher_number, insurance, publish, latitude, publisher_number, insurance, publish,
service_flow_id, adcode, order_level_amount) service_flow_id, adcode, order_level_amount, openid)
VALUES (#{serviceId}, #{userAccountId}, #{publishName}, #{publishPhone}, VALUES (#{serviceId}, #{userAccountId}, #{publishName}, #{publishPhone},
#{requireDescription}, NOW(), #{requireDescription}, NOW(),
NOW(), #{taskStartTime}, #{taskEndTime}, #{taskAddress}, #{longitude}, NOW(), #{taskStartTime}, #{taskEndTime}, #{taskAddress}, #{longitude},
#{latitude}, #{publisherNumber}, #{insurance}, 1, 1, #{adcode}, #{orderLevelAmount}); #{latitude}, #{publisherNumber}, #{insurance}, 1, 1, #{adcode}, #{orderLevelAmount}, #{openid});
</insert> </insert>
<insert id="addAmount" parameterType="com.mmc.csf.release.entity.requirements.RequirementsAmountDO" <insert id="addAmount" parameterType="com.mmc.csf.release.entity.requirements.RequirementsAmountDO"
...@@ -355,10 +355,10 @@ ...@@ -355,10 +355,10 @@
INSERT INTO requirements_service(requirements_info_id, pilot_certification_id, INSERT INTO requirements_service(requirements_info_id, pilot_certification_id,
pilot_certification_user_id, team_id, team_user_id, cash_amount, we_chat, pilot_certification_user_id, team_id, team_user_id, cash_amount, we_chat,
salary_amount, salary_amount,
wechat_pay_order_number, service_flow_id, preempt_total_amount) wechat_pay_order_number, service_flow_id, preempt_total_amount, openid)
VALUES (#{requirementsInfoId}, #{pilotCertificationId}, #{pilotCertificationUserId}, VALUES (#{requirementsInfoId}, #{pilotCertificationId}, #{pilotCertificationUserId},
#{teamId}, #{teamUserId}, #{cashAmount}, #{weChat}, #{salaryAmount}, #{wechatPayOrderNumber}, 2, #{teamId}, #{teamUserId}, #{cashAmount}, #{weChat}, #{salaryAmount}, #{wechatPayOrderNumber}, 2,
#{preemptTotalAmount}); #{preemptTotalAmount}, #{openid});
</insert> </insert>
<insert id="arriveAtTheScene" parameterType="com.mmc.csf.release.entity.requirements.ServiceArriveSceneDO" <insert id="arriveAtTheScene" parameterType="com.mmc.csf.release.entity.requirements.ServiceArriveSceneDO"
...@@ -379,7 +379,7 @@ ...@@ -379,7 +379,7 @@
UPDATE requirements_info UPDATE requirements_info
set service_flow_id=#{serviceFlowId}, set service_flow_id=#{serviceFlowId},
update_time=NOW() update_time=NOW()
where requirements_info_id = #{requirementsInfoId} where id = #{requirementsInfoId}
</update> </update>
<select id="arriveAtTheSceneDetails" resultType="com.mmc.csf.release.entity.requirements.ServiceArriveSceneDO"> <select id="arriveAtTheSceneDetails" resultType="com.mmc.csf.release.entity.requirements.ServiceArriveSceneDO">
...@@ -560,8 +560,9 @@ ...@@ -560,8 +560,9 @@
ri.publish_phone, ri.publish_phone,
ri.publisher_number, ri.publisher_number,
ri.service_id, ri.service_id,
ri.total_amount, ra.total_amount,
ri.insurance, ri.insurance,
rs.create_time,
sf.doing, sf.doing,
sf.waiting, sf.waiting,
sf.user_port, sf.user_port,
...@@ -569,19 +570,22 @@ ...@@ -569,19 +570,22 @@
sf.order_status, sf.order_status,
ri.publish, ri.publish,
rs.preempt_total_amount, rs.preempt_total_amount,
rs.cash_amount, ra.cash_amount,
rs.we_chat, ra.we_chat,
rs.salary_amount, ra.salary_amount,
rs.wechat_pay_order_number, rs.wechat_pay_order_number,
rs.preempt_total_amount, rs.preempt_total_amount,
rs.service_flow_id rs.service_flow_id,
ra.order_amount,
ri.openid
FROM requirements_info ri FROM requirements_info ri
LEFT JOIN requirements_type rt LEFT JOIN requirements_type rt
ON rt.id = ri.requirement_type_id ON rt.id = ri.requirement_type_id
LEFT JOIN service_flow sf ON sf.id = ri.service_flow_id LEFT JOIN service_flow sf ON sf.id = ri.service_flow_id
LEFT JOIN requirements_amount ra ON ra.requirements_info_id = ri.id
INNER JOIN requirements_service rs ON ri.id = rs.requirements_info_id INNER JOIN requirements_service rs ON ri.id = rs.requirements_info_id
WHERE rs.pilot_certification_user_id = #{userAccountId} WHERE rs.pilot_certification_user_id = #{userAccountId}
and rs.requirements_info_id = #{requirementsInfoId} AND rs.requirements_info_id = #{requirementsInfoId}
</select> </select>
<select id="publisherCancel" resultType="com.mmc.csf.release.entity.requirements.RequirementsInfoDO"> <select id="publisherCancel" resultType="com.mmc.csf.release.entity.requirements.RequirementsInfoDO">
...@@ -600,19 +604,29 @@ ...@@ -600,19 +604,29 @@
ri.publish_phone, ri.publish_phone,
ri.publisher_number, ri.publisher_number,
ri.service_id, ri.service_id,
ri.total_amount, ra.total_amount,
ri.insurance, ri.insurance,
ri.order_level, ra.order_level,
ri.order_amount, ra.order_amount,
sf.doing, sf.doing,
sf.waiting, sf.waiting,
sf.user_port, sf.user_port,
sf.flyer_port, sf.flyer_port,
sf.order_status, sf.order_status,
ri.publish ri.publish,
ra.order_amount,
ra.we_chat,
ra.salary_amount,
ra.cash_amount,
ra.level_cash_amount,
ra.level_salary_amount,
ra.level_we_chat_amount,
ra.wechat_pay_order_number,
ri.service_flow_id
FROM requirements_info ri FROM requirements_info ri
LEFT JOIN requirements_type rt ON rt.id = ri.requirement_type_id LEFT JOIN requirements_type rt ON rt.id = ri.requirement_type_id
LEFT JOIN service_flow sf ON sf.id = ri.service_flow_id LEFT JOIN service_flow sf ON sf.id = ri.service_flow_id
LEFT JOIN requirements_amount ra ON ra.requirements_info_id = ri.id
WHERE ri.user_account_id = #{userAccountId} WHERE ri.user_account_id = #{userAccountId}
AND ri.id = #{requirementsInfoId} AND ri.id = #{requirementsInfoId}
</select> </select>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论