refundTmcHelper.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using BizCom;
  2. using SQLData;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Newtonsoft.Json;
  9. using Newtonsoft.Json.Linq;
  10. using SiteCore;
  11. using SiteCore.taoObj;
  12. using static SiteCore.taoObj.Trade_fullinfo_get_response_Obj;
  13. using System.Data;
  14. using static SiteCore.taoObj.Api_tmc_refund_info_Obj;
  15. using NHibernate.Mapping;
  16. using SiteCore.Handler;
  17. using Utils.Serialization;
  18. using SiteCore.taobao;
  19. //status可选值:
  20. //* TRADE_NO_CREATE_PAY(没有创建支付宝交易)
  21. //* WAIT_BUYER_PAY(等待买家付款)
  22. //* SELLER_CONSIGNED_PART(卖家部分发货)
  23. //* WAIT_SELLER_SEND_GOODS(等待卖家发货, 即:买家已付款)
  24. //* WAIT_BUYER_CONFIRM_GOODS(等待买家确认收货, 即:卖家已发货)
  25. //* TRADE_BUYER_SIGNED(买家已签收, 货到付款专用)
  26. //* TRADE_FINISHED(交易成功)
  27. //* TRADE_CLOSED(付款以后用户退款成功,交易自动关闭)
  28. //* TRADE_CLOSED_BY_TAOBAO(付款以前,卖家或买家主动关闭交易)
  29. //* PAY_PENDING(国际信用卡支付付款确认中)
  30. //* WAIT_PRE_AUTH_CONFIRM(0元购合约中)
  31. namespace SiteCore
  32. {
  33. /// <summary>
  34. /// 同步推送处理
  35. /// </summary>
  36. public class refundTmcHelper
  37. {
  38. public static int RemoveEmptyEntries { get; private set; }
  39. public static string GetUTF8String(byte[] buffer)
  40. {
  41. if (buffer == null)
  42. return null;
  43. if (buffer.Length <= 3)
  44. {
  45. return Encoding.UTF8.GetString(buffer);
  46. }
  47. byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };
  48. if (buffer[0] == bomBuffer[0] && buffer[1] == bomBuffer[1] && buffer[2] == bomBuffer[2])
  49. {
  50. return new UTF8Encoding(false).GetString(buffer, 3, buffer.Length - 3);
  51. }
  52. return Encoding.UTF8.GetString(buffer);
  53. }
  54. public static string GetNoNullValue_string(string value)
  55. {
  56. value = value.Replace("\n", " ");
  57. value = value.Replace("\r", " ");
  58. if (value == null)
  59. {
  60. return "";
  61. }
  62. return value;
  63. }
  64. public static string GetNull_tostring(object value)
  65. {
  66. if (value == null)
  67. {
  68. return "";
  69. }
  70. return value.ToString();
  71. }
  72. // 时间戳转为C#格式时间
  73. public static DateTime StampToDateTime(string timeStamp)
  74. {
  75. DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  76. long lTime = long.Parse(timeStamp + "0000");
  77. TimeSpan toNow = new TimeSpan(lTime);
  78. return dateTimeStart.Add(toNow);
  79. }
  80. public static void Api_TmcRefundMsg(string res)
  81. {
  82. Api_tmc_refund_info_Obj refundFullObj = null;
  83. if (res == "") return;
  84. try
  85. {
  86. res = GetUTF8String(Encoding.UTF8.GetBytes(res));
  87. //res = res.Replace(" ", "");
  88. refundFullObj = JsonConvert.DeserializeObject<Api_tmc_refund_info_Obj>(res);
  89. if (refundFullObj == null)
  90. {
  91. Console.WriteLine("Api_tmc_refund_info_Obj isNull");
  92. XLog.SaveLog(0, "Api_tmc_refund_info_Obj isNull");
  93. return;
  94. }
  95. Content tObj = refundFullObj.content;
  96. CeErpTrade trade = CeErpTrade.Get(tObj.refOid);
  97. commonHelper.sendOrderInfo(trade.tid, "", trade.buyer_id, trade.buyer_nick, 1);
  98. if (trade != null)
  99. {
  100. try
  101. {
  102. //apiDesign.API_GetPrintData_Refund(CeErpTradeCell.GetByTid(tObj.refOid));//退款同步设计师系统
  103. }
  104. catch (Exception ex)
  105. {
  106. XLog.SaveLog(0, res + "|refund|1|" + ex.Message + "退款同步设计师系统失败");
  107. }
  108. //先判断有没有创建退款订单。多退款可以有数据
  109. CeErpTradeRefund refund = CeErpTradeRefund.GetByTidAndReId(tObj.refOid, tObj.refAid);
  110. LogHelper.addLog(tObj.refOid, 0, "客户退款", 0);
  111. if (refund == null)
  112. {
  113. refund = new CeErpTradeRefund();
  114. refund.refund_id = tObj.refAid;
  115. refund.tid = tObj.refOid;
  116. //refund.oid = item.oid;
  117. if (tObj.createTime != null && tObj.createTime.Length > 0)
  118. {
  119. refund.created = StampToDateTime(tObj.createTime);
  120. }
  121. if (tObj.updateTime != null && tObj.updateTime.Length > 0)
  122. {
  123. refund.modified = StampToDateTime(tObj.updateTime);
  124. }
  125. refund.status = tObj.status;
  126. refund.order_status = tObj.orderStatus;
  127. refund.payment = trade.payment.ToString();
  128. refund.refund_fee = tObj.refundFee;//退款金额
  129. refund.buyer_nick = GetNull_tostring(tObj.openBuyerNick);
  130. refund.seller_nick = trade.seller_nick;
  131. refund.total_fee = tObj.totalFee;
  132. refund.RefundState = 1;
  133. refund.reason = tObj.reason;
  134. refund.refundDesc = tObj.desc;
  135. if (Convert.ToDouble(refund.payment) - Convert.ToDouble(refund.refund_fee) > 0.01)
  136. {
  137. /*refund.IsPartRefund = 1;*/
  138. }
  139. refund.Create();
  140. try
  141. {
  142. StringBuilder CeErpTradeCellSql = new StringBuilder();
  143. CeErpTradeCellSql.AppendFormat("select * from CE_ErpTradeCell where tid='{0}';", trade.tid);
  144. DataSet data = DbHelper.DbConn.ExecuteDataset(CeErpTradeCellSql.ToString());
  145. DataTable datatable = data.Tables[0];
  146. if (datatable.Rows.Count > 0)
  147. {
  148. foreach (DataRow dr in datatable.Rows)
  149. {
  150. int DesignUserId = Convert.ToInt32(dr["DesignUserId"]);
  151. int OrderState = Convert.ToInt32(dr["OrderState"]);
  152. int CustomerUserId = Convert.ToInt32(dr["CustomerUserId"]);
  153. if (DesignUserId > 0 && OrderState == 4)
  154. {
  155. CeErpMessageTip ceErpMessageTip = new CeErpMessageTip();
  156. ceErpMessageTip.tid = dr["ctid"].ToString();
  157. ceErpMessageTip.type = Convert.ToInt32(MessageState.订单退款);
  158. ceErpMessageTip.userId = DesignUserId;
  159. ceErpMessageTip.isVisit = false;
  160. ceErpMessageTip.content = "订单" + dr["ctid"] + "申请了退款!";
  161. ceErpMessageTip.Create();
  162. StringBuilder sqlTip = new StringBuilder();
  163. sqlTip.AppendFormat(" select top 1 B.id from view_ErpUser A JOIN view_ErpUser b ON a.OrgID = B.OrgID and b.PostName Like '设计主管%' WHERE A.ID = '{0}';", DesignUserId);
  164. DataTable dth = DbHelper.DbConn.ExecuteDataset(sqlTip.ToString()).Tables[0];
  165. if (dth.Rows.Count > 0)
  166. {
  167. foreach (DataRow dthdr in dth.Rows)
  168. {
  169. int Bid = Convert.ToInt32(dthdr["id"]);
  170. if (Bid > 0)
  171. {
  172. CeErpMessageTip ceErpMessageTipB = new CeErpMessageTip();
  173. ceErpMessageTipB.tid = dr["ctid"].ToString();
  174. ceErpMessageTipB.type = Convert.ToInt32(MessageState.订单退款);
  175. ceErpMessageTipB.userId = Bid;
  176. ceErpMessageTipB.isVisit = false;
  177. ceErpMessageTipB.content = "订单" + dr["ctid"] + "申请了退款!";
  178. ceErpMessageTipB.Create();
  179. }
  180. }
  181. }
  182. }
  183. else if (CustomerUserId > 0)
  184. {
  185. CeErpMessageTip ceErpMessageTip = new CeErpMessageTip();
  186. ceErpMessageTip.tid = dr["ctid"].ToString();
  187. ceErpMessageTip.type = Convert.ToInt32(MessageState.订单退款);
  188. ceErpMessageTip.userId = CustomerUserId;
  189. ceErpMessageTip.isVisit = false;
  190. ceErpMessageTip.content = "订单" + dr["ctid"] + "申请了退款!";
  191. ceErpMessageTip.Create();
  192. StringBuilder sqlTip = new StringBuilder();
  193. sqlTip.AppendFormat(" select top 1 B.id from view_ErpUser A JOIN view_ErpUser b ON a.OrgID = B.OrgID and b.PostName Like '店长%' WHERE A.ID = '{0}';", CustomerUserId);
  194. DataTable dth = DbHelper.DbConn.ExecuteDataset(sqlTip.ToString()).Tables[0];
  195. if (dth.Rows.Count > 0)
  196. {
  197. foreach (DataRow dthdr in dth.Rows)
  198. {
  199. int Bid = Convert.ToInt32(dthdr["id"]);
  200. if (Bid > 0)
  201. {
  202. CeErpMessageTip ceErpMessageTipB = new CeErpMessageTip();
  203. ceErpMessageTipB.tid = dr["ctid"].ToString();
  204. ceErpMessageTipB.type = Convert.ToInt32(MessageState.订单退款);
  205. ceErpMessageTipB.userId = Bid;
  206. ceErpMessageTipB.isVisit = false;
  207. ceErpMessageTipB.content = "订单" + dr["ctid"] + "申请了退款!";
  208. ceErpMessageTipB.Create();
  209. }
  210. }
  211. }
  212. }
  213. }
  214. }
  215. }
  216. catch (Exception ex)
  217. {
  218. XLog.SaveLog(0, "退款推送通知创建失败!!" + ex);
  219. }
  220. int rstate = commonHelper.getRefundTagByState(tObj.status);
  221. StringBuilder sql = new StringBuilder();
  222. if (refund.IsPartRefund == 1)
  223. {
  224. double paylast = trade.payment - Convert.ToDouble(refund.refund_fee);
  225. sql.AppendFormat("update CE_ErpTradeCell with(rowlock) set IsRefund={1},payment={2},UpdateTime = getdate() where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, 3, paylast);
  226. }
  227. else
  228. sql.AppendFormat("update CE_ErpTradeCell with(rowlock) set IsRefund={1},UpdateTime = getdate() where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, rstate);
  229. CeErpTradeRefund.ExecuteNonQuery(sql.ToString());
  230. string rstateWord = commonHelper.getRefundStringByState(tObj.status);
  231. //commonHelper.UpdateRefundOrderState(tObj.refOid, rstate);
  232. StringBuilder sqls = new StringBuilder();
  233. sqls.AppendFormat("update CE_ErpDesignerBill set isDel = 1 where tid = '{0}'", tObj.refOid);
  234. CeErpDesignerBill.ExecuteNonQuery(sqls.ToString());
  235. LogHelper.addDesignerBillLog(tObj.refOid, 0, "客户退款", "系统自动", 0);
  236. }
  237. else
  238. {
  239. if (refund.status != tObj.status)
  240. {
  241. refund.modified = DateTime.Now;
  242. if (tObj.updateTime != null && tObj.updateTime.Length > 0)
  243. {
  244. refund.modified = StampToDateTime(tObj.updateTime);
  245. }
  246. refund.order_status = tObj.orderStatus;
  247. refund.status = tObj.status;
  248. refund.Update();
  249. int rstate = commonHelper.getRefundTagByState(tObj.status);
  250. string rstateWord = commonHelper.getRefundStringByState(tObj.status);
  251. StringBuilder sql = new StringBuilder();
  252. sql.AppendFormat("update CE_ErpTradeCell with(rowlock) set IsRefund={0} where tid='{1}' and isAfterSaleOrder=0;", rstate, tObj.refOid);
  253. CeErpTradeRefund.ExecuteNonQuery(sql.ToString());
  254. //commonHelper.UpdateRefundOrderState(tObj.refOid, rstate);
  255. LogHelper.addLog(tObj.refOid, 0, "更新退款状态:" + rstateWord, (int)OrderState.交易关闭);
  256. // 取消设计费
  257. StringBuilder sqls = new StringBuilder();
  258. sqls.AppendFormat("update CE_ErpDesignerBill set isDel = 1 where tid = '{0}'", tObj.refOid);
  259. CeErpDesignerBill.ExecuteNonQuery(sqls.ToString());
  260. LogHelper.addDesignerBillLog(tObj.refOid, 0, "客户退款", "系统自动", 0);
  261. }
  262. }
  263. List<Api_tmc_refund_info_Obj.Lines> goodsItems = tObj.lines;
  264. foreach (Api_tmc_refund_info_Obj.Lines item in goodsItems)
  265. {
  266. CeErpTradeOrder goods = CeErpTradeOrder.GetByOid(item.refOlId);
  267. if (goods != null)
  268. {
  269. goods.refund_status = item.refundStatus;
  270. goods.Update();
  271. }
  272. }
  273. if (tObj.status == "WAIT_SELLER_AGREE")
  274. {
  275. StringBuilder sql = new StringBuilder();
  276. sql.AppendFormat("update ce_erptradecell with(rowlock) set isrefund={1} where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, 1);
  277. DbHelper.DbConn.ExecuteNonQuery(sql.ToString());
  278. designHelper.API_refundOrder(tObj.refOid, "refundIng", tObj.reason);
  279. LogHelper.addLog(tObj.refOid, 0, "申请退款中", 0);
  280. }
  281. else if (tObj.status == "CLOSED")
  282. {
  283. StringBuilder sql = new StringBuilder();
  284. sql.AppendFormat("update ce_erptradecell with(rowlock) set isrefund={1} where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, 0);
  285. DbHelper.DbConn.ExecuteNonQuery(sql.ToString());
  286. designHelper.API_refundOrder(tObj.refOid, "refundCancel", tObj.reason);
  287. LogHelper.addLog(tObj.refOid, 0, "关闭申请退款中", 0);
  288. }
  289. else if (tObj.status == "REFUNDED" || tObj.status == "SUCCESS")
  290. {
  291. designHelper.API_refundOrder(tObj.refOid, "refundEd", tObj.reason);
  292. }
  293. }
  294. else
  295. {
  296. CeErpSpecialRefund ceErpSpecialRefund = new CeErpSpecialRefund();
  297. ceErpSpecialRefund.refoid = tObj.refOid;
  298. ceErpSpecialRefund.refxml = res;
  299. ceErpSpecialRefund.whethernotify = 0;
  300. ceErpSpecialRefund.Create();
  301. XLog.SaveLog(0, tObj.refOid + "退款推送没有找到对应的订单!!");
  302. }
  303. }
  304. catch (Exception ex)
  305. {
  306. XLog.SaveLog(0, res + "|refund|1|" + ex.Message);
  307. }
  308. }
  309. }
  310. }