detail.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. package order
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/encrypt"
  5. "context"
  6. "fmt"
  7. "github.com/gogf/gf/v2/frame/g"
  8. "github.com/gogf/gf/v2/util/gconv"
  9. "jyOrderManager/internal/jyutil"
  10. "jyOrderManager/internal/logic/user"
  11. "jyOrderManager/internal/model"
  12. "log"
  13. "strings"
  14. )
  15. func init() {
  16. }
  17. func Detail(ctx context.Context, param model.OrderDetailParams) (map[string]interface{}, error) {
  18. result := make(map[string]interface{})
  19. //订单 暂无备注字段
  20. orderData, err := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT d.*,(IFNULL(CASE WHEN d.is_backstage_order = 1 THEN d.pay_money ELSE d.order_money END, 0))+(select IFNULL(sum(payMoney),0) as return_money from moneyCorrection where orderCode='%s') as new_pay_money,d.commission+(select IFNULL(sum(commission),0) as return_commission from moneyCorrection where orderCode='%s') as new_commission,(select a.item_name AS order_parent_name from dict_item a where a.item_code=d.order_channel ) AS order_channel_new FROM dataexport_order d WHERE order_code ='%s' `, param.OrderCode, param.OrderCode, param.OrderCode))
  21. if err != nil || orderData.IsEmpty() {
  22. return nil, err
  23. }
  24. var (
  25. userIdentity []int
  26. )
  27. for _, userid := range jyutil.SupAdmin { //超级管理员
  28. if userid == jyutil.GetUserMsgFromCtx(ctx).EntUserId {
  29. userIdentity = append(userIdentity, 1)
  30. }
  31. }
  32. for _, userid := range jyutil.PinTube { //销管
  33. if userid == jyutil.GetUserMsgFromCtx(ctx).EntUserId {
  34. userIdentity = append(userIdentity, 2)
  35. }
  36. }
  37. for _, userid := range jyutil.CSId { //销管
  38. if userid == jyutil.GetUserMsgFromCtx(ctx).EntUserId {
  39. userIdentity = append(userIdentity, 3)
  40. }
  41. }
  42. for _, userid := range jyutil.Administration { //销管
  43. if userid == jyutil.GetUserMsgFromCtx(ctx).EntUserId {
  44. userIdentity = append(userIdentity, 4)
  45. }
  46. }
  47. for _, userid := range jyutil.Finance { //销管
  48. if userid == jyutil.GetUserMsgFromCtx(ctx).EntUserId {
  49. userIdentity = append(userIdentity, 5)
  50. }
  51. }
  52. result["userIdentity"] = userIdentity
  53. orderMap := orderData.Map()
  54. orderMap["pay_money"] = gconv.Int64(orderMap["new_pay_money"])
  55. orderMap["commission"] = gconv.Int64(orderMap["new_commission"])
  56. payWay := gconv.String(orderMap["pay_way"])
  57. var table string
  58. switch {
  59. case strings.Contains(payWay, "wx"):
  60. orderMap["pay_way"] = "微信"
  61. table = "weixin_pay"
  62. case strings.Contains(payWay, "ali"):
  63. orderMap["pay_way"] = "支付宝"
  64. table = "ali_pay"
  65. case strings.Contains(payWay, "trial"):
  66. orderMap["pay_way"] = "其他"
  67. case strings.Contains(payWay, "transferAccounts"):
  68. orderMap["pay_way"] = "对公转账"
  69. case strings.Contains(payWay, "测试使用"):
  70. orderMap["pay_way"] = "测试使用"
  71. case strings.Contains(payWay, "third_party"):
  72. orderMap["pay_way"] = "第三方平台"
  73. }
  74. if outTradeNo := gconv.String(orderMap["out_trade_no"]); outTradeNo != "" && table != "" {
  75. payId, _ := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT * FROM %s WHERE out_trade_no = '%s' ORDER BY create_time desc`, table, outTradeNo))
  76. if !payId.IsEmpty() {
  77. orderMap["transaction_id"] = gconv.String(payId.Map()["transaction_id"])
  78. }
  79. }
  80. //
  81. orderMap["pure_amount"] = common.If(gconv.Int(orderMap["pay_money"])-gconv.Int(orderMap["commission"]) > 0, gconv.Int(orderMap["pay_money"])-gconv.Int(orderMap["commission"]), 0)
  82. //产品
  83. productData, err := g.DB().Query(ctx, fmt.Sprintf(`SELECT * FROM jy_order_detail WHERE order_code ='%s' and status =1`, param.OrderCode))
  84. var (
  85. productArr []map[string]interface{}
  86. autoAndAttribute bool
  87. isReturnStatus = gconv.Int(orderMap["return_status"]) == 1
  88. )
  89. if err != nil || productData.IsEmpty() {
  90. return nil, err
  91. }
  92. var (
  93. //佣金 手续费 合同金额 企业
  94. isCommission, isProceduresMoney, isCash, isEnt, isAdmin bool
  95. newEntName string
  96. moneyCorrectionArr []map[string]interface{}
  97. productRed = make(map[int]int)
  98. )
  99. //红冲
  100. redPunch := make(map[string]interface{})
  101. subject := orderMap["return_commpany"]
  102. moneyCorrectionData, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT * FROM moneyCorrection WHERE orderCode =%s order by createTime desc`, param.OrderCode))
  103. if !moneyCorrectionData.IsEmpty() {
  104. for _, m := range moneyCorrectionData.List() {
  105. if detailId := gconv.Int(m["detail_id"]); detailId > 0 {
  106. productRed[detailId] += gconv.Int(m["payMoney"])
  107. orderDetail, _ := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT product_type FROM jy_order_detail WHERE id =%d and status =1`, gconv.Int(m["detail_id"])))
  108. if !orderDetail.IsEmpty() {
  109. m["name"] = orderDetail.Map()["product_type"]
  110. } else if gconv.String(m["activity_code"]) != "" {
  111. activityData, err := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT * FROM jy_product_activity WHERE code ='%s' `, gconv.String(m["activity_code"])))
  112. if err == nil && !activityData.IsEmpty() {
  113. m["name"] = gconv.String(activityData.Map()["name"])
  114. }
  115. }
  116. }
  117. if strings.Contains(common.InterfaceToStr(m["redType"]), "主体") {
  118. isEnt = true
  119. if common.InterfaceToStr(m["newSigningSubject"]) != "" {
  120. m["signingSubject"] = m["newSigningSubject"]
  121. }
  122. if newSigningSubject := common.InterfaceToStr(m["newSigningSubject"]); newSigningSubject != "" && newEntName == "" {
  123. newEntName = newSigningSubject
  124. }
  125. } else {
  126. if common.IntAll(m["payMoney"]) != 0 {
  127. isCash = true
  128. }
  129. if common.IntAll(m["commission"]) != 0 {
  130. isCommission = true
  131. }
  132. if common.IntAll(m["proceduresMoney"]) != 0 {
  133. isProceduresMoney = true
  134. }
  135. if common.InterfaceToStr(m["signingSubject"]) == "" {
  136. m["signingSubject"] = subject
  137. }
  138. }
  139. moneyCorrectionArr = append(moneyCorrectionArr, m)
  140. }
  141. if newEntName != "" {
  142. orderMap["return_commpany"] = newEntName
  143. }
  144. }
  145. redPunch["moneyCorrectionData"] = moneyCorrectionArr
  146. redPunch["isUpCash"] = isCash
  147. redPunch["isUpCommission"] = isCommission
  148. redPunch["isUpProceduresMoney"] = isProceduresMoney
  149. redPunch["isUpEnt"] = isEnt
  150. result["redPunchData"] = redPunch
  151. for _, m := range productData.List() {
  152. filter := gconv.Map(m["filter"])
  153. if activityCode := gconv.String(m["activity_code"]); activityCode != "" {
  154. activityData, err := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT * FROM jy_product_activity WHERE code ='%s' `, activityCode))
  155. if err == nil && !activityData.IsEmpty() {
  156. m["activityName"] = gconv.String(activityData.Map()["name"])
  157. }
  158. }
  159. if _, ok := productRed[gconv.Int(m["id"])]; ok {
  160. m["isRed"] = true
  161. } else {
  162. m["isRed"] = false
  163. }
  164. m["totalPeriod"] = TotalPeriod(filter)
  165. m["final_price"] = gconv.Int(m["final_price"]) + productRed[gconv.Int(m["id"])]
  166. if productName := gconv.String(filter["productName"]); productName == "" { //历史订单中的类型不做匹配处理
  167. productItem, _ := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT jpi.name,jpc.auto,jpc.code,jpc.attribute FROM jy_product_item jpi
  168. INNER JOIN jy_product_class jpc on jpi.product_class_id = jpc.id WHERE jpi.code = '%s'`, gconv.String(m["product_code"])))
  169. if !productItem.IsEmpty() {
  170. m["productName"] = productItem.Map()["name"]
  171. m["productItemCode"] = productItem.Map()["code"]
  172. m["attribute"] = productItem.Map()["attribute"]
  173. m["auto"] = common.If(gconv.Int(orderMap["is_backstage_order"]) != 1, 2, productItem.Map()["auto"])
  174. if (gconv.Int(m["attribute"]) == 1 || gconv.Int(m["attribute"]) == 2) &&
  175. gconv.Int(m["auto"]) == 1 && gconv.Int(m["is_service_open"]) == 0 &&
  176. (gconv.Int(m["service_type"]) == 1 || gconv.Int(m["service_type"]) == 4) {
  177. autoAndAttribute = true
  178. }
  179. } else {
  180. if gconv.Int(orderMap["is_backstage_order"]) == 0 {
  181. m["productName"] = "标准版"
  182. } else {
  183. m["productName"] = productItem.Map()["product_type"]
  184. }
  185. }
  186. } else {
  187. m["productName"] = productName
  188. }
  189. if dataPackNum := gconv.Int(filter["dataPackNum"]); dataPackNum > 0 {
  190. m["bigServiceNames"] = fmt.Sprintf("赠送数据流量包 (高级字段包) %d条", dataPackNum)
  191. }
  192. /*if gconv.String(m["product_type"]) == "大会员" && gconv.Int(gconv.Map(m["filter"])["comboId"]) == 0 {
  193. supMap := make(map[string]bool)
  194. for _, s := range gconv.Strings(gconv.Map(m["filter"])["supServiceIds"]) {
  195. supMap[s] = true
  196. }
  197. var ids []string
  198. serviceIds := gconv.Strings(gconv.Map(m["filter"])["serviceIds"])
  199. for _, id := range serviceIds {
  200. ids = append(serviceIds, gconv.String(id))
  201. }
  202. bigService, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT id,s_name FROM bigmember_service WHERE id in (%s) order by id`, strings.Join(ids, ",")))
  203. if !bigService.IsEmpty() {
  204. var (
  205. bigServiceNames []string
  206. supBigServiceNames []string
  207. )
  208. for _, m1 := range bigService.List() {
  209. switch gconv.Int(m1["id"]) {
  210. case 1:
  211. m1["s_name"] = "基础服务"
  212. case 30051, 30052, 30053: //0分报告过滤
  213. continue
  214. }
  215. if supMap[gconv.String(m1["id"])] {
  216. supBigServiceNames = append(supBigServiceNames, gconv.String(m1["s_name"]))
  217. } else {
  218. bigServiceNames = append(bigServiceNames, gconv.String(m1["s_name"]))
  219. }
  220. }
  221. if len(supBigServiceNames) > 0 {
  222. m["bigServiceNames"] = fmt.Sprintf("[补充权益]: %s ;[原已购权益]:%s", strings.Join(supBigServiceNames, "、"), strings.Join(bigServiceNames, "、"))
  223. } else {
  224. m["bigServiceNames"] = strings.Join(bigServiceNames, "、")
  225. }
  226. }
  227. }*/
  228. if linkedDetailId := gconv.Int(m["linked_detail_id"]); linkedDetailId > 0 {
  229. linkedDetail, _ := g.DB().GetOne(ctx, `SELECT * FROM jy_order_detail where id = ?`, linkedDetailId)
  230. if linkedDetail.IsEmpty() {
  231. log.Println("产品关联订单获取异常", param.OrderCode, linkedDetailId)
  232. continue
  233. }
  234. var orderArr []map[string]interface{}
  235. //关联订单
  236. if gconv.String(linkedDetail.Map()["product_type"]) != "大会员" && gconv.String(linkedDetail.Map()["product_type"]) != "VIP订阅" {
  237. var whereSql string
  238. if gconv.Int(orderMap["buy_subject"]) == 1 {
  239. whereSql = fmt.Sprintf("dor.user_phone = '%s' and dor.buy_subject =1 and dor.create_time< '%s' ", gconv.String(orderMap["user_phone"]), gconv.String(orderMap["create_time"]))
  240. } else {
  241. whereSql = fmt.Sprintf("dor.user_phone = '%s' and dor.buy_subject =2 and dor.company_name ='%s' and dor.create_time< '%s' ", gconv.String(orderData.Map()["user_phone"]), gconv.String(orderData.Map()["company_name"]), gconv.String(orderData.Map()["create_time"]))
  242. }
  243. if linkedOrder := user.SpecialService(ctx, whereSql, gconv.String(m["product_type"]), gconv.Int(orderMap["buy_subject"])); linkedOrder != nil {
  244. m["linkedOrder"] = linkedOrder
  245. }
  246. } else {
  247. var (
  248. areaCount, paySubNum, buySubject int
  249. endTime, startTime string
  250. )
  251. switch gconv.String(linkedDetail.Map()["product_type"]) {
  252. case "VIP订阅":
  253. var ttt model.VipCycleFilter
  254. if err = gconv.Struct(linkedDetail.Map()["filter"], &ttt); err != nil {
  255. continue
  256. }
  257. areaCount = ttt.FinalAreaCount
  258. paySubNum = gconv.Int(common.If(gconv.Int(orderMap["buy_subject"]) == 1, 1, ttt.FinalAccountCount))
  259. case "大会员":
  260. var ttt model.JyBigProductFilter
  261. if err = gconv.Struct(linkedDetail.Map()["filter"], &ttt); err != nil {
  262. continue
  263. }
  264. areaCount = ttt.FinalAreaCount
  265. paySubNum = ttt.FinalAccountCount
  266. }
  267. switch gconv.Int(orderMap["buy_subject"]) {
  268. case 1:
  269. buySubject = 1
  270. orderProduct, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT b.id,a.service_type,b.order_code,b.create_time,a.service_starttime,a.service_endtime FROM jy_order_detail a
  271. INNER JOIN dataexport_order b on a.order_code = b.order_code
  272. WHERE a.status = 1 and a.is_service_open = 1 and b.user_phone = '%s' and b.create_time< '%s' and b.buy_subject = 1 and a.product_type like '%s' ORDER BY b.create_time desc `, gconv.String(orderMap["user_phone"]), orderMap["create_time"], gconv.String(linkedDetail.Map()["product_type"])))
  273. if !orderData.IsEmpty() {
  274. for _, m2 := range orderProduct.List() {
  275. if endTime == "" && gconv.String(m2["service_endtime"]) != "" {
  276. endTime = gconv.String(m2["service_endtime"])
  277. }
  278. if startTime == "" && gconv.String(m2["service_starttime"]) != "" {
  279. startTime = gconv.String(m2["service_starttime"])
  280. }
  281. orderArr = append(orderArr, map[string]interface{}{
  282. "order_code": m2["order_code"],
  283. "create_time": m2["create_time"],
  284. "service_type": m2["service_type"],
  285. "order_detail_id": m2["id"],
  286. })
  287. }
  288. }
  289. case 2:
  290. buySubject = 2
  291. entService, _ := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT a.id,a.product_type,a.end_time,a.start_time,a.empower_count,a.province_count FROM entniche_wait_empower a
  292. INNER JOIN entniche_order b on a.id = b.wait_empower_id
  293. WHERE b.order_detail_id=%d`, linkedDetailId))
  294. if !entService.IsEmpty() {
  295. entOrderService, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT jod.*,do.create_time
  296. FROM jy_order_detail jod
  297. INNER JOIN entniche_order eo ON jod.id = eo.order_detail_id
  298. INNER JOIN dataexport_order do on jod.order_code= do.order_code
  299. WHERE eo.wait_empower_id = %s and jod.is_service_open =1 and jod.status =1 and do.create_time< '%s' ORDER BY do.create_time desc`, gconv.String(entService.Map()["id"]), orderMap["create_time"]))
  300. if !entOrderService.IsEmpty() {
  301. for _, m2 := range entOrderService.List() {
  302. if endTime == "" && gconv.String(m2["service_endtime"]) != "" {
  303. endTime = gconv.String(m2["service_endtime"])
  304. }
  305. if startTime == "" && gconv.String(m2["service_starttime"]) != "" {
  306. startTime = gconv.String(m2["service_starttime"])
  307. }
  308. orderArr = append(orderArr, map[string]interface{}{
  309. "order_code": m2["order_code"],
  310. "create_time": m2["create_time"],
  311. "service_type": m2["service_type"],
  312. "order_detail_id": m2["id"],
  313. })
  314. }
  315. }
  316. }
  317. }
  318. m["linkedOrder"] = map[string]interface{}{
  319. "name": gconv.String(m["product_type"]), //产品名称
  320. "serviceEndTime": endTime, //服务结束时间
  321. "serviceStartTime": startTime, //服务开始时间
  322. "productCode": gconv.String(linkedDetail.Map()["product_code"]),
  323. "empowerCount": paySubNum, //服务授权数
  324. "provinceCount": areaCount, //订阅省份
  325. "buySubject": buySubject, //个体
  326. "orderArr": orderArr, //关联订单
  327. }
  328. }
  329. switch gconv.String(m["product_type"]) {
  330. case "大会员":
  331. BigFilterFmt(m)
  332. case "VIP订阅":
  333. VipFilterFmt(m)
  334. }
  335. }
  336. productArr = append(productArr, m)
  337. }
  338. //合同
  339. contractData, _ := g.DB().GetOne(ctx, fmt.Sprintf(`SELECT * FROM contract WHERE order_code =%s `, param.OrderCode))
  340. if !contractData.IsEmpty() {
  341. contractMap := contractData.Map()
  342. // 合同信息
  343. if contractMap["contract_file_url"] != nil && len(contractMap["contract_file_url"].(string)) > 0 {
  344. index_ := strings.LastIndex(contractMap["contract_file_url"].(string), "/")
  345. if index_ != -1 {
  346. contractMap["contract_file_name"] = contractMap["contract_file_url"].(string)[index_+1:]
  347. }
  348. }
  349. result["contractRes"] = contractMap
  350. }
  351. //全额回款 有会员权益 且没有开通
  352. //获取所有上级部门
  353. userCtx := jyutil.GetUserMsgFromCtx(ctx)
  354. departmentMap := make(map[int64]bool)
  355. for _, i2 := range jyutil.SupAdmin {
  356. if i2 == userCtx.EntUserId {
  357. isAdmin = true
  358. break
  359. }
  360. }
  361. for _, i3 := range jyutil.PinTube {
  362. if i3 == userCtx.EntUserId {
  363. isAdmin = true
  364. break
  365. }
  366. }
  367. salespersonEntUserId := gconv.Int64(orderData["salesperson_entUserId"])
  368. if !isAdmin {
  369. department, _ := g.DB().Query(ctx, `SELECT
  370. edu.dept_id,edu.user_id
  371. FROM
  372. entniche_department_user edu
  373. INNER JOIN entniche_user_role eur on eur.role_id =2 and edu.user_id = eur.user_id
  374. WHERE
  375. edu.user_id = ?
  376. OR edu.dept_id IN ( SELECT edp.pid FROM entniche_department_parent edp INNER JOIN entniche_department_user edu1 ON edu1.user_id = ? AND edp.id = edu1.dept_id )`, salespersonEntUserId, salespersonEntUserId)
  377. if !department.IsEmpty() {
  378. for _, m := range department.List() {
  379. departmentMap[gconv.Int64(m["user_id"])] = true
  380. }
  381. }
  382. }
  383. var isSupportOpen bool
  384. if autoAndAttribute {
  385. if isReturnStatus { //全额回款 是销售本人订单||部门管理员|| 销管&超级管理员
  386. if isAdmin || salespersonEntUserId == userCtx.EntUserId || departmentMap[userCtx.EntUserId] {
  387. isSupportOpen = true //是否可以权益开通
  388. }
  389. } else {
  390. //协议已归档&是销管或超级管理员
  391. isSupportOpen = !contractData.IsEmpty() && gconv.Int(contractData.Map()["contract_archive_status"]) == 1 && isAdmin
  392. }
  393. }
  394. orderMap["isSupportOpen"] = isSupportOpen
  395. result["productData"] = productArr
  396. var transferList []map[string]interface{}
  397. //对公转账审核记录
  398. orderTransfer, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT * FROM jy_order_transfer WHERE order_code = '%s' order by create_time desc `, param.OrderCode))
  399. if !orderTransfer.IsEmpty() {
  400. for _, m := range orderTransfer.List() {
  401. if gconv.String(m["update_time"]) == gconv.String(m["create_time"]) {
  402. m["update_time"] = ""
  403. }
  404. transferList = append(transferList, m)
  405. }
  406. result["orderTransfer"] = transferList
  407. }
  408. // 回款信息
  409. var (
  410. returnMoney, plantMoney int
  411. returnArr []map[string]interface{}
  412. )
  413. returnInfo, _ := g.DB().Query(ctx, fmt.Sprintf("SELECT * from return_money_record WHERE order_code=%s and state=1", param.OrderCode))
  414. // 回款交易详情列表
  415. if !returnInfo.IsEmpty() {
  416. for _, d := range returnInfo.List() {
  417. returnMoney += gconv.Int(d["return_money"])
  418. if d["return_voucher_url"] != nil && len(d["return_voucher_url"].(string)) > 0 {
  419. index_ := strings.LastIndex(d["return_voucher_url"].(string), "/")
  420. if index_ != -1 {
  421. d["return_voucher_name"] = d["return_voucher_url"].(string)[index_+1:]
  422. }
  423. }
  424. returnArr = append(returnArr, d)
  425. }
  426. }
  427. if gconv.Int(orderMap["is_backstage_order"]) == 0 && gconv.Int(orderMap["order_status"]) == 1 &&
  428. gconv.Int(orderMap["pay_money"]) > 0 && gconv.Int(orderMap["return_status"]) == 0 &&
  429. !strings.Contains(payWay, "transferAccounts") {
  430. returnMoney = gconv.Int(orderMap["pay_money"])
  431. }
  432. if gconv.Int(orderMap["return_status"]) == 1 {
  433. returnMoney = gconv.Int(orderMap["pay_money"])
  434. }
  435. //回款计划
  436. returnMoneyPlant, err := g.DB().GetOne(ctx, "SELECT * from return_money_plant where order_code = ? order by create_time desc", param.OrderCode)
  437. if !returnMoneyPlant.IsEmpty() {
  438. for _, m2 := range gconv.Maps(returnMoneyPlant.Map()["plantList"]) {
  439. if gconv.String(m2["code"]) == "合计" {
  440. plantMoney = gconv.Int(m2["money"])
  441. }
  442. }
  443. }
  444. result["returnMoneyPlant"] = map[string]interface{}{
  445. "list": returnMoneyPlant.Map(),
  446. "returnMoney": returnMoney,
  447. "plantMoney": plantMoney,
  448. }
  449. //退款
  450. var (
  451. refundMoney int
  452. refundList []map[string]interface{}
  453. )
  454. refundData, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT rr.* FROM refund_record rr
  455. WHERE rr.order_code ='%s' order by rr.refund_time desc`, param.OrderCode))
  456. if !refundData.IsEmpty() {
  457. for _, datum := range refundData.List() {
  458. refundMoney += gconv.Int(datum["refund_money"])
  459. if gconv.Int(datum["refund_detail_id"]) > 0 {
  460. detailData, _ := g.DB().GetOne(ctx, `SELECT de.*,jc.class_name FROM jy_order_detail de
  461. LEFT JOIN jy_product_item ji on de.product_code = ji.code
  462. LEFT JOIN jy_product_class jc on ji.product_class_id = jc.id WHERE de.id =? and de.status =1`, gconv.Int(datum["refund_detail_id"]))
  463. if !detailData.IsEmpty() {
  464. if gconv.String(detailData.Map()["class_name"]) == "" {
  465. datum["name"] = detailData.Map()["product_type"]
  466. } else {
  467. datum["name"] = detailData.Map()["class_name"]
  468. }
  469. }
  470. }
  471. if gconv.String(datum["refund_active_code"]) != "" {
  472. activityData, _ := g.DB().GetOne(ctx, `SELECT * FROM jy_product_activity WHERE code =?`, gconv.Int(datum["refund_active_code"]))
  473. if !activityData.IsEmpty() {
  474. datum["name"] = activityData.Map()["name"]
  475. }
  476. }
  477. refundList = append(refundList, datum)
  478. }
  479. }
  480. result["returnRes"] = map[string]interface{}{
  481. "returnMoney": returnMoney,
  482. "remainingMoney": gconv.Int(orderMap["pay_money"]) - returnMoney + refundMoney,
  483. "returnInfo": returnArr,
  484. }
  485. if gconv.Int(orderMap["is_backstage_order"]) == 0 && gconv.Int(orderMap["order_status"]) == 1 &&
  486. gconv.Int(orderMap["pay_money"]) > 0 {
  487. returnMoney = gconv.Int(orderMap["pay_money"])
  488. }
  489. result["refundRes"] = map[string]interface{}{
  490. "refundMoney": refundMoney,
  491. "remainingMoney": returnMoney - refundMoney,
  492. "refundInfo": refundList,
  493. }
  494. //审核轨迹详情
  495. recordsData, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT * FROM audit_records WHERE order_code =%s and audit_type = 2 order by create_time desc `, param.OrderCode))
  496. if !recordsData.IsEmpty() {
  497. result["audit"] = recordsData.List()
  498. }
  499. //盖章记录
  500. sealData, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT os.id,os.stamp_time,os.create_time,eus.name as salesman_name,eu.name as applicant_name FROM order_seal os
  501. LEFT JOIN entniche_user eu on os.applicant_id = eu.id
  502. LEFT JOIN entniche_user eus on os.salesman_id = eus.id
  503. WHERE order_code = '%s' and status = 0 order by create_time desc `, param.OrderCode))
  504. if !sealData.IsEmpty() {
  505. result["sealArr"] = sealData.List()
  506. }
  507. //配置盖章权益人
  508. result["stampedInterest"] = jyutil.StampedInterest
  509. var saleData = map[string]interface{}{
  510. "saleEdit": jyutil.SaleChangePower, //销售业绩变更展示
  511. }
  512. var saleRecordStatus int
  513. saleRes, _ := g.DB().Query(ctx, fmt.Sprintf("SELECT d.*,(select CONCAT_WS('/', a.parent_name, a.item_name) AS order_parent_name from dict_item a where a.item_code=d.distribution_channel ) AS order_channel_new FROM order_sale_record d WHERE d.ordercode='%s' and d.state in (1,-1,2) order by d.create_time asc", param.OrderCode))
  514. if !saleRes.IsEmpty() {
  515. var (
  516. //最终业绩
  517. finalArr []map[string]interface{}
  518. finalShowTime string
  519. //记录
  520. record, recordTmp []map[string]interface{}
  521. repeatMapping = map[string]bool{}
  522. zeroChannel = map[string]bool{}
  523. //
  524. )
  525. for _, m := range saleRes.List() {
  526. var (
  527. status = gconv.Int64(m["state"])
  528. money = gconv.Int64(m["money"])
  529. salerId = gconv.Int64(m["ent_userId"])
  530. )
  531. if (status == 1 || status == 2) && money >= 0 { //最终合算
  532. if finalShowTime == "" {
  533. finalShowTime = gconv.String(m["statistics_time"])
  534. }
  535. finalArr = append(finalArr, map[string]interface{}{
  536. "id": salerId,
  537. "name": m["saler_name"],
  538. "saler_dept": m["saler_dept"],
  539. "distribution_channel": m["distribution_channel"],
  540. "order_channel_new": m["order_channel_new"],
  541. "money": money,
  542. })
  543. }
  544. switch status {
  545. case 1:
  546. saleRecordStatus = 1
  547. case 2:
  548. continue
  549. }
  550. if gconv.Int(m["change_value"]) == 0 || gconv.Int(m["money"]) == 0 {
  551. zeroChannelKey := fmt.Sprintf("%d_%s", salerId, gconv.String(m["distribution_channel"]))
  552. if zeroChannel[zeroChannelKey] {
  553. continue
  554. }
  555. zeroChannel[zeroChannelKey] = true
  556. }
  557. key := fmt.Sprintf("%d_%s", salerId, gconv.String(m["statistics_time"]))
  558. if repeatMapping[key] {
  559. continue
  560. }
  561. repeatMapping[key] = true
  562. recordTmp = append(recordTmp, map[string]interface{}{
  563. "saler_dept": m["saler_dept"],
  564. "name": m["saler_name"],
  565. "change_value": m["change_value"],
  566. "statistics_time": m["statistics_time"],
  567. "createtime": m["create_time"],
  568. "operator": m["operator"],
  569. "change_reason": m["change_reason"],
  570. "distribution_channel": m["distribution_channel"],
  571. "order_channel_new": m["order_channel_new"],
  572. "money": money,
  573. })
  574. }
  575. for i := len(recordTmp) - 1; i >= 0; i-- {
  576. record = append(record, recordTmp[i])
  577. }
  578. saleData["saleFinal"] = map[string]interface{}{
  579. "list": finalArr,
  580. "time": finalShowTime,
  581. }
  582. saleData["reason"] = jyutil.SaleChangeReason
  583. saleData["saleRecord"] = record
  584. result["saleDataRes"] = saleData
  585. }
  586. orderMap["saleRecordStatus"] = saleRecordStatus
  587. //发票信息
  588. var (
  589. invoiceMoney int
  590. invoiceList []map[string]interface{}
  591. )
  592. invoiceRes, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT *,(
  593. SELECT count(1) as count FROM invoice b WHERE b.order_code = a.order_code and b.only_Identifying is not null and b.only_Identifying = a.only_Identifying
  594. ) as isChanged FROM invoice a WHERE a.order_code = '%s' and a.invoice_status != -2 and a.invoice_variety is not null ORDER BY a.create_time DESC`, param.OrderCode))
  595. if !invoiceRes.IsEmpty() {
  596. jyWebDomain := g.Cfg().MustGet(context.Background(), "jyWebDomain").String()
  597. for _, datum := range invoiceRes.List() {
  598. if common.ObjToString(datum["code_url"]) != "" {
  599. datum["code_url"] = jyWebDomain + common.ObjToString(datum["code_url"])
  600. }
  601. datum["invoiceId"] = encrypt.SE.Encode2Hex(gconv.String(datum["id"]))
  602. invoiceList = append(invoiceList, datum)
  603. invoiceMoney += gconv.Int(datum["invoice_order_money"])
  604. }
  605. }
  606. if invoiceMoney > 0 {
  607. orderMap["invoiced_status"] = common.If(gconv.Int(orderMap["pay_money"])-invoiceMoney <= 0, 2, 3)
  608. } else {
  609. orderMap["invoiced_status"] = 0 //未开票
  610. }
  611. result["invoiceData"] = map[string]interface{}{
  612. "invoiceMoney": invoiceMoney,
  613. "remainingMoney": gconv.Int(orderMap["pay_money"]) - invoiceMoney,
  614. "invoiceInfo": invoiceList,
  615. }
  616. result["orderData"] = orderMap
  617. return result, nil
  618. }
  619. func BigFilterFmt(m map[string]interface{}) {
  620. var bigFilter model.JyBigProductFilter
  621. err := gconv.Struct(m["filter"], bigFilter)
  622. if err != nil {
  623. log.Println("filter err", err)
  624. return
  625. }
  626. productType := "大会员"
  627. switch bigFilter.ComboId {
  628. case 1:
  629. productType += "专家版"
  630. case 2:
  631. productType += "智慧版"
  632. case 3:
  633. productType += "商机版"
  634. case 4:
  635. productType += "试用版"
  636. case 6:
  637. productType += "商机版2.0"
  638. case 7:
  639. productType += "专家版2.0"
  640. default:
  641. //自定义获取每个服务名称
  642. productType += "自定义"
  643. if len(bigFilter.SupServiceIds) == 0 {
  644. m["all_service_name"] = ServiceName(bigFilter.ServiceIds)
  645. }
  646. }
  647. m["product_type"] = productType
  648. if len(bigFilter.SupServiceIds) > 0 { //补充服务 区分升级前 升级后分类
  649. var preUpgradeService []string
  650. //基础服务过滤
  651. for _, id := range bigFilter.ServiceIds {
  652. var isSup bool
  653. for _, serviceId := range bigFilter.SupServiceIds {
  654. if id == serviceId {
  655. isSup = true
  656. break
  657. }
  658. }
  659. if !isSup {
  660. preUpgradeService = append(preUpgradeService, id)
  661. }
  662. }
  663. if bigFilter.ComboId == 0 { //自定义获取下老服务名称 套餐不展示
  664. m["old_service_name"] = ServiceName(preUpgradeService)
  665. }
  666. m["new_service_name"] = ServiceName(bigFilter.SupServiceIds)
  667. }
  668. }
  669. func ServiceName(id []string) (serviceName []string) {
  670. bigService, _ := g.DB().Query(context.Background(), fmt.Sprintf(`SELECT id,s_new_name,i_class,s_count_year FROM bigmember_service WHERE id in (%s) ORDER BY i_class ASC,i_sort ASC`, strings.Join(id, ",")))
  671. if !bigService.IsEmpty() {
  672. for _, m2 := range bigService.List() {
  673. switch m2["i_class"] {
  674. case 1:
  675. serviceName = append(serviceName, "基础服务")
  676. case 2:
  677. serviceName = append(serviceName, fmt.Sprintf("%s%s", m2["s_new_name"],
  678. common.If(gconv.Int(m2["s_count_year"]) > 0, fmt.Sprintf("(%s)个", gconv.String(m2["s_count_year"])), "")))
  679. case 3:
  680. serviceName = append(serviceName, fmt.Sprintf("%s%s", m2["s_new_name"],
  681. common.If(gconv.Int(m2["s_count_year"]) > 0, fmt.Sprintf("(%s)份", gconv.String(m2["s_count_year"])), "")))
  682. case 4:
  683. serviceName = append(serviceName, fmt.Sprintf("%s%s", m2["s_new_name"],
  684. common.If(gconv.Int(m2["s_count_year"]) > 0, fmt.Sprintf(":%s/天", gconv.String(m2["s_count_year"])), "")))
  685. }
  686. }
  687. }
  688. return
  689. }
  690. func VipFilterFmt(m map[string]interface{}) {
  691. //升级订阅增购省份多少个
  692. var vipFilter model.VipCycleFilter
  693. gconv.Struct(m["filter"], vipFilter)
  694. productItem, _ := g.DB().GetOne(context.Background(), fmt.Sprintf(`SELECT * FROM jy_product_item WHERE code = '%s'`, gconv.String(m["product_code"])))
  695. if !productItem.IsEmpty() {
  696. if gconv.Int(productItem.Map()["unit_num"]) < vipFilter.FinalAreaCount {
  697. if vipFilter.FinalAreaCount == -1 || vipFilter.FinalAreaCount > 16 {
  698. m["upgradesNumber"] = 16 - gconv.Int(productItem.Map()["unit_num"])
  699. }
  700. }
  701. }
  702. }
  703. // BuyCycle int `json:"buy_cycle"` //购买周期
  704. //
  705. // BuyType int `json:"buy_type"` //购买周期 类型 1天 2月 3年 4季度
  706. // GiftCycle int `json:"give_cycle"` //赠送周期
  707. // GiftType int `json:"give_type"` //赠送周期 类型 1天 2月 3年 4季度
  708. func TotalPeriod(filterMap map[string]interface{}) string {
  709. var (
  710. year, month, day int
  711. totalPeriodStr []string
  712. buyCycle = gconv.Int(filterMap["buy_cycle"])
  713. giveCycle = gconv.Int(filterMap["give_cycle"])
  714. activityGiveCycle = gconv.Int(filterMap["activity_give_cycle"])
  715. )
  716. switch gconv.Int(filterMap["buy_type"]) {
  717. case 1:
  718. day += buyCycle
  719. case 2:
  720. month += buyCycle
  721. case 3:
  722. year += buyCycle
  723. case 4:
  724. month += buyCycle * 3
  725. }
  726. switch gconv.Int(filterMap["give_type"]) {
  727. case 1:
  728. day += giveCycle
  729. case 2:
  730. month += giveCycle
  731. case 3:
  732. year += giveCycle
  733. case 4:
  734. month += giveCycle * 3
  735. }
  736. switch gconv.Int(filterMap["activity_give_type"]) {
  737. case 1:
  738. day += activityGiveCycle
  739. case 2:
  740. month += activityGiveCycle
  741. case 3:
  742. year += activityGiveCycle
  743. case 4:
  744. month += activityGiveCycle * 3
  745. }
  746. if day >= 30 {
  747. month += day / 30
  748. day = day % 30
  749. }
  750. if month >= 12 {
  751. year += month / 12
  752. month = month % 12
  753. }
  754. if year > 0 {
  755. totalPeriodStr = append(totalPeriodStr, fmt.Sprintf("%d年", year))
  756. }
  757. if month > 0 {
  758. totalPeriodStr = append(totalPeriodStr, fmt.Sprintf("%d月", month))
  759. }
  760. if day > 0 {
  761. totalPeriodStr = append(totalPeriodStr, fmt.Sprintf("%d天", day))
  762. }
  763. return strings.Join(totalPeriodStr, "")
  764. }