contract.go 14 KB

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