deliver_user_service.go 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. package service
  2. import (
  3. "bytes"
  4. "crypto/md5"
  5. "database/sql"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "gopkg.in/mgo.v2/bson"
  10. "io/ioutil"
  11. "log"
  12. "math/rand"
  13. "net/http"
  14. "strconv"
  15. "strings"
  16. "sync"
  17. "time"
  18. "gopkg.in/guregu/null.v3"
  19. "xiaoniaokuaiyan.com/xiaoniao/config"
  20. "xiaoniaokuaiyan.com/xiaoniao/dal"
  21. "xiaoniaokuaiyan.com/xiaoniao/entity"
  22. "xiaoniaokuaiyan.com/xiaoniao/pay/wx"
  23. "xiaoniaokuaiyan.com/xiaoniao/util"
  24. )
  25. type DeliverUserService struct {
  26. dal.IDeliverUserDal
  27. *WeixinService
  28. dal.IOrder
  29. }
  30. func (dus *DeliverUserService) GetOrderList(openid string, status, pageIndex, pageSize int) (interface{}, error) {
  31. if strings.Trim(openid, " ") == "" {
  32. return nil, errors.New("openid is required")
  33. }
  34. return dus.IDeliverUserDal.GetOrderList(openid, status, pageIndex, pageSize)
  35. }
  36. func (dus *DeliverUserService) GetOrderListV2(openid string, pageIndex, pageSize int) (interface{}, error) {
  37. if strings.Trim(openid, " ") == "" {
  38. return nil, errors.New("openid is required")
  39. }
  40. return dus.IDeliverUserDal.GetOrderListV2(openid, pageIndex, pageSize)
  41. }
  42. func (dus *DeliverUserService) GetOrderSign(orderId string) (interface{}, error) {
  43. return dus.IDeliverUserDal.GetOrderSign(orderId)
  44. }
  45. func (dus *DeliverUserService) SaveOrderSign(signItem *entity.OrderSign) (interface{}, error) {
  46. return dus.IDeliverUserDal.SaveOrderSign(signItem)
  47. }
  48. func (dus *DeliverUserService) RegistDU(duItem *entity.DeliverUser) (interface{}, error) {
  49. /*if duItem.Vcode == "" {
  50. return nil, errors.New("0::require vcode")
  51. }
  52. smsService := SMSService{dal.DefaultSMSCodeDal}
  53. _, err := smsService.ValidateCode(duItem.Tel, duItem.Vcode, 7)
  54. if err != nil {
  55. return nil, err
  56. }*/
  57. r, err := dus.IDeliverUserDal.SaveDU(duItem)
  58. if err != nil {
  59. return nil, err
  60. }
  61. var (
  62. firstVal string = "恭喜您成功注册小鸟快验护士平台"
  63. remarkVal string = "请尽快提交相关资料,现在提交还有金币奖励,可以随时提现哦~"
  64. toUser string = duItem.Openid
  65. phone = duItem.Tel
  66. createAt = time.Now().Format("2006-01-02 15:04:05")
  67. )
  68. msg := map[string]interface{}{
  69. "touser": &toUser,
  70. "template_id": "9AdS0lxgUUtFE-RxZE2gIYWZkTzdpivvyfwh5A3sRYo",
  71. "url": config.IniConf.Section("weixin").Key("wx.front_host").Value() + "/index/deliver",
  72. "data": map[string]interface{}{
  73. "first": map[string]interface{}{
  74. "value": &firstVal,
  75. "color": "#173177",
  76. },
  77. "keyword1": map[string]interface{}{
  78. "value": &phone,
  79. "color": "#173177",
  80. },
  81. "keyword2": map[string]interface{}{
  82. "value": &createAt,
  83. "color": "#173177",
  84. },
  85. "remark": map[string]interface{}{
  86. "value": &remarkVal,
  87. "color": "#173177",
  88. },
  89. },
  90. }
  91. buf, _ := json.Marshal(msg)
  92. _, err = dus.WeixinService.SendTpl(string(buf), "")
  93. return r, err
  94. }
  95. func (dus *DeliverUserService) UpdateDU(duItem *entity.DeliverUser) (interface{}, error) {
  96. return dus.IDeliverUserDal.UpdateDU(duItem)
  97. }
  98. func (dus *DeliverUserService) CheckExam(duser *entity.DeliverUser, questions []entity.ExamQuestion) (interface{}, error) {
  99. db := util.GetWriteSqlDB()
  100. var strIds string
  101. for _, q := range questions {
  102. strIds += fmt.Sprintf("%d,", q.Id)
  103. }
  104. strIds = strIds[0 : len(strIds)-1]
  105. strSql := "select id, answer from t_deliver_exam where id in(" + strIds + ");"
  106. var eqs = []entity.ExamQuestion{}
  107. err := db.Select(&eqs, strSql)
  108. if err != nil {
  109. return nil, err
  110. }
  111. if len(eqs) != len(questions) {
  112. return nil, errors.New("1::数据异常")
  113. }
  114. var (
  115. validNum int = 0
  116. )
  117. for _, question := range questions {
  118. for _, eq := range eqs {
  119. if eq.Answer == question.InAnswer {
  120. validNum++
  121. break
  122. }
  123. }
  124. }
  125. if validNum >= NOURSE_EXAME_PASS {
  126. strSql = "update t_deliver_user set process_staus = '7', grade='L3' where openid = ?"
  127. sqlResult, _ := db.Exec(strSql, duser.Openid)
  128. if ra, _ := sqlResult.RowsAffected(); ra < 1 {
  129. return nil, errors.New("2::数据更新失败")
  130. } //老1000,新500
  131. /* //v1.之前修改不能重复考试添加分数,v2. 2020-12-31 去掉考试通过加分,直接审核通过加分。
  132. var (
  133. inviterID int
  134. myId int
  135. //count int
  136. )
  137. db.Get(&inviterID, "select id from t_deliver_user t1 where exists (select 1 from t_deliver_user t2 where t1.openid = t2.invite_by and t2.openid = ? and LENGTH(t2.invite_by)>0)limit 1", duser.Openid)
  138. db.Get(&myId, "select id from t_deliver_user where openid = ? limit 1", duser.Openid)
  139. if inviterID > 0 && myId > 0 {
  140. //db.Get(&count, "select count(1) from t_deliver_score_bill where deliver_user_id = ? and type=?", myId, "INVITE_EXAM")
  141. //if count > 0 {
  142. //发出邀请的人
  143. db.Exec("update t_deliver_account set score = score + 1000 where deliver_user_id = ?;", inviterID)
  144. db.Exec("insert into t_deliver_score_bill(deliver_user_id, type, score) values(?,?,?);", inviterID, "INVITE_F_EXAM", 1000)
  145. //被邀请的人
  146. db.Exec("update t_deliver_account set score = score + 500 where deliver_user_id = ?;", myId)
  147. db.Exec("insert into t_deliver_score_bill(deliver_user_id, type, score) values(?,?,?);", myId, "INVITE_EXAM", 500)
  148. //}
  149. }
  150. */
  151. }
  152. return validNum, nil
  153. }
  154. //const NOURSE_EXAME_NUMS int = 20
  155. //const NOURSE_EXAME_PASS int = 18
  156. // 总题数
  157. const NOURSE_EXAME_NUMS int = 5
  158. // 通过数
  159. const NOURSE_EXAME_PASS int = 4
  160. func (dus *DeliverUserService) GetExamList() (interface{}, error) {
  161. db := util.GetSqlDB()
  162. var simpleExams = []struct {
  163. Id int `db:"id"`
  164. Flag string `db:"flag"`
  165. }{}
  166. var idMapFlag = map[int]string{}
  167. strSql := "select id, flag from t_deliver_exam;"
  168. err := db.Select(&simpleExams, strSql)
  169. if err != nil {
  170. return nil, err
  171. }
  172. for _, se := range simpleExams {
  173. idMapFlag[se.Id] = se.Flag
  174. }
  175. var tempIds = map[int]interface{}{}
  176. var (
  177. l = len(simpleExams)
  178. rn int
  179. )
  180. for i := 0; i < NOURSE_EXAME_NUMS; i++ {
  181. for {
  182. rn = rand.Intn(l) + 1
  183. if flag, ok := idMapFlag[rn]; ok && flag == "Y" {
  184. if _, ok = tempIds[rn]; !ok {
  185. tempIds[rn] = struct{}{}
  186. break
  187. }
  188. }
  189. }
  190. }
  191. strIds := ""
  192. for k, _ := range tempIds {
  193. strIds += fmt.Sprintf("%d,", k)
  194. }
  195. strIds = strIds[0 : len(strIds)-1]
  196. strSql = "select * from t_deliver_exam where id in(" + strIds + ") order by sortno asc;"
  197. questions := []entity.ExamQuestion{}
  198. err = db.Select(&questions, strSql)
  199. if err != nil {
  200. return nil, err
  201. }
  202. strSql = "select * from t_deliver_exam_option where exam_id in(" + strIds + ") and flag = 'Y';"
  203. var options = []entity.ExamOption{}
  204. err = db.Select(&options, strSql)
  205. if err != nil {
  206. return nil, err
  207. }
  208. for _, option := range options {
  209. for i, _ := range questions {
  210. if option.ExamId == questions[i].Id {
  211. questions[i].Options = append(questions[i].Options, option)
  212. break
  213. }
  214. }
  215. }
  216. return questions, nil
  217. }
  218. func (dus *DeliverUserService) GetStudyList(typ string) (interface{}, error) {
  219. db := util.GetSqlDB()
  220. var studyList = []entity.DeliverStudy{}
  221. strSql := "select * from t_deliver_study where typ = ? and flag = 'Y' order by sortno asc;"
  222. err := db.Select(&studyList, strSql, typ)
  223. return studyList, err
  224. }
  225. func (dus *DeliverUserService) GetStudyLog(openid string, typ string) (interface{}, error) {
  226. strSql := "select t1.* from t_deliver_study_log t1 left join t_deliver_study t2 on t2.id = t1.deliver_study_id where openid = ? and t2.typ = ?;"
  227. db := util.GetSqlDB()
  228. var logList = []entity.DeliverStudyLog{}
  229. err := db.Select(&logList, strSql, openid, typ)
  230. return logList, err
  231. }
  232. func (dus *DeliverUserService) AddStduyLog(slog entity.DeliverStudyLog) (interface{}, error) {
  233. db := util.GetWriteSqlDB()
  234. var (
  235. now = time.Now()
  236. year = now.Year()
  237. month = now.Month()
  238. startDate = fmt.Sprintf("%d-%d-01", year, month)
  239. )
  240. strSql := "select id from t_deliver_study_log where openid = ? and deliver_study_id = ? and create_time > ?;"
  241. var hasRead int
  242. err := db.Get(&hasRead, strSql, slog.Openid, slog.DeliverStudyId, startDate)
  243. strSql = "insert into t_deliver_study_log(openid, deliver_study_id) values(?,?);"
  244. sqlResult, _ := db.Exec(strSql, slog.Openid, slog.DeliverStudyId)
  245. if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
  246. return false, nil
  247. }
  248. if hasRead == 0 && err == sql.ErrNoRows {
  249. var typ string
  250. err = db.Get(&typ, "select typ from t_deliver_study where id = ?", slog.DeliverStudyId)
  251. if err != nil {
  252. log.Println(err)
  253. }
  254. if err != nil && typ == "STUDY" {
  255. db.Exec("update t_deliver_account set score = score + 10 where deliver_user_id = ?;", slog.DeliverUserId)
  256. db.Exec("insert into t_deliver_score_bill(deliver_user_id, type, score) values(?,?,?);", slog.DeliverUserId, "STUDY_DATA", 10)
  257. }
  258. }
  259. return true, nil
  260. }
  261. func (dus *DeliverUserService) Get(openid string) (interface{}, error) {
  262. return dus.IDeliverUserDal.Get(openid)
  263. }
  264. func (dus *DeliverUserService) GetDispatchOrders(city string) (interface{}, error) {
  265. db := util.GetSqlDB()
  266. strSql := "select shortname from t_city where name = ?;"
  267. var shortName string
  268. db.Get(&shortName, strSql, strings.TrimRight(city, "市"))
  269. if shortName == "" {
  270. return nil, errors.New("1::can not resolve city")
  271. }
  272. strSql = `select t1.order_id, t2.address, t2.detail_address, t2.visit_date, t2.visit_time_range,t3.paynurse,
  273. GROUP_CONCAT(t5.sampling) as samplings from t_order_dispatch_pool t1
  274. left join t_order t2 on t1.order_id = t2.id left join t_order_extra t3 on t2.id = t3.order_id
  275. left join t_order_product t4 on t3.order_id = t4.order_id
  276. left join t_product t5 on t4.product_id = t5.id
  277. where t1.order_id like '` + shortName + "%' group by t1.order_id;"
  278. var dorders = []struct {
  279. OrderId string `db:"order_id" json:"order_id"`
  280. Address string `db:"address" json:"address"`
  281. DetailAddress string `db:"detail_address" json:"detail_address"`
  282. VisitDate string `db:"visit_date" json:"visit_date"`
  283. VisitTimeRange string `db:"visit_time_range" json:"visit_time_range"`
  284. Samplings null.String `db:"samplings" json:"samplings"`
  285. PayNurse int `db:"paynurse" json:"paynurse"`
  286. }{}
  287. err := db.Select(&dorders, strSql)
  288. return dorders, err
  289. }
  290. //抢单
  291. func (dus *DeliverUserService) ScrambleOrder(duId int, orderId string) (interface{}, error) {
  292. db := util.GetWriteSqlDB()
  293. strSql := "select order_id, t2.visit_date, t2.visit_time_range from t_order_dispatch_pool t1 left join t_order t2 on t1.order_id = t2.id where order_id = ?;"
  294. var sOrder = struct {
  295. OrderId string `db:"order_id"`
  296. VisitDate null.String `db:"visit_date" json:"visit_date"`
  297. VisitTimeRange null.String `db:"visit_time_range" json:"visit_time_range"`
  298. }{}
  299. db.Get(&sOrder, strSql, orderId)
  300. fmt.Println(sOrder)
  301. if sOrder.OrderId == "" {
  302. return false, errors.New("1::alredy scrambled")
  303. }
  304. var timeStr = fmt.Sprintf("%v", time.Now().UnixNano())
  305. var upHash = md5.Sum([]byte(timeStr))
  306. strSql = "update t_order_dispatch_pool set uphash = ? where order_id = ? and uphash is null;"
  307. tx := db.MustBegin()
  308. strHash := fmt.Sprintf("%x", upHash)
  309. sqlResult := tx.MustExec(strSql, strHash, orderId)
  310. if la, _ := sqlResult.RowsAffected(); la <= 0 {
  311. tx.Tx.Rollback()
  312. return false, nil
  313. }
  314. sqlResult = tx.MustExec("delete from t_order_dispatch_pool where order_id = ?", orderId)
  315. if la, _ := sqlResult.RowsAffected(); la <= 0 {
  316. tx.Tx.Rollback()
  317. return false, nil
  318. }
  319. strSql = "insert into t_order_deliver_user(order_id,deliver_user_id,career,visit_date,visit_time_range,create_at,get_type) values(?,?,?,?,?,?,?);"
  320. sqlResult = tx.MustExec(strSql, orderId, duId, "2", sOrder.VisitDate.String, sOrder.VisitTimeRange.String, time.Now().Format("2006-01-02 15:04:05"), "scramble")
  321. if la, _ := sqlResult.RowsAffected(); la <= 0 {
  322. tx.Tx.Rollback()
  323. return false, nil
  324. }
  325. tx.Commit()
  326. return true, nil
  327. }
  328. func (dus *DeliverUserService) AddWorkdays(duId int, wds []string) (interface{}, error) {
  329. if len(wds) == 0 {
  330. return false, nil
  331. }
  332. strSql := "insert into t_deliver_workday(deliver_user_id, date) values"
  333. for i, wd := range wds {
  334. strSql += fmt.Sprintf("(%d,'%s')", duId, wd)
  335. if i < len(wds)-1 {
  336. strSql += ","
  337. }
  338. }
  339. db := util.GetWriteSqlDB()
  340. sqlResult, err := db.Exec(strSql)
  341. if err != nil {
  342. return false, err
  343. }
  344. if la, err := sqlResult.RowsAffected(); la <= 0 {
  345. return false, err
  346. }
  347. go _insertMongo(fmt.Sprintf("%d", duId), strings.Join(wds, ","), 61)
  348. return true, nil
  349. }
  350. func (dus *DeliverUserService) CancelWorkdays(duId int, wds []string) (interface{}, error) {
  351. if len(wds) == 0 {
  352. return false, nil
  353. }
  354. var (
  355. strDate string
  356. count int
  357. )
  358. for i, wd := range wds {
  359. strDate += fmt.Sprintf("'%s'", wd)
  360. if i < len(wds)-1 {
  361. strDate += ","
  362. }
  363. }
  364. db := util.GetWriteSqlDB()
  365. strSql := "SELECT count(1) FROM t_order t WHERE id IN ( SELECT order_id FROM t_order_deliver_user t2 WHERE deliver_user_id = ? AND visit_date IN (" + strDate + ")) AND STATUS = '3'"
  366. db.Get(&count, strSql, duId)
  367. if count > 0 {
  368. return false, fmt.Errorf("日期已有预约")
  369. }
  370. strSql = "delete from t_deliver_workday where deliver_user_id = ? and date in(" + strDate + ");"
  371. sqlResult, err := db.Exec(strSql, duId)
  372. if err != nil {
  373. return false, err
  374. }
  375. if la, err := sqlResult.RowsAffected(); la <= 0 {
  376. return false, err
  377. }
  378. go _insertMongo(fmt.Sprintf("%d", duId), strings.Join(wds, ","), 62)
  379. return true, nil
  380. }
  381. func (dus *DeliverUserService) GetNurseWorkdays(duId int) (interface{}, error) {
  382. var wds = []string{}
  383. strSql := "select date from t_deliver_workday where deliver_user_id = ? and date >= ? order by date;"
  384. db := util.GetSqlDB()
  385. err := db.Select(&wds, strSql, duId, time.Now().Format("2006-01-02"))
  386. return wds, err
  387. }
  388. func (dus *DeliverUserService) GetBills(duId int, pageIndex, pageSize int) (interface{}, error) {
  389. return dus.IDeliverUserDal.GetBills(duId, pageIndex, pageSize)
  390. }
  391. func (dus *DeliverUserService) GetAccountInfo(duId int) (interface{}, error) {
  392. strSql := "select * from t_deliver_account where deliver_user_id = ?;"
  393. db := util.GetSqlDB()
  394. var cinfo = entity.DeliverAccount{}
  395. err := db.Get(&cinfo, strSql, duId)
  396. if err != nil {
  397. if err != sql.ErrNoRows {
  398. return nil, err
  399. }
  400. }
  401. vw, err := dus.getNurseValidWithdraw(duId)
  402. if err != nil {
  403. return nil, err
  404. }
  405. if cinfo.Remain > vw {
  406. cinfo.ValidWithdraw = vw
  407. } else {
  408. cinfo.ValidWithdraw = cinfo.Remain
  409. }
  410. return cinfo, nil
  411. }
  412. func (dus *DeliverUserService) getNurseValidWithdraw(duid int) (int, error) {
  413. strSql := "select sum(fee) from t_deliver_bill where deliver_user_id = ? and type ='withdraw' and (created_at between ? and ?);"
  414. db := util.GetSqlDB()
  415. var (
  416. cwithdrawed null.Int
  417. dm = time.Now().Month()
  418. dy = time.Now().Year()
  419. sm string
  420. )
  421. if dm < 10 {
  422. sm = fmt.Sprintf("0%d", dm)
  423. } else {
  424. sm = fmt.Sprintf("%d", dm)
  425. }
  426. startTime := fmt.Sprintf("%d-%s-01 00:00:00", dy, sm)
  427. endTime := time.Now().Format("2006-01-02 15:04:05")
  428. err := db.Get(&cwithdrawed, strSql, duid, startTime, endTime)
  429. if err != nil {
  430. return 0, err
  431. }
  432. maxVW := 80000
  433. if !cwithdrawed.Valid {
  434. return maxVW, nil
  435. }
  436. if int(cwithdrawed.Int64) > maxVW {
  437. return 0, nil
  438. } else {
  439. return maxVW - int(cwithdrawed.Int64), nil
  440. }
  441. }
  442. //护士订单佣金收益提现
  443. func (dus *DeliverUserService) NurseWithdraw(duId int, money int) (interface{}, error) {
  444. if money < 0 {
  445. return false, errors.New("wrong param")
  446. }
  447. var dinfo = struct {
  448. Remain int `db:"remain"`
  449. Openid string `db:"openid"`
  450. }{}
  451. var strSql = "select openid, remain from t_deliver_account t1 left join t_deliver_user t2 on t1.deliver_user_id = t2.id where deliver_user_id = ?;"
  452. db := util.GetWriteSqlDB()
  453. db.Get(&dinfo, strSql, duId)
  454. if dinfo.Openid == "" {
  455. return false, errors.New("miss openid")
  456. }
  457. if dinfo.Remain < money {
  458. return false, errors.New("1::money not enough")
  459. }
  460. vw, err := dus.getNurseValidWithdraw(duId)
  461. if err != nil {
  462. return nil, err
  463. }
  464. if vw < money {
  465. return false, errors.New("2::valid money not enough")
  466. }
  467. strSql = "update t_deliver_account set remain = remain -?, withdrawed = withdrawed + ? where deliver_user_id = ? and remain = ?;"
  468. tx := db.MustBegin()
  469. sqlResult, err := tx.Exec(strSql, money, money, duId, dinfo.Remain)
  470. if err != nil {
  471. return false, err
  472. }
  473. if la, err := sqlResult.RowsAffected(); la <= 0 {
  474. return false, err
  475. }
  476. wxJsSdk := wx.NewJsSdk()
  477. weixin := wx.NewWeixin(wx.DefaultConfig["appid"], wx.DefaultConfig["secret"])
  478. nonceStr := wxJsSdk.GenerateNoncestr(32)
  479. billno := fmt.Sprintf("HB%s%s", time.Now().Format("20060102150405"), util.RandNumString(6))
  480. reqItem := map[string]string{
  481. "mch_id": wx.DefaultConfig["mch_id"],
  482. "nonce_str": nonceStr,
  483. "mch_billno": billno,
  484. "wxappid": wx.DefaultConfig["appid"],
  485. "send_name": "小鸟快验",
  486. "re_openid": dinfo.Openid,
  487. "total_amount": fmt.Sprintf("%d", money),
  488. "total_num": "1",
  489. "wishing": "感谢您的辛勤工作,祝提现愉快",
  490. "client_ip": "127.0.0.1",
  491. "act_name": "红包提现",
  492. "remark": "readpack",
  493. }
  494. sign := wxJsSdk.ComputePaySignature(reqItem, wx.DefaultConfig["apikey"])
  495. reqItem["sign"] = sign
  496. rel, err := weixin.SendRedpack(reqItem, wx.DefaultConfig["cert_file"], wx.DefaultConfig["key_file"])
  497. log.Println(rel)
  498. if err != nil {
  499. log.Println(err)
  500. }
  501. if rel["return_code"] == "SUCCESS" && rel["result_code"] == "SUCCESS" {
  502. tx.Exec("insert into t_deliver_bill(deliver_user_id, fee, type,billno,status) values(?,?,?,?,'300');", duId, money, "withdraw", billno)
  503. tx.Exec("insert into t_deliver_msg(deliver_user_id, title, content,created_at) values(?,?,?,?);", duId, "余额提取成功", fmt.Sprintf("您于%s成提取%d元,系统以微信红包的形式发送至您的微信账号,注意查收。", time.Now().Format("2006-01-02"), money/100), time.Now().Format("2006-01-02 15:04:05"))
  504. tx.Commit()
  505. } else {
  506. tx.Tx.Rollback()
  507. return false, fmt.Errorf("2::%s", rel["return_msg"])
  508. }
  509. return true, nil
  510. }
  511. func (dus *DeliverUserService) NurseScoreWithdraw(duId int, money int) (interface{}, error) {
  512. if money < 0 {
  513. return false, errors.New("wrong param")
  514. }
  515. var dinfo = struct {
  516. ScoreCash int `db:"score_cash"`
  517. Openid string `db:"openid"`
  518. }{}
  519. var strSql = "select openid, score_cash from t_deliver_account t1 left join t_deliver_user t2 on t1.deliver_user_id = t2.id where deliver_user_id = ?;"
  520. db := util.GetWriteSqlDB()
  521. db.Get(&dinfo, strSql, duId)
  522. if dinfo.Openid == "" {
  523. return false, errors.New("miss openid")
  524. }
  525. if dinfo.ScoreCash < money {
  526. return false, errors.New("1::money not enough")
  527. }
  528. strSql = "update t_deliver_account set score_cash = score_cash -?, score_cashed = score_cashed + ? where deliver_user_id = ? and score_cash = ?;"
  529. tx := db.MustBegin()
  530. sqlResult, err := tx.Exec(strSql, money, money, duId, dinfo.ScoreCash)
  531. if err != nil {
  532. return false, err
  533. }
  534. if la, err := sqlResult.RowsAffected(); la <= 0 {
  535. return false, err
  536. }
  537. wxJsSdk := wx.NewJsSdk()
  538. weixin := wx.NewWeixin(wx.DefaultConfig["appid"], wx.DefaultConfig["secret"])
  539. nonceStr := wxJsSdk.GenerateNoncestr(32)
  540. billno := fmt.Sprintf("HB%s%s", time.Now().Format("20060102150405"), util.RandNumString(6))
  541. reqItem := map[string]string{
  542. "mch_id": wx.DefaultConfig["mch_id"],
  543. "nonce_str": nonceStr,
  544. "mch_billno": billno,
  545. "wxappid": wx.DefaultConfig["appid"],
  546. "send_name": "小鸟快验",
  547. "re_openid": dinfo.Openid,
  548. "total_amount": fmt.Sprintf("%d", money),
  549. "total_num": "1",
  550. "wishing": "感谢您的辛勤工作,祝提现愉快",
  551. "client_ip": "127.0.0.1",
  552. "act_name": "金币兑换红包提现",
  553. "remark": "readpack",
  554. }
  555. sign := wxJsSdk.ComputePaySignature(reqItem, wx.DefaultConfig["apikey"])
  556. reqItem["sign"] = sign
  557. rel, err := weixin.SendRedpack(reqItem, wx.DefaultConfig["cert_file"], wx.DefaultConfig["key_file"])
  558. log.Println(rel)
  559. if err != nil {
  560. log.Println(err)
  561. }
  562. if rel["return_code"] == "SUCCESS" && rel["result_code"] == "SUCCESS" {
  563. tx.Exec("insert into t_deliver_score_bill(deliver_user_id, score, type,billno) values(?,?,?,?);", duId, money, "WITHDRAW", billno)
  564. tx.Exec("insert into t_deliver_msg(deliver_user_id, title, content,created_at) values(?,?,?,?);", duId, "金币提现成功", fmt.Sprintf("您于%s成提取%d元,系统以微信红包的形式发送至您的微信账号,注意查收。", time.Now().Format("2006-01-02"), money/100), time.Now().Format("2006-01-02 15:04:05"))
  565. tx.Commit()
  566. } else {
  567. tx.Tx.Rollback()
  568. return false, fmt.Errorf("2::%s", rel["return_msg"])
  569. }
  570. return true, nil
  571. }
  572. func (dus *DeliverUserService) NurseMsg(duId int, pageIndex, pageSize int, city string) (interface{}, error) {
  573. db := util.GetSqlDB()
  574. var cityId int
  575. db.Get(&cityId, "select id from t_city where name = ?", strings.TrimRight(city, "市"))
  576. if cityId <= 0 {
  577. return nil, errors.New("1::unknow city")
  578. }
  579. return dus.IDeliverUserDal.GetMsg(duId, pageIndex, pageSize, cityId)
  580. }
  581. func (dus *DeliverUserService) UpdateNurseMsg(duId int) (interface{}, error) {
  582. strSql := "update t_deliver_msg set is_read = 'Y' where deliver_user_id = ?;"
  583. db := util.GetWriteSqlDB()
  584. sqlResult, err := db.Exec(strSql, duId)
  585. if err != nil {
  586. return nil, err
  587. }
  588. if la, _ := sqlResult.RowsAffected(); la <= 0 {
  589. return false, errors.New("1::更新失败")
  590. }
  591. return true, nil
  592. }
  593. func (dus *DeliverUserService) AddChatMsg(msgItem *entity.DeliverChatMsg) (interface{}, error) {
  594. db := util.GetWriteSqlDB()
  595. strSql := "insert into t_deliver_chat(fu,tu,message) values(?,?,?);"
  596. sqlResult, err := db.Exec(strSql, msgItem.From, msgItem.To, msgItem.Message)
  597. if err != nil {
  598. return nil, err
  599. }
  600. if la, _ := sqlResult.RowsAffected(); la <= 0 {
  601. return false, errors.New("1::保存失败")
  602. }
  603. return true, nil
  604. }
  605. func (dus *DeliverUserService) GetChatMsg(duId int, pageIndex int) (interface{}, error) {
  606. if pageIndex <= 0 {
  607. pageIndex = 1
  608. }
  609. strSql := "select * from t_deliver_chat where fu = ? or tu = ? order by created_at desc limit ?,?;"
  610. db := util.GetSqlDB()
  611. var msgList = []entity.DeliverChatMsg{}
  612. err := db.Select(&msgList, strSql, duId, duId, (pageIndex-1)*20, 20)
  613. return msgList, err
  614. }
  615. func (dus *DeliverUserService) NurseSignIn(duId int) (interface{}, error) {
  616. continuousDay, isTodaySignin, err := dus.getNurseSignInDays(duId)
  617. if err != nil {
  618. return 0, err
  619. }
  620. if isTodaySignin {
  621. return 0, errors.New("1::alredy signin today")
  622. }
  623. var toAddScore = continuousDay + 1
  624. if toAddScore > 7 {
  625. toAddScore = 7
  626. }
  627. db := util.GetWriteSqlDB()
  628. tx := db.MustBegin()
  629. strSql := "insert into t_deliver_score_bill(deliver_user_id, type, score) values(?,?,?);"
  630. sqlResult, err := tx.Exec(strSql, duId, "SIGNIN", toAddScore*10)
  631. if err != nil {
  632. tx.Tx.Rollback()
  633. return 0, err
  634. }
  635. if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
  636. tx.Tx.Rollback()
  637. return 0, nil
  638. }
  639. strSql = "update t_deliver_account set score = score + ? where deliver_user_id = ?;"
  640. sqlResult = tx.MustExec(strSql, toAddScore*10, duId)
  641. if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
  642. tx.Tx.Rollback()
  643. return 0, errors.New("failed to update score")
  644. }
  645. tx.Commit()
  646. return toAddScore, nil
  647. }
  648. //func (dus *DeliverUserService) _updateScore(duId int, typ string, score int){}
  649. // get nurse continuous signin days
  650. func (dus *DeliverUserService) getNurseSignInDays(duId int) (int, bool, error) {
  651. var (
  652. now = time.Now()
  653. startDate = now.AddDate(0, 0, -7).Format("2006-01-02")
  654. endDate = now.Format("2006-01-02") + " 23:59:59"
  655. )
  656. strSql := "select created_at from t_deliver_score_bill where deliver_user_id = ? and type = 'SIGNIN' and created_at between ? and ? order by created_at desc;"
  657. db := util.GetSqlDB()
  658. var signInDays = []string{}
  659. err := db.Select(&signInDays, strSql, duId, startDate, endDate)
  660. if err != nil {
  661. return 0, false, err
  662. }
  663. if len(signInDays) == 0 {
  664. return 0, false, nil
  665. }
  666. continuousDay := 0
  667. today_sign := false
  668. if signInDays[0] > now.Format("2006-01-02") {
  669. today_sign = true
  670. signInDays = signInDays[1:]
  671. continuousDay++
  672. }
  673. for i, dtime := range signInDays {
  674. if dtime > now.AddDate(0, 0, -i-1).Format("2006-01-02") {
  675. continuousDay++
  676. } else {
  677. break
  678. }
  679. }
  680. return continuousDay, today_sign, nil
  681. }
  682. func (dus *DeliverUserService) _hasAnswerDailyQuestion(duid int) bool {
  683. today := time.Now().Format("2006-01-02")
  684. strSql := "select count(*) from t_deliver_score_bill where type = 'DAILY_QUESTION' and created_at between ? and ? and deliver_user_id = ?"
  685. db := util.GetSqlDB()
  686. var hasAnswerDailyQuestion int
  687. db.Get(&hasAnswerDailyQuestion, strSql, today, today+" 23:59:59", duid)
  688. return hasAnswerDailyQuestion > 0
  689. }
  690. func (dus *DeliverUserService) NurseScore(duId int) (interface{}, error) {
  691. strSql := "select score,score_cash from t_deliver_user t1 left join t_deliver_account t2 on t1.id = t2.deliver_user_id where t1.id = ?;"
  692. db := util.GetSqlDB()
  693. var scoreInfo = struct {
  694. Score null.Int `db:"score"`
  695. ScoreCash null.Int `db:"score_cash"`
  696. }{}
  697. err := db.Get(&scoreInfo, strSql, duId)
  698. if err != nil {
  699. return nil, err
  700. }
  701. continuousDay, isTodaySignin, err := dus.getNurseSignInDays(duId)
  702. if err != nil {
  703. return nil, err
  704. }
  705. var isFirstInvite int
  706. strSql = "select count(*) from t_deliver_user where invite_by in (select openid from t_deliver_user where id = ?);"
  707. db.Get(&isFirstInvite, strSql, duId)
  708. strSql = "select count(*) from t_deliver_score_bill where deliver_user_id = ? and type = 'ORDER';"
  709. var isCompleteFirstOrder int
  710. db.Get(&isCompleteFirstOrder, strSql, duId)
  711. return map[string]interface{}{
  712. "score": scoreInfo.Score,
  713. "score_cash": scoreInfo.ScoreCash,
  714. "is_today_signin": isTodaySignin,
  715. "continuous_day": continuousDay,
  716. "is_first_invite": isFirstInvite > 0,
  717. "is_complete_first_order": isCompleteFirstOrder > 0,
  718. "is_answer_daily_question": dus._hasAnswerDailyQuestion(duId),
  719. }, nil
  720. }
  721. func (dus *DeliverUserService) GetScoreBill(duId, pageIndex, pageSize int, typ string) (interface{}, error) {
  722. return dus.IDeliverUserDal.GetScoreBill(duId, pageIndex, pageSize, typ)
  723. }
  724. func (dus *DeliverUserService) GetIFStatus(openid string, status string, pageIndex, pageSize int) (interface{}, error) {
  725. if pageSize <= 0 {
  726. pageSize = 5
  727. }
  728. var strStatus string
  729. switch status {
  730. case "1":
  731. strStatus = "(1,2,3)"
  732. case "4":
  733. strStatus = "(4,5,6)"
  734. case "7":
  735. strStatus = "(7)"
  736. default:
  737. return nil, errors.New("1::wrong param status")
  738. }
  739. skip := (pageIndex - 1) * pageSize
  740. strSql := "select name, head_pic, process_staus,t2.nickname,t2.headimgurl from t_deliver_user t1 left join t_wechat_userinfo t2 on t1.openid = t2.openid where invite_by = ? and process_staus in" + strStatus + " order by create_at desc limit ?,? ;"
  741. db := util.GetSqlDB()
  742. var friends = []struct {
  743. Nickname null.String `json:"nickname"`
  744. HeadImgUrl null.String `json:"headimgurl"`
  745. Name string `json:"name"`
  746. HeadPic string `json:"head_pic"`
  747. Status string `json:"process_staus" db:"process_staus"`
  748. }{}
  749. err := db.Select(&friends, strSql, openid, skip, pageSize)
  750. if err != nil {
  751. return nil, err
  752. }
  753. //return friends, err
  754. var count int
  755. strSql = "select count(1) from t_deliver_user where invite_by = ? and process_staus in" + strStatus + ""
  756. err = db.Get(&count, strSql, openid)
  757. if err != nil {
  758. return nil, err
  759. }
  760. return map[string]interface{}{"data": friends, "total": count}, nil
  761. }
  762. var dailyQuestionMutex = &sync.Mutex{}
  763. func (dus *DeliverUserService) DailyQuestion() (interface{}, error) {
  764. dailyQuestionMutex.Lock()
  765. defer dailyQuestionMutex.Unlock()
  766. day := time.Now().Format("2006-01-02")
  767. v, _ := util.GetRedisValue("DAILIY_QUESTION")
  768. var (
  769. lastDay string
  770. skipNums int
  771. )
  772. if v != "" {
  773. temps := strings.Split(v, "*")
  774. if len(temps) < 2 {
  775. return nil, errors.New("config error")
  776. }
  777. lastDay = temps[0]
  778. skipNums, _ = strconv.Atoi(temps[1])
  779. if lastDay != day {
  780. skipNums += 1
  781. lastDay = day
  782. }
  783. }
  784. db := util.GetSqlDB()
  785. strSql := "select count(*) from t_deliver_exam where flag = 'Y';"
  786. var qnums int
  787. err := db.Get(&qnums, strSql)
  788. if err != nil {
  789. return nil, err
  790. }
  791. if qnums <= skipNums {
  792. skipNums = 0
  793. }
  794. util.SetRedisValue("DAILIY_QUESTION", fmt.Sprintf("%s*%d", lastDay, skipNums), 0)
  795. strSql = "select * from t_deliver_exam where flag = 'Y' order by id asc limit ?,1;"
  796. question := &entity.ExamQuestion{}
  797. err = db.Get(question, strSql, skipNums)
  798. if err != nil && err != sql.ErrNoRows {
  799. return nil, err
  800. }
  801. strSql = "select * from t_deliver_exam_option where exam_id = ? and flag = 'Y' order by id asc;"
  802. var options = []entity.ExamOption{}
  803. err = db.Select(&options, strSql, question.Id)
  804. if err != nil {
  805. return nil, err
  806. }
  807. question.Options = options
  808. return question, nil
  809. }
  810. func (dus *DeliverUserService) CheckQuestion(duid int, question *entity.ExamQuestion) (interface{}, error) {
  811. if dus._hasAnswerDailyQuestion(duid) {
  812. return nil, errors.New("1::alredy answered")
  813. }
  814. strSql := "select answer from t_deliver_exam where id = ?;"
  815. db := util.GetSqlDB()
  816. var answer string
  817. err := db.Get(&answer, strSql, question.Id)
  818. var result = map[string]interface{}{
  819. "check_result": false,
  820. }
  821. if err != nil {
  822. return result, err
  823. }
  824. if answer == question.InAnswer {
  825. db.Exec("update t_deliver_account set score = score + 100 where deliver_user_id = ?;", duid)
  826. db.Exec("insert into t_deliver_score_bill(deliver_user_id, type, score) values(?,?,?);", duid, "DAILY_QUESTION", 100)
  827. result["check_result"] = true
  828. return result, nil
  829. } else {
  830. db.Exec("update t_deliver_account set score = score + 20 where deliver_user_id = ?;", duid)
  831. db.Exec("insert into t_deliver_score_bill(deliver_user_id, type, score) values(?,?,?);", duid, "DAILY_QUESTION", 20)
  832. }
  833. result["right_answer"] = answer
  834. return result, nil
  835. }
  836. //qz 检测项录入 20200826
  837. func (dus *DeliverUserService) DetectInfoAdd(params []entity.DetectInfoParam) (bool, error) {
  838. fmt.Println(params)
  839. dus.IOrder = dal.DefaultOrderDal
  840. //遍历params 根据 order_no 状态 ==3 查找 order 如果没有,终止并返回
  841. order, err := dus.IOrder.Get(params[0].OrderId)
  842. if err != nil || order == nil {
  843. return false, errors.New("1::order record not found")
  844. }
  845. if order.Status != 3 {
  846. return false, errors.New("2::order status not 3")
  847. }
  848. age := order.Age
  849. //有生日取生日,没有生日取age
  850. birthAge, err := util.BirthDayToAge(order.Birthday)
  851. if err == nil {
  852. age = birthAge
  853. }
  854. var gender string
  855. switch order.Gender {
  856. case 1:
  857. gender = "男"
  858. case 2:
  859. gender = "女"
  860. default:
  861. gender = ""
  862. }
  863. db := util.GetWriteSqlDB()
  864. tx := db.MustBegin()
  865. var cdr entity.DetectInfoDB
  866. var sqlResult sql.Result
  867. for _, v := range params {
  868. //查询order_no detect_item_id 查询数据,如果没有就新建,有就更新
  869. //获取 记录 判断各字段为空的情况
  870. sql := "select order_no, detect_item_id, final, unit, refValue, age, gender, checker, approver, checkTime, createdAt, is_self, final_status, final_tip, extra from t_custom_detect_result where order_no= ? and detect_item_id= ?"
  871. err = db.Get(&cdr, sql, v.OrderId, v.DetectItemID)
  872. //存在数据就update 不存在就insert
  873. if err != nil {
  874. //insert
  875. sql = "insert t_custom_detect_result(order_no,detect_item_id,final,unit,refValue,age,gender,final_status,createdAt,is_self) values(?,?,?,?,?,?,?,?,?,?)"
  876. sqlResult, err = tx.Exec(sql, v.OrderId, v.DetectItemID, v.Final, v.Unit, v.RefValue, age, gender, v.Status, v.CreatedAt, v.IsSelf)
  877. } else {
  878. //update
  879. sql = "update t_custom_detect_result set final = ?,unit=?,refValue=?,age=?,gender=?,final_status=?,is_self=? where order_no=? and detect_item_id=?"
  880. sqlResult, err = tx.Exec(sql, v.Final, v.Unit, v.RefValue, age, gender, v.Status, v.IsSelf, v.OrderId, v.DetectItemID)
  881. }
  882. //执行结果
  883. if err != nil {
  884. tx.Rollback()
  885. return false, err
  886. }
  887. if la, err := sqlResult.RowsAffected(); la <= 0 {
  888. fmt.Println(err)
  889. }
  890. }
  891. tx.Commit()
  892. return true, nil
  893. }
  894. func (dus *DeliverUserService) GetIsSkip(duId int, isSkip string) (bool, error) {
  895. strSql := "update t_deliver_user set is_skip = ?,update_time=? where id = ?;"
  896. db := util.GetWriteSqlDB()
  897. sqlResult, err := db.Exec(strSql, isSkip, time.Now().Format("2006-01-02 15:04:05"), duId)
  898. if err != nil {
  899. return false, err
  900. }
  901. if la, _ := sqlResult.RowsAffected(); la <= 0 {
  902. return false, errors.New("1::更新失败")
  903. }
  904. return true, nil
  905. }
  906. //20210819 护士出门签到200 发送验证码
  907. func (dus *DeliverUserService) SendVCode(orderId string) error {
  908. const sms_key string = "xn:sms_key:"
  909. smsType := 25
  910. vcode := generateValidateCode(6)
  911. strSql := "select * from t_sms_tpl where id = ?;"
  912. db := util.GetSqlDB()
  913. var smsTpl = struct {
  914. Content string `db:"content"`
  915. Id int `db:"id"`
  916. HasCode uint8 `db:"has_code"`
  917. CodeType int `db:"code_type"`
  918. }{}
  919. db.Get(&smsTpl, strSql, smsType)
  920. if smsTpl.Content == "" {
  921. return fmt.Errorf("1:: ordersign 200 err no sms_tpl by %d", smsType)
  922. }
  923. params := map[string]string{}
  924. params["code"] = vcode
  925. smsContent := strings.Replace(smsTpl.Content, "{code}", vcode, -1)
  926. //smsContent = strings.Replace()"您的订单【{OrderId}】"
  927. var item struct {
  928. Mobile string `db:"mobile"`
  929. VisitDate string `db:"visit_date"`
  930. TimeRange string `db:"visit_time_range"`
  931. VCode null.String `db:"vcode"`
  932. }
  933. //20210903 这里加了一个redis 锁,注意此处用法忽略了上完锁后没有设置过期时间就立刻挂掉的情况
  934. client := util.GetRedis()
  935. client.Select(14)
  936. cmd := client.SetNX(sms_key+item.Mobile, "1")
  937. if !cmd.Val() || cmd.Err() != nil {
  938. log.Println(cmd.Err())
  939. return fmt.Errorf("6:: redis error")
  940. }
  941. client.Expire(sms_key+item.Mobile, time.Second*3)
  942. defer client.Del(sms_key + item.Mobile)
  943. strSql = "select mobile,visit_date,visit_time_range,vcode from t_order where id = ? "
  944. db.Get(&item, strSql, orderId)
  945. if !util.IsMobile(item.Mobile) {
  946. return fmt.Errorf("2:: ordersign 200 err mobile %s by id %s ", item.Mobile, orderId)
  947. }
  948. //如果vcode 不为空,直接返回
  949. if item.VCode.Valid && item.VCode.String != "" {
  950. return nil
  951. }
  952. strSql = "update t_order set vcode = ? where mobile = ? and visit_date = ? and visit_time_range = ?"
  953. //sqlResult, err := db.Exec(strSql, vcode, orderId)
  954. sqlResult, err := db.Exec(strSql, vcode, item.Mobile, item.VisitDate, item.TimeRange)
  955. if err != nil {
  956. return fmt.Errorf("4:: ordersign 200 err update order vcode err id %s err:%s", orderId, err.Error())
  957. }
  958. if la, _ := sqlResult.RowsAffected(); la <= 0 {
  959. return fmt.Errorf("5:: ordersign 200 err update order vcode err id %s", orderId)
  960. }
  961. err = util.SendSMS(item.Mobile, smsContent)
  962. if err != nil {
  963. return fmt.Errorf("3:: ordersign 200 err send mobile %s err:%s", item.Mobile, err.Error())
  964. }
  965. return nil
  966. }
  967. //20210819 护士签到201 校验证码
  968. func (dus *DeliverUserService) VerifyCode(orderId, vCode string) error {
  969. stuff := struct {
  970. Code null.String `db:"vcode"`
  971. Source string `db:"source"`
  972. }{}
  973. db := util.GetSqlDB()
  974. strSql := "select vcode,source from t_order where id = ? limit 1"
  975. db.Get(&stuff, strSql, orderId)
  976. //fmt.Println(err)
  977. if stuff.Source != "jd-jyd" {
  978. //todo 判断jd-jyd 走流程
  979. if vCode == getVcodeFromRedis() {
  980. return nil
  981. }
  982. if !strings.EqualFold(vCode, stuff.Code.String) {
  983. return fmt.Errorf("1:: ordersign 201 verify vcode err :your:%s, system:%s by id %s", vCode, stuff.Code.String, orderId)
  984. }
  985. return nil
  986. } else {
  987. //去京东核销
  988. if vCode == getVcodeFromRedis()+"0" {
  989. return nil
  990. }
  991. err := HeXiaoToJD(orderId, vCode)
  992. if err != nil {
  993. return err
  994. }
  995. return nil
  996. }
  997. }
  998. func getVcodeFromRedis() string {
  999. //return "667043"
  1000. return util.GetNurseCode()
  1001. }
  1002. //20210713 增加 t_deliver_workday 日志
  1003. func _insertMongo(name, data string, dbtype int) {
  1004. db := util.GetMgoDB()
  1005. if db == nil {
  1006. return
  1007. }
  1008. defer db.Session.Close()
  1009. err := db.C("t_log").Insert(bson.M{
  1010. "name": name,
  1011. "type": dbtype,
  1012. "data": data,
  1013. "createby": "go",
  1014. "create": time.Now().Format("2006-01-02 15:04:05"),
  1015. })
  1016. if err != nil {
  1017. fmt.Println(err)
  1018. return
  1019. }
  1020. }
  1021. //20220309 jd 核销
  1022. func HeXiaoToJD(orderId, code string) error {
  1023. url := config.IniConf.Section("server").Key("jdapi").String()
  1024. path := "/v2/hexiao"
  1025. reader := bytes.NewReader([]byte(fmt.Sprintf(`{"order_id":"%s","random_code":"%s"}`, orderId, code)))
  1026. resp, err := http.Post(url+path, "application/json", reader)
  1027. if err != nil {
  1028. return fmt.Errorf("access jdservice error:%s", err.Error())
  1029. }
  1030. defer resp.Body.Close()
  1031. resBuf, err := ioutil.ReadAll(resp.Body)
  1032. if err != nil {
  1033. return fmt.Errorf("response jdservice error:%s", err.Error())
  1034. }
  1035. result := map[string]string{}
  1036. err = json.Unmarshal(resBuf, &result)
  1037. if err != nil {
  1038. return fmt.Errorf("jsonUnmarshal jdservice error:%s", string(resBuf))
  1039. }
  1040. if resCode := result["code"]; resCode != "0" {
  1041. return fmt.Errorf("json jdservice error:%s", string(resBuf))
  1042. }
  1043. return nil
  1044. }
  1045. // 20221009 护士加项产品获取考试试题
  1046. func (dus *DeliverUserService) GetProductExam(productid int) (interface{}, error) {
  1047. sql := "select paper_id from t_product_question_map where product_id = ? limit 1"
  1048. db := util.GetSqlDB()
  1049. var err error
  1050. defer fmt.Println(err)
  1051. var paperId int
  1052. db.Get(&paperId, sql, productid)
  1053. if paperId == 0 {
  1054. return nil, fmt.Errorf("1:: no exam by product_id %d", productid)
  1055. }
  1056. sql = "select id,name from t_product_question_title where paper_id = ? and flag = 1 order by sort_no"
  1057. titles := []entity.ProductQuestion{}
  1058. err = db.Select(&titles, sql, paperId)
  1059. if len(titles) == 0 {
  1060. return nil, fmt.Errorf("2:: no exam titles by product_id %d", productid)
  1061. }
  1062. var rn int
  1063. tempIds := map[int]struct{}{}
  1064. l := len(titles)
  1065. num := NOURSE_EXAME_NUMS
  1066. if num > l {
  1067. num = l
  1068. }
  1069. for i := 0; i < num; i++ {
  1070. for {
  1071. rn = rand.Intn(l) //+ 1
  1072. if _, ok := tempIds[rn]; !ok {
  1073. tempIds[rn] = struct{}{}
  1074. break
  1075. }
  1076. }
  1077. }
  1078. var strTitleIds string
  1079. //for k := range titles {
  1080. // strTitleIds += fmt.Sprintf("%d,", titles[k].ID)
  1081. //}
  1082. for k := range tempIds {
  1083. strTitleIds += fmt.Sprintf("%d,", titles[k].ID)
  1084. }
  1085. strTitleIds = strTitleIds[0 : len(strTitleIds)-1]
  1086. sql = "select id,name from t_product_question_title where id in (" + strTitleIds + ") and flag = 1 order by sort_no"
  1087. titles = []entity.ProductQuestion{}
  1088. err = db.Select(&titles, sql)
  1089. options := []entity.ProductOption{}
  1090. sql = "select id ,name,title_id,value from t_product_question_option where title_id in (" + strTitleIds + ") and flag = 1"
  1091. db.Select(&options, sql)
  1092. if len(options) == 0 {
  1093. return nil, fmt.Errorf("3:: no exam options by product_id %d", productid)
  1094. }
  1095. for i := range options {
  1096. for j := range titles {
  1097. if titles[j].ID == options[i].TitleId {
  1098. titles[j].Options = append(titles[j].Options, options[i])
  1099. }
  1100. }
  1101. }
  1102. return titles, nil
  1103. }
  1104. // 20221009 护士加项产品考试检查
  1105. func (dus *DeliverUserService) CheckProductExam(duId int, productId int, answers []entity.ProductQuestion) (interface{}, error) {
  1106. db := util.GetSqlDB()
  1107. // 20221017 这里不增加 is_delete 判断,会影响后续
  1108. strSql := "select count(1) from t_product_question_deliver where deliver_user_id = ? and product_id =? "
  1109. var count int
  1110. db.Get(&count, strSql, duId, productId)
  1111. // 如果已经存在关系,表示考试通过
  1112. if count > 0 {
  1113. return nil, nil
  1114. }
  1115. strIds := ""
  1116. for _, q := range answers {
  1117. strIds += fmt.Sprintf("%d,", q.ID)
  1118. }
  1119. strIds = strIds[0 : len(strIds)-1]
  1120. var eqs = []entity.ProductQuestion{}
  1121. //strSql = "select id, answer_value,paper_id from t_product_question_title where id in(" + strIds + ");"
  1122. strSql = "select t.id, t.answer_value,t.paper_id from t_product_question_map m left join t_product_question_title t on m.paper_id = t.paper_id where m.product_id=? and t.id in (" + strIds + ")"
  1123. //err := db.Select(&eqs, strSql)
  1124. err := db.Select(&eqs, strSql, productId)
  1125. if err != nil {
  1126. return nil, err
  1127. }
  1128. if len(eqs) != len(answers) {
  1129. return nil, fmt.Errorf("1::CheckProductExam data error your answer titles is %s productid is %d", strIds, productId)
  1130. }
  1131. paperId := eqs[0].PaperId
  1132. for _, question := range answers {
  1133. for _, eq := range eqs {
  1134. if question.ID == eq.ID && eq.AnswerValue != question.InAnswerValue {
  1135. return nil, fmt.Errorf("2:: title %d correct answer is %d your answer is %d", eq.ID, eq.AnswerValue, question.InAnswerValue)
  1136. }
  1137. }
  1138. }
  1139. strSql = fmt.Sprintf("insert into t_product_question_deliver (deliver_user_id,product_id,discount_price) select %d,%d, discount_price from t_product_question_map where product_id=? and paper_id=?", duId, productId)
  1140. sqlResult, err := db.Exec(strSql, productId, paperId)
  1141. if err != nil {
  1142. return nil, fmt.Errorf("3:: t_product_question_deliver 创建数据失败 error:%s ,productid: %d, deliver_user_id: %d, paper_id: %d ", err.Error(), productId, duId, paperId)
  1143. }
  1144. if ra, _ := sqlResult.RowsAffected(); ra < 1 {
  1145. return nil, fmt.Errorf("4:: t_product_question_deliver 创建数据失败 productid: %d, deliver_user_id: %d, paper_id: %d", productId, duId, paperId)
  1146. }
  1147. return nil, nil
  1148. }
  1149. // 20221011 护士加项产品列表
  1150. func (dus *DeliverUserService) GetDeliverProductList(pageIndex, pageSize int) (interface{}, error) {
  1151. db := util.GetSqlDB()
  1152. list := []struct {
  1153. Id int `db:"id" json:"id"`
  1154. Name string `db:"name" json:"name"`
  1155. Picture null.String `db:"picture"`
  1156. Price int `db:"price" json:"price"`
  1157. DiscountPrice int `db:"discount_price" json:"discount_price"`
  1158. WikiPath null.String `db:"wiki_path" json:"wiki_path"`
  1159. TitleName null.String `db:"title_name" json:"title_name"`
  1160. PaperId int `db:"paper_id" json:"paper_id"`
  1161. }{}
  1162. if pageIndex < 1 {
  1163. pageIndex = 1
  1164. }
  1165. if pageSize <= 0 {
  1166. pageSize = 10
  1167. }
  1168. limit := fmt.Sprintf(" limit %d,%d ", (pageIndex-1)*pageSize, pageSize)
  1169. // 优惠的在前,按照创建时间倒叙
  1170. sql := "select p.id,p.name,p.picture,p.price,m.discount_price,m.wiki_path,pa.name as title_name ,m.paper_id,CASE WHEN m.paper_id > 0 THEN 1 ELSE 0 END AS flag from t_product_question_map m left join t_product p on p.id = m.product_id left join t_product_question_paper pa on m.paper_id = pa.id where m.is_delete = 0 order by flag DESC ,m.created_at desc " + limit
  1171. db.Select(&list, sql)
  1172. return list, nil
  1173. }
  1174. // 20221011 护士加项判断是否通过
  1175. func (*DeliverUserService) CheckDeliverPass(productId, duId int) (bool, error) {
  1176. db := util.GetSqlDB()
  1177. // 20221017 这里不增加 is_delete 判断,会影响后续
  1178. sql := "select count(1) from t_product_question_deliver where product_id = ? and deliver_user_id = ?"
  1179. var count int
  1180. db.Get(&count, sql, productId, duId)
  1181. if count > 0 {
  1182. return true, nil
  1183. }
  1184. return false, nil
  1185. }
  1186. func (*DeliverUserService) GetProductDiscount(productId, duId int) (int, error) {
  1187. db := util.GetSqlDB()
  1188. sql := "select discount_price from t_product_question_deliver where product_id = ? and deliver_user_id = ? and is_delete = 0"
  1189. var discount int
  1190. err := db.Get(&discount, sql, productId, duId)
  1191. if err != nil {
  1192. return 0, fmt.Errorf("1:: no discount by product_id: %d deliver_user_id: %d", productId, duId)
  1193. }
  1194. return discount, nil
  1195. }
  1196. // 20221017 根据产品id 获取知识库内容
  1197. func (*DeliverUserService) GetWikiByProductId(productId int) (interface{}, error) {
  1198. db := util.GetSqlDB()
  1199. sql := "select paper_id, wiki_path from t_product_question_map where product_id = ?"
  1200. data := struct {
  1201. PaperId int `db:"paper_id" json:"paper_id"`
  1202. WikiPath null.String `db:"wiki_path" json:"wiki_path"`
  1203. }{}
  1204. err := db.Get(&data, sql, productId)
  1205. if err != nil {
  1206. return nil, fmt.Errorf("1:: no wiki by product_id %d", productId)
  1207. }
  1208. return data, nil
  1209. }