home_land.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from smartfarming.models.ascend import MongoBase, MongoLandInfo, MongoPlantInfo, MongoAreaJob, LandPlanInfo, CountryModel, PlanWeekend
  4. from smartfarming.models.user import DeviceUser
  5. from smartfarming.serializers.ascend_serializers import (
  6. BaseSerializers,
  7. MongoLandInfoSerializers,
  8. MongoPlantInfoSerializers,
  9. MongoAreaJobSerializers,
  10. CountryModelSerializers,
  11. PlanWeekendSerializers,
  12. MongoPlanWeekendSerializers,
  13. LandPlanInfoSerializers
  14. )
  15. from django.core.paginator import Paginator
  16. import time
  17. import datetime
  18. from django.db.models import Q, Count
  19. class BaseAPIView(APIView):
  20. def post(self, request):
  21. # 基地列表
  22. query = MongoBase.objects.all().first()
  23. serializers = BaseSerializers(query)
  24. return Response({"code": 0, "msg": "success", "data": serializers.data})
  25. class BaseUpdateAPIView(APIView):
  26. def post(self, request):
  27. # 基地更新
  28. request_data = request.data
  29. base_phone = request_data.get("base_phone")
  30. base_name = request_data.get("base_name")
  31. base_img = request_data.get("base_img")
  32. base_charge = request_data.get("base_charge")
  33. try:
  34. MongoBase.objects.all().update(
  35. base_name=base_name,
  36. base_charge=base_charge,
  37. base_phone=base_phone,
  38. base_img=base_img
  39. )
  40. return Response({"code": 0, "msg": "success"})
  41. except Exception as e:
  42. return Response({"code": 0, "msg": "更新信息失败"})
  43. class MongoLandInfoAPIView(APIView):
  44. def post(self, request):
  45. # 地块列表
  46. request_data = request.data
  47. page_num = int(request_data.get("pagenum")) if request_data.get("pagenum") else 1
  48. page_size = int(request_data.get("pagesize")) if request_data.get("pagesize") else 10
  49. queryset = MongoLandInfo.objects.filter(is_delete=1).order_by("-uptime")
  50. total_obj = queryset.count()
  51. paginator = Paginator(queryset, page_size)
  52. page_obj = paginator.get_page(page_num)
  53. serializers = MongoLandInfoSerializers(page_obj, many=True)
  54. return Response({"code": 0, "msg": "success", "data": serializers.data, "count": total_obj})
  55. class MongoAreaJobDetailAPIView(APIView):
  56. def post(self, request):
  57. # 农事详情
  58. request_data = request.data
  59. land_id = request_data.get("land_id")
  60. query_date = request_data.get("query_date")
  61. page_num = int(request_data.get("pagenum")) if request_data.get("pagenum") else 1
  62. page_size = int(request_data.get("pagesize")) if request_data.get("pagesize") else 10
  63. if query_date:
  64. start = int(query_date[0]/1000)
  65. end = int(query_date[1]/1000)
  66. queryset = MongoAreaJob.objects.filter(land=land_id).filter(uptime__gte=start, uptime__lte=end).order_by("-uptime")
  67. else:
  68. queryset = MongoAreaJob.objects.filter(land=land_id).order_by("-uptime")
  69. total_obj = queryset.count()
  70. paginator = Paginator(queryset, page_size)
  71. page_obj = paginator.get_page(page_num)
  72. serializers = MongoAreaJobSerializers(page_obj, many=True)
  73. return Response({"code": 0, "msg": "success", "data": serializers.data, "count": total_obj})
  74. class MongoAreaJobAddAPIView(APIView):
  75. def post(self, request):
  76. # 农事新增
  77. request_data = request.data
  78. land_id = request_data.get("land_id")
  79. batch = request_data.get("batch")
  80. jobname = request_data.get("jobname")
  81. uptime = int(request_data.get("uptime"))
  82. MongoAreaJob.objects.create(
  83. land=land_id,
  84. batch=batch,
  85. jobname=jobname,
  86. uptime=uptime
  87. )
  88. return Response({"code": 0, "msg": "新增农事成功"})
  89. class MongoLandInfoAddAPIView(APIView):
  90. def post(self, request):
  91. # 地块新增
  92. request_data = request.data
  93. farm = request_data.get("farm")
  94. landname = request_data.get("landname")
  95. user = request_data.get("user")
  96. landaddr = request_data.get("landaddr")
  97. landarea = request_data.get("landarea")
  98. tel = request_data.get("tel")
  99. try:
  100. land = MongoLandInfo.objects.filter(farm=farm, is_delete=1)
  101. if land:
  102. return Response({"code": 2, "msg": "该地块编号已存在,请修改"})
  103. land = MongoLandInfo.objects.create(
  104. farm = farm,
  105. landname = landname,
  106. user = user,
  107. landaddr=landaddr,
  108. landarea=landarea,
  109. tel = tel,
  110. uptime = int(time.time())
  111. )
  112. # 新增地块后初始化一个农事
  113. if land:
  114. LandPlanInfo.objects.create(
  115. land_id=land.id,
  116. addtime=int(time.time())
  117. )
  118. return Response({"code": 0, "msg": "新增地块成功"})
  119. except Exception as e:
  120. print(e)
  121. return Response({"code": 2, "msg": "新增地块失败"})
  122. class MongoLandInfoUpdateAPIView(APIView):
  123. def post(self, request):
  124. # 地块更新
  125. request_data = request.data
  126. land_id = request_data.get("land_id")
  127. landname = request_data.get("landname")
  128. user = request_data.get("user")
  129. tel = request_data.get("tel")
  130. MongoLandInfo.objects.filter(id=land_id).update(
  131. landname = landname,
  132. user = user,
  133. tel = tel,
  134. uptime = int(time.time())
  135. )
  136. return Response({"code": 0, "msg": "更新地块成功"})
  137. class MongoLandInfoDeleteAPIView(APIView):
  138. def post(self, request):
  139. # 地块删除
  140. request_data = request.data
  141. land_id = request_data.get("land_id")
  142. try:
  143. # 核对是否在该地块存在未完成的种植
  144. land_plan = LandPlanInfo.objects.filter(land_id=land_id, recovery_time=0).exclude(plan_id=0)
  145. if land_plan.count():
  146. return Response({"code": 2, "msg": "该地块存在未完成的种植任务,请核对"})
  147. MongoLandInfo.objects.filter(id=land_id).update(is_delete=0)
  148. return Response({"code": 0, "msg": "删除地块成功"})
  149. except Exception as e:
  150. return Response({"code": 2, "msg": "删除地块失败"})
  151. class MongoPlantInfoAPIView(APIView):
  152. def post(self, request):
  153. # 作物列表
  154. request_data = request.data
  155. plantname = request_data.get("plantname")
  156. page_num = int(request_data.get("pagenum")) if request_data.get("pagenum") else 1
  157. page_size = int(request_data.get("pagesize")) if request_data.get("pagesize") else 10
  158. if plantname:
  159. queryset = MongoPlantInfo.objects.filter(is_delete=1, plantname__icontains=plantname).order_by("-uptime")
  160. else:
  161. queryset = MongoPlantInfo.objects.filter(is_delete=1).order_by("-uptime")
  162. total_obj = queryset.count()
  163. paginator = Paginator(queryset, page_size)
  164. page_obj = paginator.get_page(page_num)
  165. serializers = MongoPlantInfoSerializers(page_obj, many=True)
  166. return Response({"code": 0, "msg": "success", "data": serializers.data, "count": total_obj})
  167. class PlanDetailAPIView(APIView):
  168. def post(self, request):
  169. # 作物详情
  170. request_data = request.data
  171. plan_id = request_data.get("plan_id")
  172. queryset = MongoPlantInfo.objects.get(id=plan_id)
  173. serializers = MongoPlanWeekendSerializers(queryset)
  174. return Response({"code": 0, "msg": "success", "data": serializers.data})
  175. class MongoPlantInfoAddAPIView(APIView):
  176. def post(self, request):
  177. # 作物新增
  178. request_data = request.data
  179. batch = request_data.get("batch")
  180. plantname = request_data.get("plantname")
  181. pickcode = request_data.get("pickcode")
  182. planttype = request_data.get("planttype")
  183. plan = MongoPlantInfo.objects.filter(plantname=plantname, planttype=planttype)
  184. if plan:
  185. return Response({"code": 2, "msg": "该作物种类已存在,请核查"})
  186. plan_id = MongoPlantInfo.objects.create(
  187. batch = batch,
  188. plantname = plantname,
  189. pickcode = pickcode,
  190. planttype = planttype,
  191. uptime = int(time.time())
  192. )
  193. if plan_id:
  194. cycle_list = request_data.get("cycle_list")
  195. for c in cycle_list:
  196. PlanWeekend.objects.create(
  197. plan_id=plan_id.id,
  198. name=c.get("name"),
  199. start_time=c.get("time")[0],
  200. end_time=c.get("time")[1],
  201. pest=",".join([str(i) for i in c.get("pest")]),
  202. pick=",".join([str(i) for i in c.get("pick")]),
  203. mark=c.get("mark")
  204. )
  205. return Response({"code": 0, "msg": "新增作物及周期成功"})
  206. class MongoPlantInfoUpdateAPIView(APIView):
  207. def post(self, request):
  208. # 作物更新
  209. request_data = request.data
  210. plan_id = request_data.get("crop_id")
  211. batch = request_data.get("batch")
  212. plantname = request_data.get("plantname")
  213. pickcode = request_data.get("pickcode")
  214. planttype = request_data.get("planttype")
  215. plan = MongoPlantInfo.objects.filter(plantname=plantname, planttype=planttype)
  216. if plan:
  217. return Response({"code": 2, "msg": "该作物种类已存在,请核查"})
  218. MongoPlantInfo.objects.filter(id=plan_id).update(
  219. batch = batch,
  220. plantname = plantname,
  221. pickcode = pickcode,
  222. planttype = planttype,
  223. uptime = int(time.time())
  224. )
  225. cycle_list = request_data.get("cycle_list")
  226. for c in cycle_list:
  227. id = c.get("id", "")
  228. name = c.get("name")
  229. start_time = (c.get("time"))[0]
  230. end_time = (c.get("time"))[1]
  231. pest_lst = [str(i) for i in c.get("pest")]
  232. pest = ",".join(pest_lst)
  233. pick_lst = [str(i) for i in c.get("pick")]
  234. pick = ",".join(pick_lst)
  235. mark = c.get("mark")
  236. if id:
  237. PlanWeekend.objects.filter(id=id, plan_id=plan_id).update(
  238. name=name,
  239. start_time=start_time,
  240. end_time=end_time,
  241. pest=pest,
  242. pick=pick,
  243. mark=mark
  244. )
  245. else:
  246. PlanWeekend.objects.create(
  247. name=name,
  248. plan_id=plan_id,
  249. start_time=start_time,
  250. end_time=end_time,
  251. pest=pest,
  252. pick=pick,
  253. mark=mark
  254. )
  255. return Response({"code": 0, "msg": "success"})
  256. class MongoPlantInfoDeleteAPIView(APIView):
  257. def post(self, request):
  258. # 作物删除
  259. request_data = request.data
  260. plan_id = request_data.get("plan_id")
  261. # 查看此作物有没有被种植
  262. land_plan = LandPlanInfo.objects.filter(plan_id=plan_id)
  263. for k in land_plan:
  264. print(k.id)
  265. if land_plan:
  266. return Response({"code": 2, "msg": "此作物已种植,不能被删除"})
  267. else:
  268. try:
  269. MongoPlantInfo.objects.filter(id=plan_id).update(is_delete=0)
  270. PlanWeekend.objects.filter(plan_id=plan_id).update(is_delete=0)
  271. return Response({"code": 0, "msg": "作物删除成功"})
  272. except Exception as e:
  273. return Response({"code": 0, "msg": "作物删除失败"})
  274. class MongoGrowOperateAPIView(APIView):
  275. def post(self, request):
  276. # 种植新增
  277. request_data = request.data
  278. try:
  279. pl_id = request_data.get("pl_id")
  280. plan_id = request_data.get("plan_id")
  281. plan_time = request_data.get("plan_time")
  282. LandPlanInfo.objects.filter(id=pl_id).update(
  283. plan_id=plan_id,
  284. plan_time=plan_time,
  285. status="采收"
  286. )
  287. return Response({"code": 0, "msg": "地块操作成功"})
  288. except Exception as e:
  289. return Response({"code": 2, "msg": "请检查参数"})
  290. class MongoGrowOperateRecoveryAPIView(APIView):
  291. def post(self, request):
  292. # 种植采收
  293. request_data = request.data
  294. try:
  295. pl_id = request_data.get("pl_id")
  296. recovery_time = request_data.get("recovery_time")
  297. recovery_kg = request_data.get("recovery_kg")
  298. land_plan = LandPlanInfo.objects.filter(id=pl_id, status="采收").order_by("-addtime").first()
  299. land_plan.recovery_kg = recovery_kg
  300. land_plan.recovery_time = recovery_time
  301. land_plan.save()
  302. LandPlanInfo.objects.create(
  303. land_id=land_plan.land_id,
  304. addtime=int(time.time()),
  305. status="种植"
  306. )
  307. return Response({"code": 0, "msg": "地块操作成功"})
  308. except Exception as e:
  309. return Response({"code": 2, "msg": "请检查参数"})
  310. class PlanWeekendAPIView(APIView):
  311. def post(self, request):
  312. # 生成周期列表
  313. queryset = PlanWeekend.objects.filter(is_delete=1)
  314. serializers = PlanWeekendSerializers(queryset, many=True)
  315. return Response({"code": 0, "msg": "success", "data": serializers.data})
  316. class PlanWeekendDelete(APIView):
  317. def post(self, request):
  318. request_data = request.data
  319. try:
  320. PlanWeekend.objects.filter(id=request_data.get("id")).update(is_delete=0)
  321. return Response({"code": 0, "msg": "删除成功"})
  322. except Exception as e:
  323. return Response({"code": 2, "msg": "删除失败"})
  324. class PlanWeekendAddAPIView(APIView):
  325. def post(self, request):
  326. request_data = request.data
  327. try:
  328. PlanWeekend.objects.create(
  329. plan_id=request_data.get("plan_id"),
  330. name=request_data.get("name"),
  331. start_time=request_data.get("start_time"),
  332. end_time=request_data.get("end_time"),
  333. pest=request_data.get("pest"),
  334. pick=request_data.get("pick"),
  335. mark=request_data.get("mark")
  336. )
  337. return Response({"code": 0, "msg": "success"})
  338. except Exception as e:
  339. return Response({"code": 2, "msg": "添加失败"})
  340. class CountryModelAPIView(APIView):
  341. def post(self, request):
  342. # 乡村列表
  343. request_data = request.data
  344. page_num = int(request_data.get("pagenum")) if request_data.get("pagenum") else 1
  345. page_size = int(request_data.get("pagesize")) if request_data.get("pagesize") else 10
  346. title = request_data.get("title")
  347. if title:
  348. queryset = CountryModel.objects.filter(is_delete=1, title__icontains=title).order_by("-uptime")
  349. else:
  350. queryset = CountryModel.objects.filter(is_delete=1).order_by("-uptime")
  351. total_obj = queryset.count()
  352. paginator = Paginator(queryset, page_size)
  353. page_obj = paginator.get_page(page_num)
  354. serializers = CountryModelSerializers(page_obj, many=True)
  355. return Response({"code": 0, "msg": "success", "data": serializers.data, "count": total_obj})
  356. class CountryModelAddAPIView(APIView):
  357. def post(self, request):
  358. # 乡村增加
  359. request_data = request.data
  360. CountryModel.objects.create(
  361. title=request_data.get("title"),
  362. cover_img=request_data.get("cover_img"),
  363. introduce=request_data.get("introduce"),
  364. content=request_data.get("content"),
  365. uptime=int(time.time())
  366. )
  367. return Response({"code": 0, "msg": "success"})
  368. class CountryModelUpdateAPIView(APIView):
  369. def post(self, request):
  370. # 乡村增加
  371. request_data = request.data
  372. CountryModel.objects.filter(id=request_data.get("country_id")).update(
  373. title=request_data.get("title"),
  374. cover_img=request_data.get("cover_img"),
  375. introduce=request_data.get("introduce"),
  376. content=request_data.get("content")
  377. )
  378. return Response({"code": 0, "msg": "success"})
  379. class CountryModelDeleteAPIView(APIView):
  380. def post(self, request):
  381. # 乡村删除
  382. request_data = request.data
  383. try:
  384. CountryModel.objects.filter(id=request_data.get("country_id")).update(is_delete=0)
  385. return Response({"code": 0, "msg": "删除成功"})
  386. except Exception as e:
  387. return Response({"code": 2, "msg": "删除失败"})
  388. class LandPlanInfoAPIView(APIView):
  389. def post(self, request):
  390. # 种植采收列表及统计信息
  391. request_data = request.data
  392. plan = request_data.get("plan")
  393. year = int(request_data.get("year"))
  394. page_num = int(request_data.get("pagenum")) if request_data.get("pagenum") else 1
  395. page_size = int(request_data.get("pagesize")) if request_data.get("pagesize") else 10
  396. start_timestamp = datetime.datetime(year, 1,1,0,0).timestamp()
  397. end_timestatmp = datetime.datetime(year, 12,31,23,59).timestamp()
  398. plan_ids = []
  399. if plan:
  400. plan_ids = MongoPlantInfo.objects.filter(plantname__icontains=plan).values_list("id", flat=True)
  401. if plan_ids and year:
  402. queryset = LandPlanInfo.objects.filter(Q(plan_id__in = plan_ids) & Q(addtime__gte=start_timestamp, addtime__lte=end_timestatmp)).filter(is_delete=1).order_by("-addtime")
  403. elif year:
  404. queryset = LandPlanInfo.objects.filter(addtime__gte=start_timestamp, addtime__lte=end_timestatmp).filter(is_delete=1).order_by("-addtime")
  405. elif plan_ids:
  406. queryset = LandPlanInfo.objects.filter(plan_id__in = plan_ids).filter(is_delete=1).order_by("-addtime")
  407. total_obj = queryset.count()
  408. paginator = Paginator(queryset, page_size)
  409. page_obj = paginator.get_page(page_num)
  410. serializers = LandPlanInfoSerializers(page_obj, many=True)
  411. # 折线图
  412. year_value = LandPlanInfo.objects.all().values_list("addtime", flat=True).order_by("-addtime")
  413. years = []
  414. for year in year_value:
  415. y = datetime.datetime.fromtimestamp(year).year
  416. if y not in years:
  417. years.append(y)
  418. years = years[:5]
  419. # 获取最近5年的作物ID
  420. plan_ids = LandPlanInfo.objects.filter(addtime__gte=start_timestamp, addtime__lte=end_timestatmp).distinct().values_list("plan_id", flat=True).order_by("plan_id")
  421. counts = []
  422. for i in years:
  423. start_timestamp = datetime.datetime(i, 1,1,0,0).timestamp()
  424. end_timestatmp = datetime.datetime(i, 12,31,23,59).timestamp()
  425. plan_totals = LandPlanInfo.objects.filter(addtime__gte=start_timestamp, addtime__lte=end_timestatmp).values("plan_id").annotate(total=Count("plan_id")).order_by("plan_id").values_list("plan_id", "total")
  426. inners = {}
  427. for k in plan_totals:
  428. inners[str(k[0])] = k[1]
  429. pid =[]
  430. for id in plan_ids:
  431. pid.append(inners.get(str(id), 0))
  432. counts.append(pid)
  433. plannames = []
  434. for p in plan_ids:
  435. plan = MongoPlantInfo.objects.filter(id=p)
  436. if plan:
  437. planname = plan.first().plantname + plan.first().planttype
  438. else:
  439. planname = ""
  440. plannames.append(planname)
  441. return Response({
  442. "code": 0,
  443. "msg": "success",
  444. "data": serializers.data,
  445. "count": total_obj,
  446. "charts": {
  447. "years": years,
  448. "data": counts,
  449. "plan": plannames
  450. }
  451. })