123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514 |
- package dal
- import (
- "database/sql"
- "encoding/json"
- "errors"
- "fmt"
- "github.com/leeqvip/gophp/serialize"
- "gopkg.in/mgo.v2/bson"
- "sort"
- "strconv"
- "time"
- "github.com/jmoiron/sqlx"
- _ "github.com/leeqvip/gophp"
- "gopkg.in/guregu/null.v3"
- "xiaoniaokuaiyan.com/xiaoniao/entity"
- "xiaoniaokuaiyan.com/xiaoniao/util"
- )
- type DeliverUserDal struct {
- }
- type DUOrderItem struct {
- OrderId string `db:"id" json:"order_id"`
- CustomName string `db:"name" json:"name"`
- Gender string `db:"gender" json:"gender"`
- Age uint8 `db:"age" json:"age"`
- Birthday string `db:"birthday" json:"birthday"`
- CustomMobile string `db:"mobile" json:"mobile"`
- Address string `db:"address" json:"address"`
- BookTime null.String `db:"book_time" json:"book_time"`
- OrderStatus int `db:"status" json:"order_status"`
- Products []DUProduct `db:"-" json:"products"`
- NeedEmptiness null.Int `db:"need_emptiness" json:"need_emptiness"`
- ReportPeriod null.String `db:"report_period" json:"report_period"`
- PressurePipe null.String `db:"pressure_pipe" json:"pressure_pipe"`
- BloodAddress null.String `db:"blood_address" json:"blood_address"`
- Notice null.String `db:"notice" json:"notice"`
- Remark1 null.String `db:"remark1" json:"remark1"`
- GetType null.String `db:"get_type" json:"get_type"`
- DeliverUsers []DU `db:"-" json:"deliver_users"`
- EVisitDate null.String `db:"e_visit_date" json:"EVisitDate"`
- EVisitTimeRange null.String `db:"e_visit_time_range" json:"EVisitTimeRange"`
- IdNum null.String `db:"id_num" json:"IdNum"`
- NucleinType uint8 `db:"nuclein_type" json:"nuclein_type"`
- }
- type DUOrderItemV2 struct {
- DUOrderItem
- IsDone bool `json:"is_done"`
- }
- type DU struct {
- Name string `db:"name" json:"name"`
- Tel string `db:"tel" json:"tel"`
- Career string `db:"career" json:"career"`
- }
- type DUProduct struct {
- Name string `db:"name" json:"name"`
- ItemNames string `db:"item_names" json:"item_names"`
- Searchs string `db:"searchs" json:"searchs"`
- }
- func (dud *DeliverUserDal) GetOrderList(openid string, status, pageIndex, pageSize int) (interface{}, error) {
- //20230403 只查100 去掉110
- strStatus := " status in (3,4, 6, 11) and t3.retype in ('100') "
- whereStr := " where t1.openid = ? and" + strStatus
- params := []interface{}{
- openid,
- }
- strSql := `select t3.id, t3.name, t3.gender, t3.birthday, t3.age, t3.mobile,t3.status, concat(t3.address, t3.detail_address) as address, concat(t3.visit_date, ' ', t3.visit_time_range) as book_time, t4.need_emptiness, t4.report_period, pressure_pipe,
- blood_address, notice, t4.remark1,t4.e_visit_date,t4.e_visit_time_range,t2.get_type,t3.id_num,t3.nuclein_type
- from t_deliver_user t1 left join t_order_deliver_user t2 on t1.id = t2.deliver_user_id
- right join t_order t3 on t2.order_id = t3.id
- left join t_order_extra t4 on t3.id = t4.order_id `
- dataList := &[]*DUOrderItem{}
- result, err := List(dataList, "("+strSql+whereStr+") t5", strSql+whereStr, " order by t3.visit_date desc , t3.nuclein_type ,t3.visit_time_range", "", params, Pager{PageIndex: pageIndex, PageSize: pageSize})
- if err != nil {
- return nil, err
- }
- strSql = `select t3.*, group_concat(dp.name) as item_names from t_product_detect_product pdp left join t_detect_product dp on pdp.detect_product_id = dp.id right join
- (select t2.id, t2.name,t2.searchs from t_order_product t1 left join t_product t2 on t1.product_id = t2.id where t1.order_id = ?) t3 on pdp.product_id = t3.id`
- strSqlDu := "select t1.name, t1.tel, t2.career from t_deliver_user t1 left join t_order_deliver_user t2 on t1.id = t2.deliver_user_id right join t_order t3 on t2.order_id = t3.id where t3.id = ?"
- db := util.GetSqlDB()
- for _, item := range *dataList {
- pitems := []DUProduct{}
- err = db.Select(&pitems, strSql, item.OrderId)
- if err != nil {
- return nil, err
- }
- item.Products = pitems
- //fetch deliver user info
- duList := []DU{}
- err = db.Select(&duList, strSqlDu, item.OrderId)
- if err != nil {
- return nil, err
- }
- item.DeliverUsers = duList
- }
- return result, nil
- }
- // 20220225
- func (dud *DeliverUserDal) GetOrderListV2(openid string, pageIndex, pageSize int) (interface{}, error) {
- //20230403 只查100 去掉110
- strStatus := " status = 3 and t3.retype in ('100') "
- whereStr := " where t1.openid = ? and" + strStatus
- db := util.GetSqlDB()
- strSql := `select t3.id, t3.name, t3.gender, t3.birthday, t3.age, t3.mobile,t3.status, concat(t3.address, t3.detail_address) as address, concat(t3.visit_date, ' ', t3.visit_time_range) as book_time, t4.need_emptiness, t4.report_period, pressure_pipe,
- blood_address, notice, t4.remark1,t4.e_visit_date,t4.e_visit_time_range,t2.get_type,t3.id_num,t3.nuclein_type
- from t_deliver_user t1 left join t_order_deliver_user t2 on t1.id = t2.deliver_user_id
- right join t_order t3 on t2.order_id = t3.id
- left join t_order_extra t4 on t3.id = t4.order_id `
- dataList := []*DUOrderItemV2{}
- err := db.Select(&dataList, strSql+whereStr+" order by t3.visit_date desc , t3.nuclein_type ,t3.visit_time_range limit 100", openid)
- if err != nil {
- return nil, err
- }
- strSql = `select t3.*, group_concat(dp.name) as item_names from t_product_detect_product pdp left join t_detect_product dp on pdp.detect_product_id = dp.id right join
- (select t2.id, t2.name,t2.searchs from t_order_product t1 left join t_product t2 on t1.product_id = t2.id where t1.order_id = ?) t3 on pdp.product_id = t3.id`
- strSqlDu := "select t1.name, t1.tel, t2.career from t_deliver_user t1 left join t_order_deliver_user t2 on t1.id = t2.deliver_user_id right join t_order t3 on t2.order_id = t3.id where t3.id = ?"
- strSqlSign := "select count(1) from t_order_sign where order_id = ? and flag='200' and status = '300'"
- done := []*DUOrderItemV2{}
- notDone := []*DUOrderItemV2{}
- for _, item := range dataList {
- pitems := []DUProduct{}
- err = db.Select(&pitems, strSql, item.OrderId)
- if err != nil {
- return nil, err
- }
- item.Products = pitems
- //fetch deliver user info
- duList := []DU{}
- err = db.Select(&duList, strSqlDu, item.OrderId)
- if err != nil {
- return nil, err
- }
- item.DeliverUsers = duList
- count := 0
- db.Get(&count, strSqlSign, item.OrderId)
- item.IsDone = count > 0
- if count > 0 {
- done = append(done, item)
- } else {
- notDone = append(notDone, item)
- }
- }
- return map[string]interface{}{
- "not_done": notDone,
- "done": done,
- }, nil
- }
- func (dud *DeliverUserDal) GetOrderSign(orderId string) (interface{}, error) {
- db := util.GetSqlDB()
- strSql := "select t2.openid,t1.career from t_order_deliver_user t1 inner join t_deliver_user t2 on t1.deliver_user_id = t2.id where t1.order_id = ?"
- deliverUserlist := []struct {
- Openid string `json:"openid"`
- Career string `json:"career"`
- }{}
- err := db.Select(&deliverUserlist, strSql, orderId)
- if err != nil {
- return nil, err
- }
- if len(deliverUserlist) == 0 {
- return map[string]interface{}{
- "deliver_user_list": deliverUserlist,
- "sign_list": nil,
- }, nil
- }
- strSql = "select * from t_order_sign where order_id = ? and flag='200' order by id desc"
- signList := &[]entity.OrderSign{}
- err = db.Select(signList, strSql, orderId)
- if err != nil {
- return nil, err
- }
- orderInfo, _ := DefaultOrderDal.Get(orderId)
- return map[string]interface{}{
- "deliver_user_list": deliverUserlist,
- "sign_list": signList,
- "order_info": orderInfo,
- }, nil
- }
- func (dud *DeliverUserDal) SaveOrderSign(signItem *entity.OrderSign) (interface{}, error) {
- var (
- strSql string
- kv map[string]interface{}
- )
- db := util.GetWriteSqlDB()
- tx := db.MustBegin()
- strSql, kv = util.GenerateInsertSqlFromStruct("t_order_sign", signItem)
- sqlResult, err := tx.NamedExec(strSql, kv)
- if err != nil {
- tx.Rollback()
- return false, err
- }
- if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
- tx.Rollback()
- return false, errors.New("failed to sign")
- }
- if signItem.Status == "400" {
- var mj = struct {
- Code string `json:"code"`
- IsXueYang string `json:"isxieyang"`
- }{}
- err := json.Unmarshal([]byte(signItem.Remark), &mj)
- if err != nil {
- tx.Rollback()
- return nil, err
- }
- //20210927 如果血样是0 则是核酸类,血检条码必须唯一
- if mj.IsXueYang == "0" {
- var count int
- db.Get(&count, "select count(1) from t_order where blood_codes=? and id != ? ", mj.Code, signItem.OrderId)
- if count > 0 {
- tx.Rollback()
- return nil, fmt.Errorf("2::已存在的blood_codes %s", mj.Code)
- }
- }
- tx.Exec("update t_order set blood_codes = ? where id = ?", mj.Code, signItem.OrderId)
- go util.InsertMongo(signItem.OrderId, "护士系统400", 1, map[string]interface{}{"blood_codes": mj.Code, "url": "/duser/saveordersign/400"})
- } else if signItem.Status == "700" {
- //20210218 增加 700 护士修改 订单name gender birthday idnum age 字段 只有在状态3 待上门才可以修改
- //20210223 增加 mobile
- var item = struct {
- Name string `json:"name"`
- Gender string `json:"gender"`
- Birth string `json:"birth"`
- IdNum string `json:"idnum"`
- Mobile string `json:"mobile"`
- }{}
- err := json.Unmarshal([]byte(signItem.Remark), &item)
- if err != nil {
- tx.Rollback()
- return nil, err
- }
- //if len(item.Birth) >= 7 {
- // item.Birth = item.Birth[0:7]
- //}
- birth, err := time.Parse("2006-01-02", item.Birth)
- if err != nil {
- tx.Rollback()
- return nil, err
- }
- age := time.Now().Year() - birth.Year()
- sqlResult, err := tx.Exec("update t_order set name = ?,age = ?,birthday = ?,gender = ?,id_num = ?,mobile = ?,updated_at = ? where id = ? and status = 3", item.Name, age, item.Birth, item.Gender, item.IdNum, item.Mobile, time.Now().Format("2006-01-02 15:04:05"), signItem.OrderId)
- if err != nil {
- tx.Rollback()
- return nil, err
- }
- if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
- tx.Rollback()
- return nil, fmt.Errorf("7::name:%s,age:%d,birth:%s,gender:%s,idnum:%s,orderid:%s", item.Name, age, item.Birth, item.Gender, item.IdNum, signItem.OrderId)
- }
- go util.InsertMongo(signItem.OrderId, "护士系统700", 1, map[string]interface{}{"name": item.Name, "age": age, "birthday": item.Birth, "gender": item.Gender, "id_num": item.IdNum, "mobile": item.Mobile, "url": "/duser/saveordersign/700"})
- }
- tx.Commit()
- return true, nil
- }
- var DefaultDeliverUserDal = &DeliverUserDal{}
- func (dud *DeliverUserDal) Get(openid string) (*entity.DeliverUser, error) {
- db := util.GetSqlDB()
- strSql := "select * from t_deliver_user where openid = ? and is_delete = 1;"
- var du = entity.DeliverUser{}
- err := db.Get(&du, strSql, openid)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, errors.New("1::not exists")
- }
- return nil, err
- }
- du.Qualifiction, _ = getDeliverUserPic(du.Id, "qualifiction")
- du.License, _ = getDeliverUserPic(du.Id, "license")
- du.Photo, _ = getDeliverUserPic(du.Id, "photo")
- return &du, nil
- }
- func getDeliverUserPic(id uint64, pType string) ([]string, error) {
- db := util.GetSqlDB()
- strSql := "select pic from t_deliver_user_pic where delever_uer_id = ? and type = ? and is_delete = 'N' "
- var list = []string{}
- err := db.Select(&list, strSql, id, pType)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, errors.New("1::not exists")
- }
- return nil, err
- }
- return list, nil
- }
- func (dud *DeliverUserDal) SaveDU(duItem *entity.DeliverUser) (bool, error) {
- db := util.GetWriteSqlDB()
- if len(duItem.Openid) > 0 {
- strSql := "select tel from t_deliver_user where openid =? and is_delete <>2 limit 1;"
- var tel null.String
- err := db.Get(&tel, strSql, duItem.Openid)
- if err == nil {
- if !tel.Valid || (tel.Valid && len(tel.String) == 0) {
- //todo 更新 tel
- db.Exec("update t_deliver_user set tel = ? where openid = ?", duItem.Tel, duItem.Openid)
- return true, nil
- } else if tel.String != duItem.Tel {
- return false, errors.New("2:: already bind another tel")
- }
- }
- }
- strSql := "select id from t_deliver_user where tel = ? and is_delete <> 2;"
- var eid int
- db.Get(&eid, strSql, duItem.Tel)
- if eid > 0 {
- return false, errors.New("1::already regist")
- }
- strSql, kvs := util.GenerateInsertSqlFromStruct("t_deliver_user", duItem)
- sqlResult, err := db.NamedExec(strSql, kvs)
- if err != nil {
- return false, err
- }
- if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
- return false, errors.New("failed to regist")
- }
- did, _ := sqlResult.LastInsertId()
- //todo 20210312 保存到mongo t_log
- jsonbyte, err := serialize.Marshal(_map2map(kvs))
- if err != nil {
- //return false ,err
- fmt.Println(err.Error())
- } else {
- _insertMongo(strconv.FormatInt(did, 10), string(jsonbyte), 15)
- }
- strSql = "insert into t_deliver_user_pic(delever_uer_id, type,pic,create_time) values(?,?,?,?);"
- var ctime = time.Now().Format("2006-01-02 15:05:05")
- for _, ql := range duItem.Qualifiction {
- db.Exec(strSql, did, "qualifiction", ql, ctime)
- }
- for _, lc := range duItem.License {
- db.Exec(strSql, did, "license", lc, ctime)
- }
- for _, pt := range duItem.Photo {
- db.Exec(strSql, did, "photo", pt, ctime)
- }
- db.Exec("insert into t_deliver_account(deliver_user_id, created_at) values(?,?);", did, ctime)
- return true, nil
- }
- func (dud *DeliverUserDal) UpdateDU(duItem *entity.DeliverUser) (interface{}, error) {
- db := util.GetWriteSqlDB()
- tx := db.MustBegin()
- strSql, kvs := util.GenerateUpdateSqlFromStruct("t_deliver_user", duItem, " where id=:id")
- sqlResult, err := tx.NamedExec(strSql, kvs)
- if err != nil {
- tx.Tx.Rollback()
- return false, err
- }
- if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
- tx.Tx.Rollback()
- return false, errors.New("1::failed to update")
- }
- //todo 20210312 保存到mongo t_log
- jsonbyte, err := serialize.Marshal(_map2map(kvs))
- if err != nil {
- //tx.Tx.Rollback()
- //return false ,err
- fmt.Println(err.Error())
- } else {
- _insertMongo(strconv.FormatUint(duItem.Id, 10), string(jsonbyte), 17)
- }
- if err = _updatePic(tx, duItem.Id, "qualifiction", duItem.Qualifiction); err != nil {
- return nil, err
- }
- if err = _updatePic(tx, duItem.Id, "license", duItem.License); err != nil {
- return nil, err
- }
- if err = _updatePic(tx, duItem.Id, "photo", duItem.Photo); err != nil {
- return nil, err
- }
- tx.Commit()
- return true, nil
- }
- func _insertMongo(name, data string, dbtype int) {
- db := util.GetMgoDB()
- if db == nil {
- return
- }
- defer db.Session.Close()
- err := db.C("t_log").Insert(bson.M{
- "name": name,
- "type": dbtype,
- "data": data,
- "createby": "go",
- "create": time.Now().Format("2006-01-02 15:04:05"),
- })
- if err != nil {
- fmt.Println(err)
- return
- }
- }
- // null 转换成 普通类型,否则php 序列化过不去
- func _map2map(kvs map[string]interface{}) map[string]interface{} {
- resultMap := map[string]interface{}{}
- for k, v := range kvs {
- //t := reflect.TypeOf(v)
- //switch t.Kind() {
- //case reflect.TypeOf(null.String{}).Kind():
- // if v.(null.String).Valid{
- // resultMap[k]=v.(null.String).String
- // }
- //case reflect.TypeOf(null.Int{}).Kind():
- // if v.(null.Int).Valid{
- // resultMap[k]=v.(null.Int).Int64
- // }
- //default:
- // resultMap[k]=v
- // }
- if nullString, ok := v.(null.String); ok {
- resultMap[k] = nullString.String
- } else if nullInt, ok := v.(null.Int); ok {
- resultMap[k] = nullInt.Int64
- } else {
- resultMap[k] = v
- }
- }
- return resultMap
- }
- func _updatePic(tx *sqlx.Tx, duId uint64, typ string, pics []string) error {
- if len(pics) > 0 {
- strSql := "delete from t_deliver_user_pic where delever_uer_id = ? and type = ?;"
- tx.MustExec(strSql, duId, typ)
- strSql = ""
- var ctime = time.Now().Format("2006-01-02 15:05:05")
- for i, ql := range pics {
- strSql += fmt.Sprintf("(%d,'%s','%s','%s')", duId, typ, ql, ctime)
- if i < len(pics)-1 {
- strSql += ","
- }
- }
- strSql = "insert into t_deliver_user_pic(delever_uer_id, type,pic,create_time) values" + strSql
- sqlResult := tx.MustExec(strSql)
- if ra, _ := sqlResult.RowsAffected(); ra <= 0 {
- tx.Tx.Rollback()
- return errors.New("2::failed to update " + typ)
- }
- }
- return nil
- }
- func (dud *DeliverUserDal) GetBills(duId int, pageIndex, pageSize int) (interface{}, error) {
- per := Pager{PageIndex: pageIndex, PageSize: pageSize}
- var bills = []entity.DeliverBill{}
- result, err := List(&bills, "t_deliver_bill", "select * from t_deliver_bill", " order by created_at desc", "where deliver_user_id = ? and status = '300' ", []interface{}{duId}, per)
- return result, err
- }
- func (dud *DeliverUserDal) GetMsg(duId int, pageIndex, pageSize int, cityId int) (interface{}, error) {
- per := Pager{PageIndex: pageIndex, PageSize: pageSize}
- var msgList = []entity.DeliverMsg{}
- result, err := List(&msgList, "t_deliver_msg", "select * from t_deliver_msg", " order by created_at desc", "where deliver_user_id = ? ", []interface{}{duId}, per)
- var pubMsglist = []entity.DeliverMsg{}
- strSql := fmt.Sprintf("SELECT t1.*,t2.is_read from t_deliver_pubmsg t1 left join t_deliver_msg t2 on t1.id = t2.ref_id where city_ids REGEXP ',?%d,?' order by created_at desc limit 10", cityId)
- db := util.GetWriteSqlDB()
- err = db.Select(&pubMsglist, strSql)
- if err != nil {
- return nil, err
- }
- strSql = "insert into t_deliver_msg(deliver_user_id, title, content,created_at, ref_id) values"
- for _, msg := range pubMsglist {
- if !msg.IsRead.Valid {
- strSql += fmt.Sprintf("(%d,'%s','%s', '%s', %d),", duId, msg.Title, msg.Content, msg.CreatedAt, msg.Id)
- msgList = append(msgList, msg)
- }
- }
- strSql = strSql[0 : len(strSql)-1]
- db.Exec(strSql)
- sort.Slice(msgList, func(i, j int) bool {
- return msgList[i].CreatedAt > msgList[j].CreatedAt
- })
- return result, err
- }
- func (dud *DeliverUserDal) GetScoreBill(duId int, pageIndex, pageSize int, typ string) (interface{}, error) {
- per := Pager{PageIndex: pageIndex, PageSize: pageSize}
- var bills = []entity.DeliverScoreBill{}
- params := []interface{}{duId}
- var whereStr = "where deliver_user_id = ? "
- if typ == "score" {
- whereStr += "and type in('SIGNIN', 'ORDER', 'INVITE_F', 'STUDY_DATA','AUTOTRANS', 'INVITE_F_EXAM', 'DAILY_QUESTION','CHECK','INVITE_EXAM','CHECK_F') "
- } else if typ == "cash" {
- whereStr += "and type in('WITHDRAW','SCORECHSH') "
- }
- result, err := List(&bills, "t_deliver_score_bill", "select * from t_deliver_score_bill", " order by created_at desc", whereStr, params, per)
- return result, err
- }
|