home_land.py 17 KB

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