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. if (trade != null)
  98. {
  99. try
  100. {
  101. apiDesign.API_GetPrintData_Refund(CeErpTradeCell.GetByTid(tObj.refOid));//退款同步设计师系统
  102. }
  103. catch (Exception ex)
  104. {
  105. XLog.SaveLog(0, res + "|refund|1|" + ex.Message + "退款同步设计师系统失败");
  106. }
  107. //先判断有没有创建退款订单。多退款可以有数据
  108. CeErpTradeRefund refund = CeErpTradeRefund.GetByTidAndReId(tObj.refOid, tObj.refAid);
  109. LogHelper.addLog(tObj.refOid, 0, "客户退款", 0);
  110. if (refund == null)
  111. {
  112. refund = new CeErpTradeRefund();
  113. refund.refund_id = tObj.refAid;
  114. refund.tid = tObj.refOid;
  115. //refund.oid = item.oid;
  116. if (tObj.createTime != null && tObj.createTime.Length > 0)
  117. {
  118. refund.created = StampToDateTime(tObj.createTime);
  119. }
  120. if (tObj.updateTime != null && tObj.updateTime.Length > 0)
  121. {
  122. refund.modified = StampToDateTime(tObj.updateTime);
  123. }
  124. refund.status = tObj.status;
  125. refund.order_status = tObj.orderStatus;
  126. refund.payment = trade.payment.ToString();
  127. refund.refund_fee = tObj.refundFee;//退款金额
  128. refund.buyer_nick = GetNull_tostring(tObj.openBuyerNick);
  129. refund.seller_nick = trade.seller_nick;
  130. refund.total_fee = tObj.totalFee;
  131. refund.RefundState = 1;
  132. refund.reason = tObj.reason;
  133. refund.refundDesc = tObj.desc;
  134. if (Convert.ToDouble(refund.payment) - Convert.ToDouble(refund.refund_fee) > 0.01)
  135. {
  136. /*refund.IsPartRefund = 1;*/
  137. }
  138. refund.Create();
  139. try
  140. {
  141. StringBuilder CeErpTradeCellSql = new StringBuilder();
  142. CeErpTradeCellSql.AppendFormat("select * from CE_ErpTradeCell where tid='{0}';", trade.tid);
  143. DataSet data = DbHelper.DbConn.ExecuteDataset(CeErpTradeCellSql.ToString());
  144. DataTable datatable = data.Tables[0];
  145. if (datatable.Rows.Count > 0)
  146. {
  147. foreach (DataRow dr in datatable.Rows)
  148. {
  149. int DesignUserId = Convert.ToInt32(dr["DesignUserId"]);
  150. int OrderState = Convert.ToInt32(dr["OrderState"]);
  151. int CustomerUserId = Convert.ToInt32(dr["CustomerUserId"]);
  152. if (DesignUserId > 0 && OrderState == 4)
  153. {
  154. CeErpMessageTip ceErpMessageTip = new CeErpMessageTip();
  155. ceErpMessageTip.tid = dr["ctid"].ToString();
  156. ceErpMessageTip.type = Convert.ToInt32(MessageState.订单退款);
  157. ceErpMessageTip.userId = DesignUserId;
  158. ceErpMessageTip.isVisit = false;
  159. ceErpMessageTip.content = "订单" + dr["ctid"] + "申请了退款!";
  160. ceErpMessageTip.Create();
  161. StringBuilder sqlTip = new StringBuilder();
  162. 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);
  163. DataTable dth = DbHelper.DbConn.ExecuteDataset(sqlTip.ToString()).Tables[0];
  164. if (dth.Rows.Count > 0)
  165. {
  166. foreach (DataRow dthdr in dth.Rows)
  167. {
  168. int Bid = Convert.ToInt32(dthdr["id"]);
  169. if (Bid > 0)
  170. {
  171. CeErpMessageTip ceErpMessageTipB = new CeErpMessageTip();
  172. ceErpMessageTipB.tid = dr["ctid"].ToString();
  173. ceErpMessageTipB.type = Convert.ToInt32(MessageState.订单退款);
  174. ceErpMessageTipB.userId = Bid;
  175. ceErpMessageTipB.isVisit = false;
  176. ceErpMessageTipB.content = "订单" + dr["ctid"] + "申请了退款!";
  177. ceErpMessageTipB.Create();
  178. }
  179. }
  180. }
  181. }
  182. else if (CustomerUserId > 0)
  183. {
  184. CeErpMessageTip ceErpMessageTip = new CeErpMessageTip();
  185. ceErpMessageTip.tid = dr["ctid"].ToString();
  186. ceErpMessageTip.type = Convert.ToInt32(MessageState.订单退款);
  187. ceErpMessageTip.userId = CustomerUserId;
  188. ceErpMessageTip.isVisit = false;
  189. ceErpMessageTip.content = "订单" + dr["ctid"] + "申请了退款!";
  190. ceErpMessageTip.Create();
  191. StringBuilder sqlTip = new StringBuilder();
  192. 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);
  193. DataTable dth = DbHelper.DbConn.ExecuteDataset(sqlTip.ToString()).Tables[0];
  194. if (dth.Rows.Count > 0)
  195. {
  196. foreach (DataRow dthdr in dth.Rows)
  197. {
  198. int Bid = Convert.ToInt32(dthdr["id"]);
  199. if (Bid > 0)
  200. {
  201. CeErpMessageTip ceErpMessageTipB = new CeErpMessageTip();
  202. ceErpMessageTipB.tid = dr["ctid"].ToString();
  203. ceErpMessageTipB.type = Convert.ToInt32(MessageState.订单退款);
  204. ceErpMessageTipB.userId = Bid;
  205. ceErpMessageTipB.isVisit = false;
  206. ceErpMessageTipB.content = "订单" + dr["ctid"] + "申请了退款!";
  207. ceErpMessageTipB.Create();
  208. }
  209. }
  210. }
  211. }
  212. }
  213. }
  214. }
  215. catch (Exception ex)
  216. {
  217. XLog.SaveLog(0, "退款推送通知创建失败!!" + ex);
  218. }
  219. int rstate = commonHelper.getRefundTagByState(tObj.status);
  220. StringBuilder sql = new StringBuilder();
  221. if (refund.IsPartRefund == 1)
  222. {
  223. double paylast = trade.payment - Convert.ToDouble(refund.refund_fee);
  224. sql.AppendFormat("update CE_ErpTradeCell with(rowlock) set IsRefund={1},payment={2},UpdateTime = getdate() where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, 3, paylast);
  225. }
  226. else
  227. sql.AppendFormat("update CE_ErpTradeCell with(rowlock) set IsRefund={1},UpdateTime = getdate() where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, rstate);
  228. CeErpTradeRefund.ExecuteNonQuery(sql.ToString());
  229. string rstateWord = commonHelper.getRefundStringByState(tObj.status);
  230. //commonHelper.UpdateRefundOrderState(tObj.refOid, rstate);
  231. StringBuilder sqls = new StringBuilder();
  232. sqls.AppendFormat("update CE_ErpDesignerBill set isDel = 1 where tid = '{0}'", tObj.refOid);
  233. CeErpDesignerBill.ExecuteNonQuery(sqls.ToString());
  234. LogHelper.addDesignerBillLog(tObj.refOid, 0, "客户退款", "系统自动", 0);
  235. }
  236. else
  237. {
  238. if (refund.status != tObj.status)
  239. {
  240. refund.modified = DateTime.Now;
  241. if (tObj.updateTime != null && tObj.updateTime.Length > 0)
  242. {
  243. refund.modified = StampToDateTime(tObj.updateTime);
  244. }
  245. refund.order_status = tObj.orderStatus;
  246. refund.status = tObj.status;
  247. refund.Update();
  248. int rstate = commonHelper.getRefundTagByState(tObj.status);
  249. string rstateWord = commonHelper.getRefundStringByState(tObj.status);
  250. StringBuilder sql = new StringBuilder();
  251. sql.AppendFormat("update CE_ErpTradeCell with(rowlock) set IsRefund={0} where tid='{1}' and isAfterSaleOrder=0;", rstate, tObj.refOid);
  252. CeErpTradeRefund.ExecuteNonQuery(sql.ToString());
  253. //commonHelper.UpdateRefundOrderState(tObj.refOid, rstate);
  254. LogHelper.addLog(tObj.refOid, 0, "更新退款状态:" + rstateWord, (int)OrderState.交易关闭);
  255. // 取消设计费
  256. StringBuilder sqls = new StringBuilder();
  257. sqls.AppendFormat("update CE_ErpDesignerBill set isDel = 1 where tid = '{0}'", tObj.refOid);
  258. CeErpDesignerBill.ExecuteNonQuery(sqls.ToString());
  259. LogHelper.addDesignerBillLog(tObj.refOid, 0, "客户退款", "系统自动", 0);
  260. }
  261. }
  262. List<Api_tmc_refund_info_Obj.Lines> goodsItems = tObj.lines;
  263. foreach (Api_tmc_refund_info_Obj.Lines item in goodsItems)
  264. {
  265. CeErpTradeOrder goods = CeErpTradeOrder.GetByOid(item.refOlId);
  266. if (goods != null)
  267. {
  268. goods.refund_status = item.refundStatus;
  269. goods.Update();
  270. }
  271. }
  272. if (tObj.status == "WAIT_SELLER_AGREE")
  273. {
  274. StringBuilder sql = new StringBuilder();
  275. sql.AppendFormat("update ce_erptradecell with(rowlock) set isrefund={1} where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, 1);
  276. DbHelper.DbConn.ExecuteNonQuery(sql.ToString());
  277. designHelper.API_refundOrder(tObj.refOid, "refundIng", tObj.reason);
  278. LogHelper.addLog(tObj.refOid, 0, "申请退款中", 0);
  279. }
  280. else if (tObj.status == "CLOSED")
  281. {
  282. StringBuilder sql = new StringBuilder();
  283. sql.AppendFormat("update ce_erptradecell with(rowlock) set isrefund={1} where tid='{0}' and isAfterSaleOrder=0;", tObj.refOid, 0);
  284. DbHelper.DbConn.ExecuteNonQuery(sql.ToString());
  285. designHelper.API_refundOrder(tObj.refOid, "refundCancel", tObj.reason);
  286. LogHelper.addLog(tObj.refOid, 0, "关闭申请退款中", 0);
  287. }
  288. else if (tObj.status == "REFUNDED" || tObj.status == "SUCCESS")
  289. {
  290. designHelper.API_refundOrder(tObj.refOid, "refundEd", tObj.reason);
  291. }
  292. }
  293. else
  294. {
  295. CeErpSpecialRefund ceErpSpecialRefund = new CeErpSpecialRefund();
  296. ceErpSpecialRefund.refoid = tObj.refOid;
  297. ceErpSpecialRefund.refxml = res;
  298. ceErpSpecialRefund.whethernotify = 0;
  299. ceErpSpecialRefund.Create();
  300. XLog.SaveLog(0, tObj.refOid + "退款推送没有找到对应的订单!!");
  301. }
  302. }
  303. catch (Exception ex)
  304. {
  305. XLog.SaveLog(0, res + "|refund|1|" + ex.Message);
  306. }
  307. }
  308. }
  309. }