exportChargeService.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package service
  2. import (
  3. "strings"
  4. "time"
  5. "app.yhyue.com/moapp/jyResourcesCenter/entity"
  6. "app.yhyue.com/moapp/jyResourcesCenter/rpc/resourcesCenter"
  7. "app.yhyue.com/moapp/jybase/common"
  8. )
  9. // @Author jianghan
  10. // @Date 2025/2/7
  11. // @Description 查询可扣费方式
  12. func ChargeAccount(data *resourcesCenter.ChargeAccountReq) (resp *resourcesCenter.ChargeResp) {
  13. now := time.Now().Format("2006-01-02")
  14. jyOrm := entity.JyEngine.NewSession()
  15. centerOrm := entity.Engine.NewSession()
  16. var exportPower int
  17. _, err := jyOrm.Table("entniche_user").Cols("export_power").Where("id = ?", data.EntUserId).Get(&exportPower)
  18. if err != nil {
  19. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "人员数据定制权限查询失败"}
  20. }
  21. entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId})
  22. var entNums int64
  23. if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil {
  24. plan := (*entInfo)["plan"].(map[string]interface{})
  25. entNums = common.Int64All(plan["current"])
  26. } else {
  27. return &resourcesCenter.ChargeResp{Code: entity.SuccessCode, Message: "未查询到企业数据流量"}
  28. }
  29. var personNums int64
  30. _, err = centerOrm.Table("account_resources").Select("sum(number) as number").
  31. Where("accountId = ? and endTime >= ? and resourceType = ?", data.UserId, now, "高级字段包").Get(&personNums)
  32. if err != nil {
  33. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人流量包查询失败"}
  34. }
  35. if exportPower == 1 && (entNums > 0 || personNums == 0) {
  36. // 企业流量包扣除
  37. var personLimit []*entity.PersonLimit
  38. err = jyOrm.Table("entniche_export_limit").Select("*").
  39. Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit)
  40. if err != nil || personLimit == nil || len(personLimit) == 0 {
  41. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业个人账号限额查询失败"}
  42. }
  43. return &resourcesCenter.ChargeResp{
  44. Code: entity.SuccessCode,
  45. Data: &resourcesCenter.SomeInfo{
  46. ChargeType: 0,
  47. Num1: entNums,
  48. Num2: personLimit[0].DataLimit,
  49. Num3: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].DataLimit-personLimit[0].ExportNums)),
  50. Num4: personLimit[0].MaxNums,
  51. Num5: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].MaxNums-personLimit[0].AllExportNums)),
  52. },
  53. }
  54. } else {
  55. // 个人高级字段包扣除
  56. return &resourcesCenter.ChargeResp{
  57. Code: entity.SuccessCode,
  58. Data: &resourcesCenter.SomeInfo{
  59. ChargeType: 1,
  60. Num1: personNums,
  61. },
  62. }
  63. }
  64. }
  65. // @Author jianghan
  66. // @Date 2025/2/7
  67. // @Description
  68. //
  69. // 剑鱼定制导出企业流量包扣费,优先使用企业流量包扣费(个人账号有权限且企业下有可导出数量)
  70. // 个人流量包扣费只使用 高级流量包余额
  71. func ChargeFunc(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  72. if data.ChargeType == 0 {
  73. // 扣除企业数据包
  74. return entCharge(data)
  75. } else {
  76. // 扣除个人数据包
  77. return personCharge(data)
  78. }
  79. }
  80. func entCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  81. souceOrm := entity.Engine.NewSession()
  82. jyOrm := entity.JyEngine.NewSession()
  83. var personLimit []*entity.PersonLimit
  84. err := jyOrm.Table("entniche_export_limit").Select("*").
  85. Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit)
  86. if err != nil || personLimit == nil || len(personLimit) == 0 {
  87. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业个人账号限额查询失败"}
  88. }
  89. var entNums int64
  90. entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId})
  91. if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil {
  92. plan := (*entInfo)["plan"].(map[string]interface{})
  93. entNums = common.Int64All(plan["current"])
  94. } else {
  95. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "未查询到企业数据流量"}
  96. }
  97. if data.DeductNum > 0 {
  98. if entNums < data.DeductNum {
  99. return &resourcesCenter.ChargeResp{
  100. Code: entity.SuccessCode,
  101. Message: "",
  102. Data: &resourcesCenter.SomeInfo{
  103. ChargeType: 0,
  104. ChargeResult: 0,
  105. FailMsg: "企业数据流量包余额不足",
  106. Num1: entNums,
  107. Num2: personLimit[0].DataLimit,
  108. Num3: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].DataLimit-personLimit[0].ExportNums)),
  109. Num4: personLimit[0].MaxNums,
  110. Num5: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].MaxNums-personLimit[0].AllExportNums)),
  111. },
  112. }
  113. }
  114. // 先更新mgo企业数据总量
  115. query := map[string]interface{}{
  116. "entid": data.EntId,
  117. "plan.current": map[string]interface{}{
  118. "$gte": data.DeductNum,
  119. },
  120. }
  121. update := map[string]interface{}{
  122. "$inc": map[string]interface{}{
  123. "plan.current": -data.DeductNum,
  124. },
  125. }
  126. b = entity.Mgo.Update("user", query, update, false, false)
  127. if !b {
  128. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业余额操作失败"}
  129. }
  130. err = jyOrm.Begin()
  131. //更新限额
  132. if err != nil {
  133. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败," + err.Error()}
  134. }
  135. var updateNum = int64(0)
  136. updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ? and ((data_limit-export_nums>=? and max_nums-all_export_nums>=?) or (data_limit is null and max_nums is null) or (data_limit is null and max_nums-all_export_nums>=?) or (data_limit-export_nums>=? and max_nums is null))", personLimit[0].Id, data.DeductNum, data.DeductNum, data.DeductNum, data.DeductNum).
  137. Incr("export_nums", data.ExportNum).
  138. Incr("all_export_nums", data.ExportNum).
  139. Update(&entity.PersonLimit{})
  140. if err != nil {
  141. _ = jyOrm.Rollback()
  142. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败," + err.Error()}
  143. }
  144. if updateNum <= 0 {
  145. _ = jyOrm.Rollback()
  146. _ = jyOrm.Table("entniche_export_limit").Select("*").
  147. Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit)
  148. var msg []string
  149. if personLimit[0].DataLimit < data.DeductNum {
  150. msg = append(msg, "超出您的每日导出限额")
  151. }
  152. if personLimit[0].MaxNums < data.DeductNum {
  153. msg = append(msg, "超出您的数据导出总量限额")
  154. }
  155. return &resourcesCenter.ChargeResp{
  156. Code: entity.SuccessCode,
  157. Message: "",
  158. Data: &resourcesCenter.SomeInfo{
  159. ChargeType: 0,
  160. ChargeResult: 0,
  161. FailMsg: common.ObjToString(common.If(len(msg) > 0, strings.Join(msg, "、"), "")),
  162. Num1: entNums,
  163. Num2: personLimit[0].DataLimit,
  164. Num3: personLimit[0].DataLimit - personLimit[0].ExportNums,
  165. Num4: personLimit[0].MaxNums,
  166. Num5: personLimit[0].MaxNums - personLimit[0].AllExportNums,
  167. },
  168. }
  169. }
  170. //保存账号使用明细
  171. detailed := entity.Detailed{
  172. AccountId: data.UserId,
  173. CompanyId: data.EntId,
  174. ResourceType: "高级字段包",
  175. Number: data.ExportNum,
  176. DeductionNumb: data.DeductNum,
  177. Name: "数据流包",
  178. CreateTime: time.Now().Local(),
  179. Remarks: data.Remark,
  180. UserType: 0,
  181. UserId: data.UserId,
  182. AccountType: 1,
  183. EntId: data.EntId,
  184. EntUserId: data.EntUserId,
  185. Source: 1,
  186. }
  187. if detailed.EntUserId > 0 {
  188. jyOrm.Table("entniche_user").Select("CONCAT(NAME,'(',phone,')')").Where("id=?", detailed.EntUserId).Get(&detailed.Operator)
  189. }
  190. updateNum, err = souceOrm.Table(ConsumeRecord).Insert(&detailed)
  191. if err != nil || updateNum <= 0 {
  192. _ = jyOrm.Rollback()
  193. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "账号使用明细保存失败"}
  194. }
  195. err = jyOrm.Commit()
  196. if err != nil {
  197. _ = jyOrm.Rollback()
  198. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "事务提交失败," + err.Error()}
  199. }
  200. }
  201. return &resourcesCenter.ChargeResp{
  202. Code: entity.SuccessCode,
  203. Message: "",
  204. Data: &resourcesCenter.SomeInfo{
  205. ChargeType: 0,
  206. ChargeResult: 1,
  207. Num1: entNums,
  208. Num2: personLimit[0].DataLimit,
  209. Num3: personLimit[0].DataLimit - personLimit[0].ExportNums,
  210. Num4: personLimit[0].MaxNums,
  211. Num5: personLimit[0].MaxNums - personLimit[0].AllExportNums,
  212. },
  213. }
  214. }
  215. func personCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) {
  216. now := time.Now().Format("2006-01-02")
  217. jyOrm := entity.Engine.NewSession()
  218. centerOrm := entity.Engine.NewSession()
  219. var personNums int64
  220. _, err := centerOrm.Table("account_resources").Select("sum(number) as number").
  221. Where("accountId = ? and endTime >= ? and resourceType = ?", data.UserId, now, "高级字段包").Get(&personNums)
  222. if err != nil {
  223. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人余额查询失败"}
  224. }
  225. if personNums == 0 || personNums < data.DeductNum {
  226. return &resourcesCenter.ChargeResp{
  227. Code: entity.SuccessCode,
  228. Data: &resourcesCenter.SomeInfo{
  229. ChargeType: 1,
  230. ChargeResult: 0,
  231. Num1: personNums,
  232. },
  233. }
  234. }
  235. // 实际扣费条数
  236. if data.DeductNum > 0 {
  237. var updateNum int64
  238. err = centerOrm.Begin()
  239. if err != nil {
  240. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"}
  241. }
  242. //修改个人账户资源
  243. balanceList := []entity.Balance{}
  244. err = centerOrm.Table(AccountResources).
  245. Select("*").
  246. Where("accountId= ? and number > 0 and resourceType= ? and endTime >= ?", data.UserId, "高级字段包", now).
  247. OrderBy("endTime").
  248. Find(&balanceList)
  249. if err != nil {
  250. _ = centerOrm.Rollback()
  251. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人账号资源查询失败"}
  252. }
  253. for _, value := range balanceList {
  254. if value.Number > data.DeductNum {
  255. value.Number = value.Number - data.DeductNum
  256. data.DeductNum = 0
  257. } else {
  258. data.DeductNum = data.DeductNum - value.Number
  259. value.Number = 0
  260. }
  261. updateNum, err = centerOrm.Table(AccountResources).
  262. Cols("number").ID(value.Id).
  263. Update(&value)
  264. if err != nil || updateNum <= 0 {
  265. _ = centerOrm.Rollback()
  266. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "修改账户失败"}
  267. }
  268. if data.DeductNum == 0 {
  269. break
  270. }
  271. }
  272. //保存账号使用明细
  273. detailed := entity.Detailed{
  274. AccountId: data.UserId,
  275. CompanyId: data.EntId,
  276. ResourceType: "高级字段包",
  277. Number: data.ExportNum,
  278. DeductionNumb: data.DeductNum,
  279. Name: "数据流包",
  280. CreateTime: time.Now().Local(),
  281. Remarks: data.Remark,
  282. UserType: 0,
  283. UserId: data.UserId,
  284. AccountType: 1,
  285. EntId: data.EntId,
  286. EntUserId: data.EntUserId,
  287. Source: 1,
  288. }
  289. if detailed.EntUserId > 0 {
  290. jyOrm.Table("entniche_user").Select("CONCAT(NAME,'(',phone,')')").Where("id=?", detailed.EntUserId).Get(&detailed.Operator)
  291. }
  292. updateNum, err = centerOrm.Table(ConsumeRecord).Insert(&detailed)
  293. if err != nil || updateNum <= 0 {
  294. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "账号使用明细保存失败"}
  295. }
  296. err = centerOrm.Commit()
  297. if err != nil {
  298. _ = jyOrm.Rollback()
  299. return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "事务提交失败"}
  300. }
  301. }
  302. return &resourcesCenter.ChargeResp{
  303. Code: entity.SuccessCode,
  304. Message: "",
  305. Data: &resourcesCenter.SomeInfo{
  306. ChargeType: 1,
  307. ChargeResult: 1,
  308. Num1: personNums,
  309. },
  310. }
  311. }