contract.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. package contract
  2. import (
  3. "fmt"
  4. "hongze/hongze_mobile_admin/models/custom/contract"
  5. "hongze/hongze_mobile_admin/utils"
  6. "rdluck_tools/orm"
  7. "time"
  8. )
  9. //合同
  10. type Contract struct {
  11. ContractId int `orm:"column(contract_id);pk"`
  12. ContractCode string `description:"合同编号,长度32位"`
  13. SellerId int `description:"所属销售id"`
  14. SellerName string `description:"所属销售名称"`
  15. ProductId int `description:"产品id,1:ficc;2:权益"`
  16. ContractType string `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
  17. Status string `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已签回'"`
  18. StartDate time.Time `description:"合同开始日期"`
  19. EndDate time.Time `description:"合同结束日期"`
  20. OriginalPrice float64 `description:"合同原金额,优惠前的金额"`
  21. Price float64 `description:"实际金额,优惠后的金额"`
  22. PayRemark string `description:"付款方式说明,长度255位"`
  23. CompanyName string `description:"客户名称,甲方名称,长度32位"`
  24. CreditCode string `description:"社会统一信用代码,长度64位"`
  25. ProvinceId int `description:"省级id"`
  26. Province string `description:"省级名称,长度16位"`
  27. CityId int `description:"市级id"`
  28. City string `description:"市级名称,长度32位"`
  29. Address string `description:"详细地址"`
  30. Fax string `description:"传真,长度32位"`
  31. Phone string `description:"电话,长度32位"`
  32. Postcode string `description:"邮编,长度16位"`
  33. Remark string `description:"补充内容,长度255位"`
  34. ModifyContent string `description:"修改内容"`
  35. ApprovalRemark string `description:"审核备注"`
  36. FileUrl string `description:"合同文件地址"`
  37. CheckBackFileUrl string `description:"签回合同文件地址"`
  38. TemplateId int `description:"模板id"`
  39. SourceId int `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
  40. IsDelete int `description:"是否已经删除,0:未删除,1:已删除",json:"-"`
  41. ModifyTime time.Time `description:"合同最近一次修改时间"`
  42. CreateTime time.Time `description:"合同添加时间"`
  43. }
  44. //更新合同基础信息
  45. func (contract *Contract) Update(cols []string) (err error) {
  46. o := orm.NewOrm()
  47. _, err = o.Update(contract, cols...)
  48. return
  49. }
  50. //根据合同id获取合同信息
  51. func GetContractById(contractId int) (contractInfo *Contract, err error) {
  52. o := orm.NewOrm()
  53. sql := `select * from contract where contract_id = ? `
  54. err = o.Raw(sql, contractId).QueryRow(&contractInfo)
  55. return
  56. }
  57. //合同详情信息(包含服务信息等)
  58. type ContractDetail struct {
  59. ContractId int `description:"合同唯一id"`
  60. ContractCode string `description:"合同编号,长度32位"`
  61. SellerId int `description:"所属销售id"`
  62. SellerName string `description:"所属销售名称"`
  63. ProductId int `description:"产品id,1:ficc;2:权益"`
  64. ContractType string `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
  65. Status string `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'"`
  66. StartDate time.Time `description:"合同开始日期"`
  67. EndDate time.Time `description:"合同结束日期"`
  68. OriginalPrice float64 `description:"合同原金额,优惠前的金额"`
  69. Price float64 `description:"实际金额,优惠后的金额"`
  70. PayRemark string `description:"付款方式说明,长度255位"`
  71. CompanyName string `description:"客户名称,甲方名称,长度32位"`
  72. CreditCode string `description:"社会统一信用代码,长度64位"`
  73. ProvinceId int `description:"省级id"`
  74. Province string `description:"省级名称,长度16位"`
  75. CityId int `description:"市级id"`
  76. City string `description:"市级名称,长度32位"`
  77. Address string `description:"详细地址"`
  78. Fax string `description:"传真,长度32位"`
  79. Phone string `description:"电话,长度32位"`
  80. Postcode string `description:"邮编,长度16位"`
  81. Remark string `description:"补充内容,长度255位"`
  82. ModifyContent string `description:"修改内容"`
  83. ApprovalRemark string `description:"审核备注"`
  84. FileUrl string `description:"合同文件地址"`
  85. CheckBackFileUrl string `description:"签回合同文件地址"`
  86. TemplateId int `description:"模板id"`
  87. SourceId int `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
  88. IsDelete int `json:"-";description:"是否已经删除,0:未删除,1:已删除"`
  89. ModifyTime time.Time `description:"合同最近一次修改时间"`
  90. CreateTime time.Time `description:"合同添加时间"`
  91. StartDateStr string `description:"合同起始时间"`
  92. EndDateStr string `description:"合同结束时间"`
  93. ModifyTimeStr string `description:"最近一次更新时间"`
  94. CreateTimeStr string `description:"合同添加时间"`
  95. Service []*contract.ContractServiceAndDetail
  96. }
  97. //根据合同id获取合同详情信息
  98. func GetContractDetailById(contractId int) (contractInfo *ContractDetail, err error) {
  99. o := orm.NewOrm()
  100. sql := `select * from contract where contract_id = ? `
  101. err = o.Raw(sql, contractId).QueryRow(&contractInfo)
  102. return
  103. }
  104. //合同添加
  105. func AddContract(contractInfo *Contract, contractServiceAndDetailList []*contract.ContractServiceAndDetail) (newContract *Contract, err error) {
  106. o := orm.NewOrm()
  107. o.Begin()
  108. defer func() {
  109. if err != nil {
  110. o.Rollback()
  111. } else {
  112. o.Commit()
  113. }
  114. }()
  115. //合同数据入库
  116. contractId, err := o.Insert(contractInfo)
  117. if err != nil {
  118. return
  119. }
  120. contractInfo.ContractId = int(contractId)
  121. for i := 0; i < len(contractServiceAndDetailList); i++ {
  122. //合同服务数据入库
  123. tmpContractService := contractServiceAndDetailList[i]
  124. contractService := &contract.ContractService{
  125. ContractId: int(contractId),
  126. ProductId: contractInfo.ProductId,
  127. ServiceTemplateId: tmpContractService.ServiceTemplateId,
  128. Title: tmpContractService.Title,
  129. Value: tmpContractService.Value,
  130. HasDetail: tmpContractService.HasDetail,
  131. CreateTime: time.Now(),
  132. }
  133. contractServiceId, serviceErr := o.Insert(contractService)
  134. if serviceErr != nil {
  135. err = serviceErr
  136. return
  137. }
  138. contractService.ContractServiceId = int(contractServiceId)
  139. //合同服务详情入库
  140. for j := 0; j < len(tmpContractService.DetailList); j++ {
  141. contractServiceDetail := tmpContractService.DetailList[j]
  142. //合同服务编号
  143. contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  144. contractServiceDetail.ContractId = int(contractId)
  145. contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  146. //合同服务详情入库
  147. contractServiceDetailId, detailErr := o.Insert(contractServiceDetail)
  148. if detailErr != nil {
  149. err = detailErr
  150. return
  151. }
  152. contractServiceDetail.Id = int(contractServiceDetailId)
  153. tmpContractService.DetailList[j] = contractServiceDetail
  154. }
  155. }
  156. newContract = contractInfo
  157. return
  158. }
  159. type ContractList struct {
  160. ContractId int `description:"合同唯一id"`
  161. ContractCode string `description:"合同编号,长度32位"`
  162. SellerId int `description:"所属销售id"`
  163. SellerName string `description:"所属销售名称"`
  164. ProductId int `description:"产品id,1:ficc;2:权益"`
  165. ContractType string `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
  166. Status string `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'"`
  167. StartDate time.Time `json:"-";description:"合同开始日期"`
  168. EndDate time.Time `json:"-";description:"合同结束日期"`
  169. OriginalPrice float64 `description:"合同原金额,优惠前的金额"`
  170. Price float64 `description:"实际金额,优惠后的金额"`
  171. PayRemark string `description:"付款方式说明,长度255位"`
  172. CompanyName string `description:"客户名称,甲方名称,长度32位"`
  173. CreditCode string `description:"社会统一信用代码,长度64位"`
  174. ProvinceId int `description:"省级id"`
  175. Province string `description:"省级名称,长度16位"`
  176. CityId int `description:"市级id"`
  177. City string `description:"市级名称,长度32位"`
  178. Address string `description:"详细地址"`
  179. Fax string `description:"传真,长度32位"`
  180. Phone string `description:"电话,长度32位"`
  181. Postcode string `description:"邮编,长度16位"`
  182. Remark string `json:"-";description:"补充内容,长度255位"`
  183. ApprovalRemark string `description:"审核备注"`
  184. ModifyContent string `description:"修改内容"`
  185. FileUrl string `description:"合同文件地址"`
  186. TemplateId int `description:"模板id"`
  187. SourceId int `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
  188. IsDelete int `json:"-";description:"是否已经删除,0:未删除,1:已删除"`
  189. ModifyTime time.Time `json:"-";description:"合同最近一次修改时间"`
  190. CreateTime time.Time `json:"-";description:"合同添加时间"`
  191. StartDateStr string `description:"合同起始时间"`
  192. EndDateStr string `description:"合同结束时间"`
  193. ModifyTimeStr string `description:"最近一次更新时间"`
  194. CreateTimeStr string `description:"合同添加时间"`
  195. Service []*contract.ContractServiceAndDetail
  196. }
  197. //获取合同列表数据数量
  198. func GetContractListCount(condition string, pars []interface{}) (count int, err error) {
  199. o := orm.NewOrm()
  200. sql := "select count(*) AS COUNT from contract where 1=1 AND is_delete = 0 "
  201. sql += condition
  202. err = o.Raw(sql, pars).QueryRow(&count)
  203. return
  204. }
  205. //获取合同列表数据
  206. func GetContractList(condition string, pars []interface{}, startSize, pageSize int) (list []*ContractList, err error) {
  207. o := orm.NewOrm()
  208. sql := "select * from contract where 1=1 AND is_delete = 0 "
  209. sql += condition
  210. sql += ` order by modify_time desc LIMIT ?,? `
  211. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
  212. return
  213. }
  214. //修改合同
  215. func EditContract(contractInfo *Contract, contractServiceAndDetailList []*contract.ContractServiceAndDetail) (err error) {
  216. o := orm.NewOrm()
  217. o.Begin()
  218. defer func() {
  219. if err != nil {
  220. o.Rollback()
  221. } else {
  222. o.Commit()
  223. }
  224. }()
  225. contractId := contractInfo.ContractId
  226. //合同数据入库
  227. _, err = o.Update(contractInfo)
  228. if err != nil {
  229. return
  230. }
  231. //删除合同的原始服务信息
  232. sql := `delete from contract_service where contract_id = ?`
  233. _, err = o.Raw(sql, contractId).Exec()
  234. //删除合同的原始服务详情信息
  235. sql = `delete from contract_service_detail where contract_id = ?`
  236. _, err = o.Raw(sql, contractId).Exec()
  237. for i := 0; i < len(contractServiceAndDetailList); i++ {
  238. //合同服务数据入库
  239. tmpContractService := contractServiceAndDetailList[i]
  240. contractService := &contract.ContractService{
  241. ContractId: int(contractId),
  242. Title: tmpContractService.Title,
  243. ProductId: contractInfo.ProductId,
  244. ServiceTemplateId: tmpContractService.ServiceTemplateId,
  245. Value: tmpContractService.Value,
  246. HasDetail: tmpContractService.HasDetail,
  247. CreateTime: time.Now(),
  248. }
  249. contractServiceId, serviceErr := o.Insert(contractService)
  250. if serviceErr != nil {
  251. err = serviceErr
  252. return
  253. }
  254. contractService.ContractServiceId = int(contractServiceId)
  255. //合同服务详情入库
  256. for j := 0; j < len(tmpContractService.DetailList); j++ {
  257. contractServiceDetail := tmpContractService.DetailList[j]
  258. //合同服务编号
  259. contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  260. contractServiceDetail.ContractId = contractService.ContractId
  261. contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  262. //合同服务详情入库
  263. contractServiceDetailId, detailErr := o.Insert(contractServiceDetail)
  264. if detailErr != nil {
  265. err = detailErr
  266. return
  267. }
  268. contractServiceDetail.Id = int(contractServiceDetailId)
  269. tmpContractService.DetailList[j] = contractServiceDetail
  270. }
  271. }
  272. return
  273. }
  274. //添加生成后的合同地址
  275. func AddContractPdf(contractId int, pdfUrl string) (err error) {
  276. o := orm.NewOrm()
  277. //删除合同的原始服务信息
  278. sql := `update contract set file_url=? where contract_id = ?`
  279. _, err = o.Raw(sql, pdfUrl, contractId).Exec()
  280. return
  281. }
  282. //删除合同
  283. func DeleteContract(contractInfo *Contract) (err error) {
  284. o := orm.NewOrm()
  285. o.Begin()
  286. defer func() {
  287. if err != nil {
  288. o.Rollback()
  289. } else {
  290. o.Commit()
  291. }
  292. }()
  293. contractInfo.IsDelete = 1
  294. contractInfo.ModifyTime = time.Now()
  295. //合同数据入库
  296. _, err = o.Update(contractInfo)
  297. if err != nil {
  298. return
  299. }
  300. return
  301. }
  302. //作废合同
  303. func InvalidContract(contractInfo *Contract) (err error) {
  304. o := orm.NewOrm()
  305. o.Begin()
  306. defer func() {
  307. if err != nil {
  308. o.Rollback()
  309. } else {
  310. o.Commit()
  311. }
  312. }()
  313. contractInfo.Status = "已作废"
  314. contractInfo.ModifyTime = time.Now()
  315. //合同数据入库
  316. _, err = o.Update(contractInfo)
  317. if err != nil {
  318. return
  319. }
  320. return
  321. }
  322. //生成合同编号
  323. func GetCompanyContractCode(productId int) (companyCode string, err error) {
  324. var num int
  325. o := orm.NewOrm()
  326. today := utils.GetToday(utils.FormatDate)
  327. sql := `SELECT COUNT(1) AS num FROM contract where create_time>=?`
  328. err = o.Raw(sql, today).QueryRow(&num)
  329. if err != nil {
  330. return
  331. }
  332. companyType := ""
  333. switch productId {
  334. case 1:
  335. companyType = "FICC"
  336. case 2:
  337. companyType = "EQ"
  338. }
  339. companyCode = "HZ" + companyType + time.Now().Format("20060102") + fmt.Sprintf("%03d", num)
  340. return
  341. }
  342. type CompanyNameList struct {
  343. CompanyName string `description:"客户名称,甲方名称,长度32位"`
  344. }
  345. //获取客户名称列表数据
  346. func GetCompanyNameList(name string) (list []*CompanyNameList, err error) {
  347. o := orm.NewOrm()
  348. sql := `select * from contract where company_name like '%` + name + `%' group by company_name order by modify_time desc `
  349. _, err = o.Raw(sql).QueryRows(&list)
  350. return
  351. }