From ebcb37c23a8ac6bf90224619222178f570d5c9e6 Mon Sep 17 00:00:00 2001
From: jlt <jltdev@163.com>
Date: Sun, 27 Mar 2022 20:04:17 +0800
Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90=E6=A1=86=E6=9E=B6=E7=94=9F?=
 =?UTF-8?q?=E6=88=90=E7=9A=84=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=83=BD=E8=BF=90?=
 =?UTF-8?q?=E8=A1=8C=E4=BD=86=E9=9C=80=E8=A6=81=E9=80=90=E4=B8=AA=E7=BB=86?=
 =?UTF-8?q?=E5=8C=96=EF=BC=8C=E9=83=A8=E5=88=86=E5=8A=9F=E8=83=BD=E5=89=8D?=
 =?UTF-8?q?=E7=AB=AF=E9=83=A8=E5=88=86=E9=9C=80=E8=A6=81=E9=87=8D=E6=96=B0?=
 =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=91=BD=E5=90=8D=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/ArchedRecordController.java    | 104 +++++
 .../csa/controller/CoinRecordController.java  | 104 +++++
 .../CommunicateRecordController.java          | 104 +++++
 .../csa/controller/CropFilesController.java   | 104 +++++
 .../csa/controller/CropPhaseController.java   | 104 +++++
 .../csa/controller/CsaFarmerController.java   | 104 +++++
 .../controller/CsaMemberCardController.java   | 104 +++++
 .../controller/GardenLogAttachController.java | 104 +++++
 .../csa/controller/GardenLogController.java   | 104 +++++
 .../controller/GardenStrainController.java    | 104 +++++
 .../csa/controller/PickDetailController.java  | 104 +++++
 .../csa/controller/TendTaskController.java    | 104 +++++
 .../java/com/jlt/csa/domain/ArchedRecord.java | 167 ++++++++
 .../java/com/jlt/csa/domain/CoinRecord.java   | 170 ++++++++
 .../com/jlt/csa/domain/CommunicateRecord.java | 199 +++++++++
 .../java/com/jlt/csa/domain/CropFiles.java    | 123 ++++++
 .../java/com/jlt/csa/domain/CropPhase.java    | 124 ++++++
 .../java/com/jlt/csa/domain/CsaFarmer.java    | 200 +++++++++
 .../com/jlt/csa/domain/CsaMemberCard.java     | 226 ++++++++++
 .../main/java/com/jlt/csa/domain/Garden.java  |  14 -
 .../java/com/jlt/csa/domain/GardenLog.java    | 170 ++++++++
 .../com/jlt/csa/domain/GardenLogAttach.java   | 169 ++++++++
 .../java/com/jlt/csa/domain/GardenStrain.java | 242 +++++++++++
 .../java/com/jlt/csa/domain/PickDetail.java   | 124 ++++++
 .../java/com/jlt/csa/domain/TendTask.java     | 240 +++++++++++
 .../jlt/csa/mapper/ArchedRecordMapper.java    |  61 +++
 .../com/jlt/csa/mapper/CoinRecordMapper.java  |  61 +++
 .../csa/mapper/CommunicateRecordMapper.java   |  61 +++
 .../com/jlt/csa/mapper/CropFilesMapper.java   |  61 +++
 .../com/jlt/csa/mapper/CropPhaseMapper.java   |  61 +++
 .../com/jlt/csa/mapper/CsaFarmerMapper.java   |  61 +++
 .../jlt/csa/mapper/CsaMemberCardMapper.java   |  61 +++
 .../jlt/csa/mapper/GardenLogAttachMapper.java |  61 +++
 .../com/jlt/csa/mapper/GardenLogMapper.java   |  61 +++
 .../jlt/csa/mapper/GardenStrainMapper.java    |  61 +++
 .../com/jlt/csa/mapper/PickDetailMapper.java  |  61 +++
 .../com/jlt/csa/mapper/TendTaskMapper.java    |  61 +++
 .../jlt/csa/service/IArchedRecordService.java |  61 +++
 .../jlt/csa/service/ICoinRecordService.java   |  61 +++
 .../service/ICommunicateRecordService.java    |  61 +++
 .../jlt/csa/service/ICropFilesService.java    |  61 +++
 .../jlt/csa/service/ICropPhaseService.java    |  61 +++
 .../jlt/csa/service/ICsaFarmerService.java    |  61 +++
 .../csa/service/ICsaMemberCardService.java    |  61 +++
 .../csa/service/IGardenLogAttachService.java  |  61 +++
 .../jlt/csa/service/IGardenLogService.java    |  61 +++
 .../jlt/csa/service/IGardenStrainService.java |  61 +++
 .../jlt/csa/service/IPickDetailService.java   |  61 +++
 .../com/jlt/csa/service/ITendTaskService.java |  61 +++
 .../service/impl/ArchedRecordServiceImpl.java |  96 +++++
 .../service/impl/CoinRecordServiceImpl.java   |  96 +++++
 .../impl/CommunicateRecordServiceImpl.java    |  96 +++++
 .../service/impl/CropFilesServiceImpl.java    |  96 +++++
 .../service/impl/CropPhaseServiceImpl.java    |  96 +++++
 .../service/impl/CsaFarmerServiceImpl.java    |  96 +++++
 .../impl/CsaMemberCardServiceImpl.java        |  96 +++++
 .../impl/GardenLogAttachServiceImpl.java      |  96 +++++
 .../service/impl/GardenLogServiceImpl.java    |  96 +++++
 .../service/impl/GardenStrainServiceImpl.java |  96 +++++
 .../service/impl/PickDetailServiceImpl.java   |  96 +++++
 .../csa/service/impl/TendTaskServiceImpl.java |  96 +++++
 .../mapper/csa/ArchedRecordMapper.xml         | 113 +++++
 .../resources/mapper/csa/CoinRecordMapper.xml | 110 +++++
 .../mapper/csa/CommunicateRecordMapper.xml    | 123 ++++++
 .../resources/mapper/csa/CropFilesMapper.xml  |  96 +++++
 .../resources/mapper/csa/CropPhaseMapper.xml  |  98 +++++
 .../resources/mapper/csa/CsaFarmerMapper.xml  | 119 ++++++
 .../mapper/csa/CsaMemberCardMapper.xml        | 129 ++++++
 .../mapper/csa/GardenLogAttachMapper.xml      | 110 +++++
 .../resources/mapper/csa/GardenLogMapper.xml  | 114 +++++
 .../resources/mapper/csa/GardenMapper.xml     |   6 +-
 .../mapper/csa/GardenStrainMapper.xml         | 129 ++++++
 .../resources/mapper/csa/PickDetailMapper.xml |  97 +++++
 .../resources/mapper/csa/TendTaskMapper.xml   | 134 ++++++
 .../src/main/resources/generator.yml          |   8 +-
 ruoyi-ui/src/api/csa/archedrecord.js          |  44 ++
 ruoyi-ui/src/api/csa/attach.js                |  44 ++
 ruoyi-ui/src/api/csa/card.js                  |  44 ++
 ruoyi-ui/src/api/csa/coinrecord.js            |  44 ++
 ruoyi-ui/src/api/csa/commrecord.js            |  44 ++
 ruoyi-ui/src/api/csa/cropfiles.js             |  44 ++
 ruoyi-ui/src/api/csa/detail.js                |  44 ++
 ruoyi-ui/src/api/csa/farmer.js                |  44 ++
 ruoyi-ui/src/api/csa/log.js                   |  44 ++
 ruoyi-ui/src/api/csa/phase.js                 |  44 ++
 ruoyi-ui/src/api/csa/strain.js                |  44 ++
 ruoyi-ui/src/api/csa/task.js                  |  44 ++
 ruoyi-ui/src/views/csa/archedrecord/index.vue | 357 ++++++++++++++++
 ruoyi-ui/src/views/csa/attach/index.vue       | 317 ++++++++++++++
 ruoyi-ui/src/views/csa/card/index.vue         | 368 +++++++++++++++++
 ruoyi-ui/src/views/csa/coinrecord/index.vue   | 315 ++++++++++++++
 ruoyi-ui/src/views/csa/commrecord/index.vue   | 388 ++++++++++++++++++
 ruoyi-ui/src/views/csa/cropfiles/index.vue    | 272 ++++++++++++
 ruoyi-ui/src/views/csa/detail/index.vue       | 291 +++++++++++++
 ruoyi-ui/src/views/csa/farmer/index.vue       | 340 +++++++++++++++
 ruoyi-ui/src/views/csa/log/index.vue          | 355 ++++++++++++++++
 ruoyi-ui/src/views/csa/phase/index.vue        | 290 +++++++++++++
 ruoyi-ui/src/views/csa/strain/index.vue       | 363 ++++++++++++++++
 ruoyi-ui/src/views/csa/task/index.vue         | 381 +++++++++++++++++
 99 files changed, 11960 insertions(+), 23 deletions(-)
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/ArchedRecordController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/CoinRecordController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/CommunicateRecordController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/CropFilesController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/CropPhaseController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/CsaFarmerController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/CsaMemberCardController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/GardenLogAttachController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/GardenLogController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/GardenStrainController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/PickDetailController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/controller/TendTaskController.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/ArchedRecord.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/CoinRecord.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/CommunicateRecord.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/CropFiles.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/CropPhase.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/CsaFarmer.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/CsaMemberCard.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/GardenLog.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/GardenLogAttach.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/GardenStrain.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/PickDetail.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/domain/TendTask.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/ArchedRecordMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/CoinRecordMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/CommunicateRecordMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/CropFilesMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/CropPhaseMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/CsaFarmerMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/CsaMemberCardMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/GardenLogAttachMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/GardenLogMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/GardenStrainMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/PickDetailMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/mapper/TendTaskMapper.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/IArchedRecordService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/ICoinRecordService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/ICommunicateRecordService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/ICropFilesService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/ICropPhaseService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/ICsaFarmerService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/ICsaMemberCardService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/IGardenLogAttachService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/IGardenLogService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/IGardenStrainService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/IPickDetailService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/ITendTaskService.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/ArchedRecordServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/CoinRecordServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/CommunicateRecordServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/CropFilesServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/CropPhaseServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/CsaFarmerServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/CsaMemberCardServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogAttachServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/GardenStrainServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/PickDetailServiceImpl.java
 create mode 100644 private-farm/src/main/java/com/jlt/csa/service/impl/TendTaskServiceImpl.java
 create mode 100644 private-farm/src/main/resources/mapper/csa/ArchedRecordMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/CoinRecordMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/CommunicateRecordMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/CropFilesMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/CropPhaseMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/CsaFarmerMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/CsaMemberCardMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/GardenLogAttachMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/GardenLogMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/GardenStrainMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/PickDetailMapper.xml
 create mode 100644 private-farm/src/main/resources/mapper/csa/TendTaskMapper.xml
 create mode 100644 ruoyi-ui/src/api/csa/archedrecord.js
 create mode 100644 ruoyi-ui/src/api/csa/attach.js
 create mode 100644 ruoyi-ui/src/api/csa/card.js
 create mode 100644 ruoyi-ui/src/api/csa/coinrecord.js
 create mode 100644 ruoyi-ui/src/api/csa/commrecord.js
 create mode 100644 ruoyi-ui/src/api/csa/cropfiles.js
 create mode 100644 ruoyi-ui/src/api/csa/detail.js
 create mode 100644 ruoyi-ui/src/api/csa/farmer.js
 create mode 100644 ruoyi-ui/src/api/csa/log.js
 create mode 100644 ruoyi-ui/src/api/csa/phase.js
 create mode 100644 ruoyi-ui/src/api/csa/strain.js
 create mode 100644 ruoyi-ui/src/api/csa/task.js
 create mode 100644 ruoyi-ui/src/views/csa/archedrecord/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/attach/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/card/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/coinrecord/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/commrecord/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/cropfiles/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/detail/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/farmer/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/log/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/phase/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/strain/index.vue
 create mode 100644 ruoyi-ui/src/views/csa/task/index.vue

diff --git a/private-farm/src/main/java/com/jlt/csa/controller/ArchedRecordController.java b/private-farm/src/main/java/com/jlt/csa/controller/ArchedRecordController.java
new file mode 100644
index 000000000..6b77c3cb3
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/ArchedRecordController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.ArchedRecord;
+import com.jlt.csa.service.IArchedRecordService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 拱棚使用记录Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/archedrecord")
+public class ArchedRecordController extends BaseController
+{
+    @Autowired
+    private IArchedRecordService archedRecordService;
+
+    /**
+     * 查询拱棚使用记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:archedrecord:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ArchedRecord archedRecord)
+    {
+        startPage();
+        List<ArchedRecord> list = archedRecordService.selectArchedRecordList(archedRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出拱棚使用记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:archedrecord:export')")
+    @Log(title = "拱棚使用记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ArchedRecord archedRecord)
+    {
+        List<ArchedRecord> list = archedRecordService.selectArchedRecordList(archedRecord);
+        ExcelUtil<ArchedRecord> util = new ExcelUtil<ArchedRecord>(ArchedRecord.class);
+        util.exportExcel(response, list, "拱棚使用记录数据");
+    }
+
+    /**
+     * 获取拱棚使用记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:archedrecord:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(archedRecordService.selectArchedRecordById(id));
+    }
+
+    /**
+     * 新增拱棚使用记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:archedrecord:add')")
+    @Log(title = "拱棚使用记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ArchedRecord archedRecord)
+    {
+        return toAjax(archedRecordService.insertArchedRecord(archedRecord));
+    }
+
+    /**
+     * 修改拱棚使用记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:archedrecord:edit')")
+    @Log(title = "拱棚使用记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArchedRecord archedRecord)
+    {
+        return toAjax(archedRecordService.updateArchedRecord(archedRecord));
+    }
+
+    /**
+     * 删除拱棚使用记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:archedrecord:remove')")
+    @Log(title = "拱棚使用记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(archedRecordService.deleteArchedRecordByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/CoinRecordController.java b/private-farm/src/main/java/com/jlt/csa/controller/CoinRecordController.java
new file mode 100644
index 000000000..d10c187d9
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/CoinRecordController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.CoinRecord;
+import com.jlt.csa.service.ICoinRecordService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 金币记录Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/coinrecord")
+public class CoinRecordController extends BaseController
+{
+    @Autowired
+    private ICoinRecordService coinRecordService;
+
+    /**
+     * 查询金币记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:coinrecord:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CoinRecord coinRecord)
+    {
+        startPage();
+        List<CoinRecord> list = coinRecordService.selectCoinRecordList(coinRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出金币记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:coinrecord:export')")
+    @Log(title = "金币记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CoinRecord coinRecord)
+    {
+        List<CoinRecord> list = coinRecordService.selectCoinRecordList(coinRecord);
+        ExcelUtil<CoinRecord> util = new ExcelUtil<CoinRecord>(CoinRecord.class);
+        util.exportExcel(response, list, "金币记录数据");
+    }
+
+    /**
+     * 获取金币记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:coinrecord:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(coinRecordService.selectCoinRecordById(id));
+    }
+
+    /**
+     * 新增金币记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:coinrecord:add')")
+    @Log(title = "金币记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CoinRecord coinRecord)
+    {
+        return toAjax(coinRecordService.insertCoinRecord(coinRecord));
+    }
+
+    /**
+     * 修改金币记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:coinrecord:edit')")
+    @Log(title = "金币记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CoinRecord coinRecord)
+    {
+        return toAjax(coinRecordService.updateCoinRecord(coinRecord));
+    }
+
+    /**
+     * 删除金币记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:coinrecord:remove')")
+    @Log(title = "金币记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(coinRecordService.deleteCoinRecordByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/CommunicateRecordController.java b/private-farm/src/main/java/com/jlt/csa/controller/CommunicateRecordController.java
new file mode 100644
index 000000000..255df131a
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/CommunicateRecordController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.CommunicateRecord;
+import com.jlt.csa.service.ICommunicateRecordService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 沟通记录Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/commrecord")
+public class CommunicateRecordController extends BaseController
+{
+    @Autowired
+    private ICommunicateRecordService communicateRecordService;
+
+    /**
+     * 查询沟通记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:commrecord:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CommunicateRecord communicateRecord)
+    {
+        startPage();
+        List<CommunicateRecord> list = communicateRecordService.selectCommunicateRecordList(communicateRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出沟通记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:commrecord:export')")
+    @Log(title = "沟通记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CommunicateRecord communicateRecord)
+    {
+        List<CommunicateRecord> list = communicateRecordService.selectCommunicateRecordList(communicateRecord);
+        ExcelUtil<CommunicateRecord> util = new ExcelUtil<CommunicateRecord>(CommunicateRecord.class);
+        util.exportExcel(response, list, "沟通记录数据");
+    }
+
+    /**
+     * 获取沟通记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:commrecord:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(communicateRecordService.selectCommunicateRecordById(id));
+    }
+
+    /**
+     * 新增沟通记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:commrecord:add')")
+    @Log(title = "沟通记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CommunicateRecord communicateRecord)
+    {
+        return toAjax(communicateRecordService.insertCommunicateRecord(communicateRecord));
+    }
+
+    /**
+     * 修改沟通记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:commrecord:edit')")
+    @Log(title = "沟通记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CommunicateRecord communicateRecord)
+    {
+        return toAjax(communicateRecordService.updateCommunicateRecord(communicateRecord));
+    }
+
+    /**
+     * 删除沟通记录
+     */
+    @PreAuthorize("@ss.hasPermi('csa:commrecord:remove')")
+    @Log(title = "沟通记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(communicateRecordService.deleteCommunicateRecordByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/CropFilesController.java b/private-farm/src/main/java/com/jlt/csa/controller/CropFilesController.java
new file mode 100644
index 000000000..ee5003501
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/CropFilesController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.CropFiles;
+import com.jlt.csa.service.ICropFilesService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 作物档案Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-25
+ */
+@RestController
+@RequestMapping("/csa/cropfiles")
+public class CropFilesController extends BaseController
+{
+    @Autowired
+    private ICropFilesService cropFilesService;
+
+    /**
+     * 查询作物档案列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:cropfiles:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CropFiles cropFiles)
+    {
+        startPage();
+        List<CropFiles> list = cropFilesService.selectCropFilesList(cropFiles);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出作物档案列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:cropfiles:export')")
+    @Log(title = "作物档案", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CropFiles cropFiles)
+    {
+        List<CropFiles> list = cropFilesService.selectCropFilesList(cropFiles);
+        ExcelUtil<CropFiles> util = new ExcelUtil<CropFiles>(CropFiles.class);
+        util.exportExcel(response, list, "作物档案数据");
+    }
+
+    /**
+     * 获取作物档案详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:cropfiles:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(cropFilesService.selectCropFilesById(id));
+    }
+
+    /**
+     * 新增作物档案
+     */
+    @PreAuthorize("@ss.hasPermi('csa:cropfiles:add')")
+    @Log(title = "作物档案", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CropFiles cropFiles)
+    {
+        return toAjax(cropFilesService.insertCropFiles(cropFiles));
+    }
+
+    /**
+     * 修改作物档案
+     */
+    @PreAuthorize("@ss.hasPermi('csa:cropfiles:edit')")
+    @Log(title = "作物档案", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CropFiles cropFiles)
+    {
+        return toAjax(cropFilesService.updateCropFiles(cropFiles));
+    }
+
+    /**
+     * 删除作物档案
+     */
+    @PreAuthorize("@ss.hasPermi('csa:cropfiles:remove')")
+    @Log(title = "作物档案", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(cropFilesService.deleteCropFilesByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/CropPhaseController.java b/private-farm/src/main/java/com/jlt/csa/controller/CropPhaseController.java
new file mode 100644
index 000000000..2f8211fcc
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/CropPhaseController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.CropPhase;
+import com.jlt.csa.service.ICropPhaseService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 作物生长阶段Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+@RestController
+@RequestMapping("/csa/phase")
+public class CropPhaseController extends BaseController
+{
+    @Autowired
+    private ICropPhaseService cropPhaseService;
+
+    /**
+     * 查询作物生长阶段列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:phase:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CropPhase cropPhase)
+    {
+        startPage();
+        List<CropPhase> list = cropPhaseService.selectCropPhaseList(cropPhase);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出作物生长阶段列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:phase:export')")
+    @Log(title = "作物生长阶段", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CropPhase cropPhase)
+    {
+        List<CropPhase> list = cropPhaseService.selectCropPhaseList(cropPhase);
+        ExcelUtil<CropPhase> util = new ExcelUtil<CropPhase>(CropPhase.class);
+        util.exportExcel(response, list, "作物生长阶段数据");
+    }
+
+    /**
+     * 获取作物生长阶段详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:phase:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(cropPhaseService.selectCropPhaseById(id));
+    }
+
+    /**
+     * 新增作物生长阶段
+     */
+    @PreAuthorize("@ss.hasPermi('csa:phase:add')")
+    @Log(title = "作物生长阶段", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CropPhase cropPhase)
+    {
+        return toAjax(cropPhaseService.insertCropPhase(cropPhase));
+    }
+
+    /**
+     * 修改作物生长阶段
+     */
+    @PreAuthorize("@ss.hasPermi('csa:phase:edit')")
+    @Log(title = "作物生长阶段", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CropPhase cropPhase)
+    {
+        return toAjax(cropPhaseService.updateCropPhase(cropPhase));
+    }
+
+    /**
+     * 删除作物生长阶段
+     */
+    @PreAuthorize("@ss.hasPermi('csa:phase:remove')")
+    @Log(title = "作物生长阶段", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(cropPhaseService.deleteCropPhaseByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/CsaFarmerController.java b/private-farm/src/main/java/com/jlt/csa/controller/CsaFarmerController.java
new file mode 100644
index 000000000..6e2d3b96a
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/CsaFarmerController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.CsaFarmer;
+import com.jlt.csa.service.ICsaFarmerService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 私家农场会员Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+@RestController
+@RequestMapping("/csa/farmer")
+public class CsaFarmerController extends BaseController
+{
+    @Autowired
+    private ICsaFarmerService csaFarmerService;
+
+    /**
+     * 查询私家农场会员列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:farmer:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CsaFarmer csaFarmer)
+    {
+        startPage();
+        List<CsaFarmer> list = csaFarmerService.selectCsaFarmerList(csaFarmer);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出私家农场会员列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:farmer:export')")
+    @Log(title = "私家农场会员", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CsaFarmer csaFarmer)
+    {
+        List<CsaFarmer> list = csaFarmerService.selectCsaFarmerList(csaFarmer);
+        ExcelUtil<CsaFarmer> util = new ExcelUtil<CsaFarmer>(CsaFarmer.class);
+        util.exportExcel(response, list, "私家农场会员数据");
+    }
+
+    /**
+     * 获取私家农场会员详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:farmer:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(csaFarmerService.selectCsaFarmerById(id));
+    }
+
+    /**
+     * 新增私家农场会员
+     */
+    @PreAuthorize("@ss.hasPermi('csa:farmer:add')")
+    @Log(title = "私家农场会员", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CsaFarmer csaFarmer)
+    {
+        return toAjax(csaFarmerService.insertCsaFarmer(csaFarmer));
+    }
+
+    /**
+     * 修改私家农场会员
+     */
+    @PreAuthorize("@ss.hasPermi('csa:farmer:edit')")
+    @Log(title = "私家农场会员", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CsaFarmer csaFarmer)
+    {
+        return toAjax(csaFarmerService.updateCsaFarmer(csaFarmer));
+    }
+
+    /**
+     * 删除私家农场会员
+     */
+    @PreAuthorize("@ss.hasPermi('csa:farmer:remove')")
+    @Log(title = "私家农场会员", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(csaFarmerService.deleteCsaFarmerByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/CsaMemberCardController.java b/private-farm/src/main/java/com/jlt/csa/controller/CsaMemberCardController.java
new file mode 100644
index 000000000..652be9e5f
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/CsaMemberCardController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.CsaMemberCard;
+import com.jlt.csa.service.ICsaMemberCardService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 会员卡Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+@RestController
+@RequestMapping("/csa/card")
+public class CsaMemberCardController extends BaseController
+{
+    @Autowired
+    private ICsaMemberCardService csaMemberCardService;
+
+    /**
+     * 查询会员卡列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:card:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CsaMemberCard csaMemberCard)
+    {
+        startPage();
+        List<CsaMemberCard> list = csaMemberCardService.selectCsaMemberCardList(csaMemberCard);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出会员卡列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:card:export')")
+    @Log(title = "会员卡", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CsaMemberCard csaMemberCard)
+    {
+        List<CsaMemberCard> list = csaMemberCardService.selectCsaMemberCardList(csaMemberCard);
+        ExcelUtil<CsaMemberCard> util = new ExcelUtil<CsaMemberCard>(CsaMemberCard.class);
+        util.exportExcel(response, list, "会员卡数据");
+    }
+
+    /**
+     * 获取会员卡详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:card:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(csaMemberCardService.selectCsaMemberCardById(id));
+    }
+
+    /**
+     * 新增会员卡
+     */
+    @PreAuthorize("@ss.hasPermi('csa:card:add')")
+    @Log(title = "会员卡", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CsaMemberCard csaMemberCard)
+    {
+        return toAjax(csaMemberCardService.insertCsaMemberCard(csaMemberCard));
+    }
+
+    /**
+     * 修改会员卡
+     */
+    @PreAuthorize("@ss.hasPermi('csa:card:edit')")
+    @Log(title = "会员卡", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CsaMemberCard csaMemberCard)
+    {
+        return toAjax(csaMemberCardService.updateCsaMemberCard(csaMemberCard));
+    }
+
+    /**
+     * 删除会员卡
+     */
+    @PreAuthorize("@ss.hasPermi('csa:card:remove')")
+    @Log(title = "会员卡", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(csaMemberCardService.deleteCsaMemberCardByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/GardenLogAttachController.java b/private-farm/src/main/java/com/jlt/csa/controller/GardenLogAttachController.java
new file mode 100644
index 000000000..b5ff0fc55
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/GardenLogAttachController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.GardenLogAttach;
+import com.jlt.csa.service.IGardenLogAttachService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 菜地日志附件Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/attach")
+public class GardenLogAttachController extends BaseController
+{
+    @Autowired
+    private IGardenLogAttachService gardenLogAttachService;
+
+    /**
+     * 查询菜地日志附件列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:attach:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(GardenLogAttach gardenLogAttach)
+    {
+        startPage();
+        List<GardenLogAttach> list = gardenLogAttachService.selectGardenLogAttachList(gardenLogAttach);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出菜地日志附件列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:attach:export')")
+    @Log(title = "菜地日志附件", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, GardenLogAttach gardenLogAttach)
+    {
+        List<GardenLogAttach> list = gardenLogAttachService.selectGardenLogAttachList(gardenLogAttach);
+        ExcelUtil<GardenLogAttach> util = new ExcelUtil<GardenLogAttach>(GardenLogAttach.class);
+        util.exportExcel(response, list, "菜地日志附件数据");
+    }
+
+    /**
+     * 获取菜地日志附件详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:attach:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(gardenLogAttachService.selectGardenLogAttachById(id));
+    }
+
+    /**
+     * 新增菜地日志附件
+     */
+    @PreAuthorize("@ss.hasPermi('csa:attach:add')")
+    @Log(title = "菜地日志附件", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody GardenLogAttach gardenLogAttach)
+    {
+        return toAjax(gardenLogAttachService.insertGardenLogAttach(gardenLogAttach));
+    }
+
+    /**
+     * 修改菜地日志附件
+     */
+    @PreAuthorize("@ss.hasPermi('csa:attach:edit')")
+    @Log(title = "菜地日志附件", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody GardenLogAttach gardenLogAttach)
+    {
+        return toAjax(gardenLogAttachService.updateGardenLogAttach(gardenLogAttach));
+    }
+
+    /**
+     * 删除菜地日志附件
+     */
+    @PreAuthorize("@ss.hasPermi('csa:attach:remove')")
+    @Log(title = "菜地日志附件", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(gardenLogAttachService.deleteGardenLogAttachByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/GardenLogController.java b/private-farm/src/main/java/com/jlt/csa/controller/GardenLogController.java
new file mode 100644
index 000000000..71cc80a84
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/GardenLogController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.GardenLog;
+import com.jlt.csa.service.IGardenLogService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 菜地日志Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/log")
+public class GardenLogController extends BaseController
+{
+    @Autowired
+    private IGardenLogService gardenLogService;
+
+    /**
+     * 查询菜地日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:log:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(GardenLog gardenLog)
+    {
+        startPage();
+        List<GardenLog> list = gardenLogService.selectGardenLogList(gardenLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出菜地日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:log:export')")
+    @Log(title = "菜地日志", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, GardenLog gardenLog)
+    {
+        List<GardenLog> list = gardenLogService.selectGardenLogList(gardenLog);
+        ExcelUtil<GardenLog> util = new ExcelUtil<GardenLog>(GardenLog.class);
+        util.exportExcel(response, list, "菜地日志数据");
+    }
+
+    /**
+     * 获取菜地日志详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:log:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(gardenLogService.selectGardenLogById(id));
+    }
+
+    /**
+     * 新增菜地日志
+     */
+    @PreAuthorize("@ss.hasPermi('csa:log:add')")
+    @Log(title = "菜地日志", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody GardenLog gardenLog)
+    {
+        return toAjax(gardenLogService.insertGardenLog(gardenLog));
+    }
+
+    /**
+     * 修改菜地日志
+     */
+    @PreAuthorize("@ss.hasPermi('csa:log:edit')")
+    @Log(title = "菜地日志", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody GardenLog gardenLog)
+    {
+        return toAjax(gardenLogService.updateGardenLog(gardenLog));
+    }
+
+    /**
+     * 删除菜地日志
+     */
+    @PreAuthorize("@ss.hasPermi('csa:log:remove')")
+    @Log(title = "菜地日志", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(gardenLogService.deleteGardenLogByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/GardenStrainController.java b/private-farm/src/main/java/com/jlt/csa/controller/GardenStrainController.java
new file mode 100644
index 000000000..bfb521c32
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/GardenStrainController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.GardenStrain;
+import com.jlt.csa.service.IGardenStrainService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 菜地品种Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/strain")
+public class GardenStrainController extends BaseController
+{
+    @Autowired
+    private IGardenStrainService gardenStrainService;
+
+    /**
+     * 查询菜地品种列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:strain:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(GardenStrain gardenStrain)
+    {
+        startPage();
+        List<GardenStrain> list = gardenStrainService.selectGardenStrainList(gardenStrain);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出菜地品种列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:strain:export')")
+    @Log(title = "菜地品种", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, GardenStrain gardenStrain)
+    {
+        List<GardenStrain> list = gardenStrainService.selectGardenStrainList(gardenStrain);
+        ExcelUtil<GardenStrain> util = new ExcelUtil<GardenStrain>(GardenStrain.class);
+        util.exportExcel(response, list, "菜地品种数据");
+    }
+
+    /**
+     * 获取菜地品种详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:strain:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(gardenStrainService.selectGardenStrainById(id));
+    }
+
+    /**
+     * 新增菜地品种
+     */
+    @PreAuthorize("@ss.hasPermi('csa:strain:add')")
+    @Log(title = "菜地品种", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody GardenStrain gardenStrain)
+    {
+        return toAjax(gardenStrainService.insertGardenStrain(gardenStrain));
+    }
+
+    /**
+     * 修改菜地品种
+     */
+    @PreAuthorize("@ss.hasPermi('csa:strain:edit')")
+    @Log(title = "菜地品种", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody GardenStrain gardenStrain)
+    {
+        return toAjax(gardenStrainService.updateGardenStrain(gardenStrain));
+    }
+
+    /**
+     * 删除菜地品种
+     */
+    @PreAuthorize("@ss.hasPermi('csa:strain:remove')")
+    @Log(title = "菜地品种", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(gardenStrainService.deleteGardenStrainByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/PickDetailController.java b/private-farm/src/main/java/com/jlt/csa/controller/PickDetailController.java
new file mode 100644
index 000000000..e8d66bbee
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/PickDetailController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.PickDetail;
+import com.jlt.csa.service.IPickDetailService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 采摘任务明细Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/detail")
+public class PickDetailController extends BaseController
+{
+    @Autowired
+    private IPickDetailService pickDetailService;
+
+    /**
+     * 查询采摘任务明细列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:detail:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(PickDetail pickDetail)
+    {
+        startPage();
+        List<PickDetail> list = pickDetailService.selectPickDetailList(pickDetail);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出采摘任务明细列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:detail:export')")
+    @Log(title = "采摘任务明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, PickDetail pickDetail)
+    {
+        List<PickDetail> list = pickDetailService.selectPickDetailList(pickDetail);
+        ExcelUtil<PickDetail> util = new ExcelUtil<PickDetail>(PickDetail.class);
+        util.exportExcel(response, list, "采摘任务明细数据");
+    }
+
+    /**
+     * 获取采摘任务明细详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:detail:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(pickDetailService.selectPickDetailById(id));
+    }
+
+    /**
+     * 新增采摘任务明细
+     */
+    @PreAuthorize("@ss.hasPermi('csa:detail:add')")
+    @Log(title = "采摘任务明细", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody PickDetail pickDetail)
+    {
+        return toAjax(pickDetailService.insertPickDetail(pickDetail));
+    }
+
+    /**
+     * 修改采摘任务明细
+     */
+    @PreAuthorize("@ss.hasPermi('csa:detail:edit')")
+    @Log(title = "采摘任务明细", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody PickDetail pickDetail)
+    {
+        return toAjax(pickDetailService.updatePickDetail(pickDetail));
+    }
+
+    /**
+     * 删除采摘任务明细
+     */
+    @PreAuthorize("@ss.hasPermi('csa:detail:remove')")
+    @Log(title = "采摘任务明细", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(pickDetailService.deletePickDetailByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/controller/TendTaskController.java b/private-farm/src/main/java/com/jlt/csa/controller/TendTaskController.java
new file mode 100644
index 000000000..e6a5b113f
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/controller/TendTaskController.java
@@ -0,0 +1,104 @@
+package com.jlt.csa.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.jlt.csa.domain.TendTask;
+import com.jlt.csa.service.ITendTaskService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 打理任务Controller
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@RestController
+@RequestMapping("/csa/task")
+public class TendTaskController extends BaseController
+{
+    @Autowired
+    private ITendTaskService tendTaskService;
+
+    /**
+     * 查询打理任务列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:task:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TendTask tendTask)
+    {
+        startPage();
+        List<TendTask> list = tendTaskService.selectTendTaskList(tendTask);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出打理任务列表
+     */
+    @PreAuthorize("@ss.hasPermi('csa:task:export')")
+    @Log(title = "打理任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TendTask tendTask)
+    {
+        List<TendTask> list = tendTaskService.selectTendTaskList(tendTask);
+        ExcelUtil<TendTask> util = new ExcelUtil<TendTask>(TendTask.class);
+        util.exportExcel(response, list, "打理任务数据");
+    }
+
+    /**
+     * 获取打理任务详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('csa:task:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(tendTaskService.selectTendTaskById(id));
+    }
+
+    /**
+     * 新增打理任务
+     */
+    @PreAuthorize("@ss.hasPermi('csa:task:add')")
+    @Log(title = "打理任务", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TendTask tendTask)
+    {
+        return toAjax(tendTaskService.insertTendTask(tendTask));
+    }
+
+    /**
+     * 修改打理任务
+     */
+    @PreAuthorize("@ss.hasPermi('csa:task:edit')")
+    @Log(title = "打理任务", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TendTask tendTask)
+    {
+        return toAjax(tendTaskService.updateTendTask(tendTask));
+    }
+
+    /**
+     * 删除打理任务
+     */
+    @PreAuthorize("@ss.hasPermi('csa:task:remove')")
+    @Log(title = "打理任务", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(tendTaskService.deleteTendTaskByIds(ids));
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/ArchedRecord.java b/private-farm/src/main/java/com/jlt/csa/domain/ArchedRecord.java
new file mode 100644
index 000000000..6dd7f1d47
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/ArchedRecord.java
@@ -0,0 +1,167 @@
+package com.jlt.csa.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 拱棚使用记录对象 csa_arched_record
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class ArchedRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 拱棚使用记录id */
+    private Long id;
+
+    /** 会员id */
+    private Long memberId;
+
+    /** 菜地id */
+    private Long gardenId;
+
+    /** 对应年份 */
+    @Excel(name = "对应年份")
+    private Long yearNo;
+
+    /** 消耗年份 */
+    private Long consumYear;
+
+    /** 剩余年份 */
+    @Excel(name = "剩余年份")
+    private Long remainingYears;
+
+    /** 操作人id */
+    @Excel(name = "操作人id")
+    private Long doerId;
+
+    /** 处理时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "处理时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date doTime;
+
+    /** 有效状态 */
+    @Excel(name = "有效状态")
+    private String status;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setMemberId(Long memberId) 
+    {
+        this.memberId = memberId;
+    }
+
+    public Long getMemberId() 
+    {
+        return memberId;
+    }
+    public void setGardenId(Long gardenId) 
+    {
+        this.gardenId = gardenId;
+    }
+
+    public Long getGardenId() 
+    {
+        return gardenId;
+    }
+    public void setYearNo(Long yearNo) 
+    {
+        this.yearNo = yearNo;
+    }
+
+    public Long getYearNo() 
+    {
+        return yearNo;
+    }
+    public void setConsumYear(Long consumYear) 
+    {
+        this.consumYear = consumYear;
+    }
+
+    public Long getConsumYear() 
+    {
+        return consumYear;
+    }
+    public void setRemainingYears(Long remainingYears) 
+    {
+        this.remainingYears = remainingYears;
+    }
+
+    public Long getRemainingYears() 
+    {
+        return remainingYears;
+    }
+    public void setDoerId(Long doerId) 
+    {
+        this.doerId = doerId;
+    }
+
+    public Long getDoerId() 
+    {
+        return doerId;
+    }
+    public void setDoTime(Date doTime) 
+    {
+        this.doTime = doTime;
+    }
+
+    public Date getDoTime() 
+    {
+        return doTime;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("memberId", getMemberId())
+            .append("gardenId", getGardenId())
+            .append("yearNo", getYearNo())
+            .append("consumYear", getConsumYear())
+            .append("remainingYears", getRemainingYears())
+            .append("doerId", getDoerId())
+            .append("doTime", getDoTime())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/CoinRecord.java b/private-farm/src/main/java/com/jlt/csa/domain/CoinRecord.java
new file mode 100644
index 000000000..23b406632
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/CoinRecord.java
@@ -0,0 +1,170 @@
+package com.jlt.csa.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 金币记录对象 csa_coin_record
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class CoinRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 记录id */
+    private Long id;
+
+    /** 会员id */
+    @Excel(name = "会员id")
+    private Long memberId;
+
+    /** 业务id */
+    private Long opId;
+
+    /** 业务类型 */
+    @Excel(name = "业务类型")
+    private String opType;
+
+    /** 金币花费 */
+    @Excel(name = "金币花费")
+    private BigDecimal coins;
+
+    /** 金币余额 */
+    @Excel(name = "金币余额")
+    private BigDecimal coinBalance;
+
+    /** 描述 */
+    @Excel(name = "描述")
+    private String description;
+
+    /** 业务发生时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "业务发生时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date opTime;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String status;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setMemberId(Long memberId) 
+    {
+        this.memberId = memberId;
+    }
+
+    public Long getMemberId() 
+    {
+        return memberId;
+    }
+    public void setOpId(Long opId) 
+    {
+        this.opId = opId;
+    }
+
+    public Long getOpId() 
+    {
+        return opId;
+    }
+    public void setOpType(String opType) 
+    {
+        this.opType = opType;
+    }
+
+    public String getOpType() 
+    {
+        return opType;
+    }
+    public void setCoins(BigDecimal coins) 
+    {
+        this.coins = coins;
+    }
+
+    public BigDecimal getCoins() 
+    {
+        return coins;
+    }
+    public void setCoinBalance(BigDecimal coinBalance) 
+    {
+        this.coinBalance = coinBalance;
+    }
+
+    public BigDecimal getCoinBalance() 
+    {
+        return coinBalance;
+    }
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+
+    public String getDescription() 
+    {
+        return description;
+    }
+    public void setOpTime(Date opTime) 
+    {
+        this.opTime = opTime;
+    }
+
+    public Date getOpTime() 
+    {
+        return opTime;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("memberId", getMemberId())
+            .append("opId", getOpId())
+            .append("opType", getOpType())
+            .append("coins", getCoins())
+            .append("coinBalance", getCoinBalance())
+            .append("description", getDescription())
+            .append("opTime", getOpTime())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/CommunicateRecord.java b/private-farm/src/main/java/com/jlt/csa/domain/CommunicateRecord.java
new file mode 100644
index 000000000..93c8137c2
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/CommunicateRecord.java
@@ -0,0 +1,199 @@
+package com.jlt.csa.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 沟通记录对象 csa_communicate_record
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class CommunicateRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 沟通日志记录id */
+    private Long id;
+
+    /** 会员 */
+    @Excel(name = "会员")
+    private Long memberId;
+
+    /** 菜地id */
+    @Excel(name = "菜地id")
+    private Long gardenId;
+
+    /** 发布人 */
+    @Excel(name = "发布人")
+    private Long recorder;
+
+    /** 种植任务id */
+    @Excel(name = "种植任务id")
+    private Long taskId;
+
+    /** 沟通类型 */
+    @Excel(name = "沟通类型")
+    private String commType;
+
+    /** 沟通内容 */
+    @Excel(name = "沟通内容")
+    private String content;
+
+    /** 处理结果 */
+    @Excel(name = "处理结果")
+    private String result;
+
+    /** 是否处理 */
+    @Excel(name = "是否处理")
+    private String isCompleted;
+
+    /** 沟通时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "沟通时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date commTime;
+
+    /** 处理时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "处理时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date doTime;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setMemberId(Long memberId) 
+    {
+        this.memberId = memberId;
+    }
+
+    public Long getMemberId() 
+    {
+        return memberId;
+    }
+    public void setGardenId(Long gardenId) 
+    {
+        this.gardenId = gardenId;
+    }
+
+    public Long getGardenId() 
+    {
+        return gardenId;
+    }
+    public void setRecorder(Long recorder) 
+    {
+        this.recorder = recorder;
+    }
+
+    public Long getRecorder() 
+    {
+        return recorder;
+    }
+    public void setTaskId(Long taskId) 
+    {
+        this.taskId = taskId;
+    }
+
+    public Long getTaskId() 
+    {
+        return taskId;
+    }
+    public void setCommType(String commType) 
+    {
+        this.commType = commType;
+    }
+
+    public String getCommType() 
+    {
+        return commType;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setResult(String result) 
+    {
+        this.result = result;
+    }
+
+    public String getResult() 
+    {
+        return result;
+    }
+    public void setIsCompleted(String isCompleted) 
+    {
+        this.isCompleted = isCompleted;
+    }
+
+    public String getIsCompleted() 
+    {
+        return isCompleted;
+    }
+    public void setCommTime(Date commTime) 
+    {
+        this.commTime = commTime;
+    }
+
+    public Date getCommTime() 
+    {
+        return commTime;
+    }
+    public void setDoTime(Date doTime) 
+    {
+        this.doTime = doTime;
+    }
+
+    public Date getDoTime() 
+    {
+        return doTime;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("memberId", getMemberId())
+            .append("gardenId", getGardenId())
+            .append("recorder", getRecorder())
+            .append("taskId", getTaskId())
+            .append("commType", getCommType())
+            .append("content", getContent())
+            .append("result", getResult())
+            .append("isCompleted", getIsCompleted())
+            .append("commTime", getCommTime())
+            .append("doTime", getDoTime())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/CropFiles.java b/private-farm/src/main/java/com/jlt/csa/domain/CropFiles.java
new file mode 100644
index 000000000..2024b2944
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/CropFiles.java
@@ -0,0 +1,123 @@
+package com.jlt.csa.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 作物档案对象 csa_crop_files
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-25
+ */
+public class CropFiles extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 作物档案id */
+    private Long id;
+
+    /** 作物名称 */
+    @Excel(name = "作物名称")
+    private String name;
+
+    /** 种植指南 */
+    private String plantGuide;
+
+    /** 代表图片 */
+    @Excel(name = "代表图片")
+    private String picture;
+
+    /** 作物描述 */
+    private String description;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String status;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setPlantGuide(String plantGuide) 
+    {
+        this.plantGuide = plantGuide;
+    }
+
+    public String getPlantGuide() 
+    {
+        return plantGuide;
+    }
+    public void setPicture(String picture) 
+    {
+        this.picture = picture;
+    }
+
+    public String getPicture() 
+    {
+        return picture;
+    }
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+
+    public String getDescription() 
+    {
+        return description;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("plantGuide", getPlantGuide())
+            .append("picture", getPicture())
+            .append("description", getDescription())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/CropPhase.java b/private-farm/src/main/java/com/jlt/csa/domain/CropPhase.java
new file mode 100644
index 000000000..e21348c0a
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/CropPhase.java
@@ -0,0 +1,124 @@
+package com.jlt.csa.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 作物生长阶段对象 csa_crop_phase
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public class CropPhase extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 阶段id */
+    private Long id;
+
+    /** 作物id */
+    private Long cropId;
+
+    /** 阶段名称 */
+    @Excel(name = "阶段名称")
+    private String name;
+
+    /** 产出 */
+    @Excel(name = "产出")
+    private String production;
+
+    /** 代表图片 */
+    @Excel(name = "代表图片")
+    private String picture;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String status;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setCropId(Long cropId) 
+    {
+        this.cropId = cropId;
+    }
+
+    public Long getCropId() 
+    {
+        return cropId;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setProduction(String production) 
+    {
+        this.production = production;
+    }
+
+    public String getProduction() 
+    {
+        return production;
+    }
+    public void setPicture(String picture) 
+    {
+        this.picture = picture;
+    }
+
+    public String getPicture() 
+    {
+        return picture;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("cropId", getCropId())
+            .append("name", getName())
+            .append("production", getProduction())
+            .append("picture", getPicture())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/CsaFarmer.java b/private-farm/src/main/java/com/jlt/csa/domain/CsaFarmer.java
new file mode 100644
index 000000000..3b7db6e25
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/CsaFarmer.java
@@ -0,0 +1,200 @@
+package com.jlt.csa.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 私家农场会员对象 csa_farmer
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public class CsaFarmer extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 会员id */
+    private Long id;
+
+    /** 会员姓名 */
+    @Excel(name = "会员姓名")
+    private String name;
+
+    /** 性别 */
+    @Excel(name = "性别")
+    private String gender;
+
+    /** 金币余额 */
+    @Excel(name = "金币余额")
+    private BigDecimal coins;
+
+    /** 账户余额 */
+    @Excel(name = "账户余额")
+    private BigDecimal balance;
+
+    /** 重量余额 */
+    @Excel(name = "重量余额")
+    private BigDecimal weight;
+
+    /** 拱棚年限余额 */
+    @Excel(name = "拱棚年限余额")
+    private Integer archedYears;
+
+    /** 加入日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "加入日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date joinDate;
+
+    /** 到期日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "到期日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date dueDate;
+
+    /** 是否过期 */
+    @Excel(name = "是否过期")
+    private String isExpire;
+
+    /** 状态(0正常 1停用) */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setGender(String gender) 
+    {
+        this.gender = gender;
+    }
+
+    public String getGender() 
+    {
+        return gender;
+    }
+    public void setCoins(BigDecimal coins) 
+    {
+        this.coins = coins;
+    }
+
+    public BigDecimal getCoins() 
+    {
+        return coins;
+    }
+    public void setBalance(BigDecimal balance) 
+    {
+        this.balance = balance;
+    }
+
+    public BigDecimal getBalance() 
+    {
+        return balance;
+    }
+    public void setWeight(BigDecimal weight) 
+    {
+        this.weight = weight;
+    }
+
+    public BigDecimal getWeight() 
+    {
+        return weight;
+    }
+    public void setArchedYears(Integer archedYears) 
+    {
+        this.archedYears = archedYears;
+    }
+
+    public Integer getArchedYears() 
+    {
+        return archedYears;
+    }
+    public void setJoinDate(Date joinDate) 
+    {
+        this.joinDate = joinDate;
+    }
+
+    public Date getJoinDate() 
+    {
+        return joinDate;
+    }
+    public void setDueDate(Date dueDate) 
+    {
+        this.dueDate = dueDate;
+    }
+
+    public Date getDueDate() 
+    {
+        return dueDate;
+    }
+    public void setIsExpire(String isExpire) 
+    {
+        this.isExpire = isExpire;
+    }
+
+    public String getIsExpire() 
+    {
+        return isExpire;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("gender", getGender())
+            .append("coins", getCoins())
+            .append("balance", getBalance())
+            .append("weight", getWeight())
+            .append("archedYears", getArchedYears())
+            .append("joinDate", getJoinDate())
+            .append("dueDate", getDueDate())
+            .append("isExpire", getIsExpire())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/CsaMemberCard.java b/private-farm/src/main/java/com/jlt/csa/domain/CsaMemberCard.java
new file mode 100644
index 000000000..41778d125
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/CsaMemberCard.java
@@ -0,0 +1,226 @@
+package com.jlt.csa.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 会员卡对象 csa_member_card
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public class CsaMemberCard extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 卡id */
+    private Long id;
+
+    /** 卡号 */
+    @Excel(name = "卡号")
+    private String cardno;
+
+    /** 密码 */
+    private String passwd;
+
+    /** 激活有效期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "激活有效期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date activationValidity;
+
+    /** 可用状态 */
+    @Excel(name = "可用状态")
+    private String usabilityStatus;
+
+    /** 激活状态 */
+    @Excel(name = "激活状态")
+    private String activeStatus;
+
+    /** 平方米 */
+    @Excel(name = "平方米")
+    private BigDecimal m2;
+
+    /** 土地年限 */
+    @Excel(name = "土地年限")
+    private Integer landYears;
+
+    /** 拱棚年限 */
+    @Excel(name = "拱棚年限")
+    private Integer archedYears;
+
+    /** 金币 */
+    @Excel(name = "金币")
+    private BigDecimal coins;
+
+    /** 金额 */
+    @Excel(name = "金额")
+    private BigDecimal balance;
+
+    /** 重量 */
+    @Excel(name = "重量")
+    private BigDecimal weight;
+
+    /** 套餐代码 */
+    @Excel(name = "套餐代码")
+    private String setMeal;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setCardno(String cardno) 
+    {
+        this.cardno = cardno;
+    }
+
+    public String getCardno() 
+    {
+        return cardno;
+    }
+    public void setPasswd(String passwd) 
+    {
+        this.passwd = passwd;
+    }
+
+    public String getPasswd() 
+    {
+        return passwd;
+    }
+    public void setActivationValidity(Date activationValidity) 
+    {
+        this.activationValidity = activationValidity;
+    }
+
+    public Date getActivationValidity() 
+    {
+        return activationValidity;
+    }
+    public void setUsabilityStatus(String usabilityStatus) 
+    {
+        this.usabilityStatus = usabilityStatus;
+    }
+
+    public String getUsabilityStatus() 
+    {
+        return usabilityStatus;
+    }
+    public void setActiveStatus(String activeStatus) 
+    {
+        this.activeStatus = activeStatus;
+    }
+
+    public String getActiveStatus() 
+    {
+        return activeStatus;
+    }
+    public void setM2(BigDecimal m2) 
+    {
+        this.m2 = m2;
+    }
+
+    public BigDecimal getM2() 
+    {
+        return m2;
+    }
+    public void setLandYears(Integer landYears) 
+    {
+        this.landYears = landYears;
+    }
+
+    public Integer getLandYears() 
+    {
+        return landYears;
+    }
+    public void setArchedYears(Integer archedYears) 
+    {
+        this.archedYears = archedYears;
+    }
+
+    public Integer getArchedYears() 
+    {
+        return archedYears;
+    }
+    public void setCoins(BigDecimal coins) 
+    {
+        this.coins = coins;
+    }
+
+    public BigDecimal getCoins() 
+    {
+        return coins;
+    }
+    public void setBalance(BigDecimal balance) 
+    {
+        this.balance = balance;
+    }
+
+    public BigDecimal getBalance() 
+    {
+        return balance;
+    }
+    public void setWeight(BigDecimal weight) 
+    {
+        this.weight = weight;
+    }
+
+    public BigDecimal getWeight() 
+    {
+        return weight;
+    }
+    public void setSetMeal(String setMeal) 
+    {
+        this.setMeal = setMeal;
+    }
+
+    public String getSetMeal() 
+    {
+        return setMeal;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("cardno", getCardno())
+            .append("passwd", getPasswd())
+            .append("activationValidity", getActivationValidity())
+            .append("usabilityStatus", getUsabilityStatus())
+            .append("activeStatus", getActiveStatus())
+            .append("m2", getM2())
+            .append("landYears", getLandYears())
+            .append("archedYears", getArchedYears())
+            .append("coins", getCoins())
+            .append("balance", getBalance())
+            .append("weight", getWeight())
+            .append("setMeal", getSetMeal())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/Garden.java b/private-farm/src/main/java/com/jlt/csa/domain/Garden.java
index 3d60aed57..1093a7a3e 100644
--- a/private-farm/src/main/java/com/jlt/csa/domain/Garden.java
+++ b/private-farm/src/main/java/com/jlt/csa/domain/Garden.java
@@ -47,10 +47,6 @@ public class Garden extends BaseEntity
     /** 客服人员id */
     private Long contacterId;
 
-    /** 金币 */
-    @Excel(name = "金币")
-    private BigDecimal coins;
-
     /** 耕作状态 */
     private String isFarming;
 
@@ -148,15 +144,6 @@ public class Garden extends BaseEntity
     {
         return contacterId;
     }
-    public void setCoins(BigDecimal coins) 
-    {
-        this.coins = coins;
-    }
-
-    public BigDecimal getCoins() 
-    {
-        return coins;
-    }
     public void setIsFarming(String isFarming) 
     {
         this.isFarming = isFarming;
@@ -215,7 +202,6 @@ public class Garden extends BaseEntity
             .append("managerId", getManagerId())
             .append("workerId", getWorkerId())
             .append("contacterId", getContacterId())
-            .append("coins", getCoins())
             .append("isFarming", getIsFarming())
             .append("isSelled", getIsSelled())
             .append("isCompleted", getIsCompleted())
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/GardenLog.java b/private-farm/src/main/java/com/jlt/csa/domain/GardenLog.java
new file mode 100644
index 000000000..731006fd9
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/GardenLog.java
@@ -0,0 +1,170 @@
+package com.jlt.csa.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 菜地日志对象 csa_garden_log
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class GardenLog extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 菜地日志id */
+    private Long id;
+
+    /** 会员 */
+    @Excel(name = "会员")
+    private Long memberId;
+
+    /** 菜地 */
+    @Excel(name = "菜地")
+    private Long gardenId;
+
+    /** 种植任务 */
+    @Excel(name = "种植任务")
+    private Long taskId;
+
+    /** 日志类型 */
+    @Excel(name = "日志类型")
+    private String logType;
+
+    /** 日志内容 */
+    @Excel(name = "日志内容")
+    private String content;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date publishTime;
+
+    /** 发布人 */
+    @Excel(name = "发布人")
+    private Long publisher;
+
+    /** 发布状态 */
+    @Excel(name = "发布状态")
+    private String publishStatus;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setMemberId(Long memberId) 
+    {
+        this.memberId = memberId;
+    }
+
+    public Long getMemberId() 
+    {
+        return memberId;
+    }
+    public void setGardenId(Long gardenId) 
+    {
+        this.gardenId = gardenId;
+    }
+
+    public Long getGardenId() 
+    {
+        return gardenId;
+    }
+    public void setTaskId(Long taskId) 
+    {
+        this.taskId = taskId;
+    }
+
+    public Long getTaskId() 
+    {
+        return taskId;
+    }
+    public void setLogType(String logType) 
+    {
+        this.logType = logType;
+    }
+
+    public String getLogType() 
+    {
+        return logType;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setPublishTime(Date publishTime) 
+    {
+        this.publishTime = publishTime;
+    }
+
+    public Date getPublishTime() 
+    {
+        return publishTime;
+    }
+    public void setPublisher(Long publisher) 
+    {
+        this.publisher = publisher;
+    }
+
+    public Long getPublisher() 
+    {
+        return publisher;
+    }
+    public void setPublishStatus(String publishStatus) 
+    {
+        this.publishStatus = publishStatus;
+    }
+
+    public String getPublishStatus() 
+    {
+        return publishStatus;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("memberId", getMemberId())
+            .append("gardenId", getGardenId())
+            .append("taskId", getTaskId())
+            .append("logType", getLogType())
+            .append("content", getContent())
+            .append("publishTime", getPublishTime())
+            .append("publisher", getPublisher())
+            .append("publishStatus", getPublishStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/GardenLogAttach.java b/private-farm/src/main/java/com/jlt/csa/domain/GardenLogAttach.java
new file mode 100644
index 000000000..0f7b869b3
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/GardenLogAttach.java
@@ -0,0 +1,169 @@
+package com.jlt.csa.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 菜地日志附件对象 csa_garden_log_attach
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class GardenLogAttach extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 附件id */
+    private Long id;
+
+    /** 菜地日志 */
+    private Long logId;
+
+    /** 附件类型 */
+    @Excel(name = "附件类型")
+    private String attachType;
+
+    /** 文件名 */
+    @Excel(name = "文件名")
+    private String filename;
+
+    /** URL */
+    @Excel(name = "URL")
+    private String url;
+
+    /** 附件宽度 */
+    @Excel(name = "附件宽度")
+    private Long width;
+
+    /** 附件高度 */
+    @Excel(name = "附件高度")
+    private Long height;
+
+    /** 字节数 */
+    @Excel(name = "字节数")
+    private Long bytes;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date publishTime;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setLogId(Long logId) 
+    {
+        this.logId = logId;
+    }
+
+    public Long getLogId() 
+    {
+        return logId;
+    }
+    public void setAttachType(String attachType) 
+    {
+        this.attachType = attachType;
+    }
+
+    public String getAttachType() 
+    {
+        return attachType;
+    }
+    public void setFilename(String filename) 
+    {
+        this.filename = filename;
+    }
+
+    public String getFilename() 
+    {
+        return filename;
+    }
+    public void setUrl(String url) 
+    {
+        this.url = url;
+    }
+
+    public String getUrl() 
+    {
+        return url;
+    }
+    public void setWidth(Long width) 
+    {
+        this.width = width;
+    }
+
+    public Long getWidth() 
+    {
+        return width;
+    }
+    public void setHeight(Long height) 
+    {
+        this.height = height;
+    }
+
+    public Long getHeight() 
+    {
+        return height;
+    }
+    public void setBytes(Long bytes) 
+    {
+        this.bytes = bytes;
+    }
+
+    public Long getBytes() 
+    {
+        return bytes;
+    }
+    public void setPublishTime(Date publishTime) 
+    {
+        this.publishTime = publishTime;
+    }
+
+    public Date getPublishTime() 
+    {
+        return publishTime;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("logId", getLogId())
+            .append("attachType", getAttachType())
+            .append("filename", getFilename())
+            .append("url", getUrl())
+            .append("width", getWidth())
+            .append("height", getHeight())
+            .append("bytes", getBytes())
+            .append("publishTime", getPublishTime())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/GardenStrain.java b/private-farm/src/main/java/com/jlt/csa/domain/GardenStrain.java
new file mode 100644
index 000000000..5b1424055
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/GardenStrain.java
@@ -0,0 +1,242 @@
+package com.jlt.csa.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 菜地品种对象 csa_garden_strain
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class GardenStrain extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 菜地品种id */
+    private Long id;
+
+    /** 菜地 */
+    private Long gardenId;
+
+    /** 种植任务 */
+    @Excel(name = "种植任务")
+    private Long taskId;
+
+    /** 作物id */
+    @Excel(name = "作物id")
+    private Long cropId;
+
+    /** 作物阶段 */
+    @Excel(name = "作物阶段")
+    private Long cropPhaseId;
+
+    /** 平方米 */
+    @Excel(name = "平方米")
+    private BigDecimal m2;
+
+    /** 产出重量 */
+    @Excel(name = "产出重量")
+    private BigDecimal outputWeight;
+
+    /** 是否确定 */
+    @Excel(name = "是否确定")
+    private String isDefinite;
+
+    /** 是否种植 */
+    @Excel(name = "是否种植")
+    private String isPlanted;
+
+    /** 是否拉秧 */
+    @Excel(name = "是否拉秧")
+    private String isEnded;
+
+    /** 确定时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "确定时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date definiteDate;
+
+    /** 种植日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "种植日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date plantedDate;
+
+    /** 拉秧日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "拉秧日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date endedDate;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String status;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setGardenId(Long gardenId) 
+    {
+        this.gardenId = gardenId;
+    }
+
+    public Long getGardenId() 
+    {
+        return gardenId;
+    }
+    public void setTaskId(Long taskId) 
+    {
+        this.taskId = taskId;
+    }
+
+    public Long getTaskId() 
+    {
+        return taskId;
+    }
+    public void setCropId(Long cropId) 
+    {
+        this.cropId = cropId;
+    }
+
+    public Long getCropId() 
+    {
+        return cropId;
+    }
+    public void setCropPhaseId(Long cropPhaseId) 
+    {
+        this.cropPhaseId = cropPhaseId;
+    }
+
+    public Long getCropPhaseId() 
+    {
+        return cropPhaseId;
+    }
+    public void setM2(BigDecimal m2) 
+    {
+        this.m2 = m2;
+    }
+
+    public BigDecimal getM2() 
+    {
+        return m2;
+    }
+    public void setOutputWeight(BigDecimal outputWeight) 
+    {
+        this.outputWeight = outputWeight;
+    }
+
+    public BigDecimal getOutputWeight() 
+    {
+        return outputWeight;
+    }
+    public void setIsDefinite(String isDefinite) 
+    {
+        this.isDefinite = isDefinite;
+    }
+
+    public String getIsDefinite() 
+    {
+        return isDefinite;
+    }
+    public void setIsPlanted(String isPlanted) 
+    {
+        this.isPlanted = isPlanted;
+    }
+
+    public String getIsPlanted() 
+    {
+        return isPlanted;
+    }
+    public void setIsEnded(String isEnded) 
+    {
+        this.isEnded = isEnded;
+    }
+
+    public String getIsEnded() 
+    {
+        return isEnded;
+    }
+    public void setDefiniteDate(Date definiteDate) 
+    {
+        this.definiteDate = definiteDate;
+    }
+
+    public Date getDefiniteDate() 
+    {
+        return definiteDate;
+    }
+    public void setPlantedDate(Date plantedDate) 
+    {
+        this.plantedDate = plantedDate;
+    }
+
+    public Date getPlantedDate() 
+    {
+        return plantedDate;
+    }
+    public void setEndedDate(Date endedDate) 
+    {
+        this.endedDate = endedDate;
+    }
+
+    public Date getEndedDate() 
+    {
+        return endedDate;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("gardenId", getGardenId())
+            .append("taskId", getTaskId())
+            .append("cropId", getCropId())
+            .append("cropPhaseId", getCropPhaseId())
+            .append("m2", getM2())
+            .append("outputWeight", getOutputWeight())
+            .append("isDefinite", getIsDefinite())
+            .append("isPlanted", getIsPlanted())
+            .append("isEnded", getIsEnded())
+            .append("definiteDate", getDefiniteDate())
+            .append("plantedDate", getPlantedDate())
+            .append("endedDate", getEndedDate())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/PickDetail.java b/private-farm/src/main/java/com/jlt/csa/domain/PickDetail.java
new file mode 100644
index 000000000..ccd5043ec
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/PickDetail.java
@@ -0,0 +1,124 @@
+package com.jlt.csa.domain;
+
+import java.math.BigDecimal;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 采摘任务明细对象 csa_pick_detail
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class PickDetail extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 采摘明细id */
+    private Long id;
+
+    /** 任务id */
+    private Long taskId;
+
+    /** 菜地品种id */
+    private Long strainId;
+
+    /** 计划重量 */
+    @Excel(name = "计划重量")
+    private BigDecimal planWeight;
+
+    /** 实际重量 */
+    @Excel(name = "实际重量")
+    private BigDecimal resultWeight;
+
+    /** 是否处理完毕 */
+    @Excel(name = "是否处理完毕")
+    private String isCompleted;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setTaskId(Long taskId) 
+    {
+        this.taskId = taskId;
+    }
+
+    public Long getTaskId() 
+    {
+        return taskId;
+    }
+    public void setStrainId(Long strainId) 
+    {
+        this.strainId = strainId;
+    }
+
+    public Long getStrainId() 
+    {
+        return strainId;
+    }
+    public void setPlanWeight(BigDecimal planWeight) 
+    {
+        this.planWeight = planWeight;
+    }
+
+    public BigDecimal getPlanWeight() 
+    {
+        return planWeight;
+    }
+    public void setResultWeight(BigDecimal resultWeight) 
+    {
+        this.resultWeight = resultWeight;
+    }
+
+    public BigDecimal getResultWeight() 
+    {
+        return resultWeight;
+    }
+    public void setIsCompleted(String isCompleted) 
+    {
+        this.isCompleted = isCompleted;
+    }
+
+    public String getIsCompleted() 
+    {
+        return isCompleted;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("taskId", getTaskId())
+            .append("strainId", getStrainId())
+            .append("planWeight", getPlanWeight())
+            .append("resultWeight", getResultWeight())
+            .append("isCompleted", getIsCompleted())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/domain/TendTask.java b/private-farm/src/main/java/com/jlt/csa/domain/TendTask.java
new file mode 100644
index 000000000..e8bb4e6d8
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/domain/TendTask.java
@@ -0,0 +1,240 @@
+package com.jlt.csa.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 打理任务对象 csa_tend_task
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public class TendTask extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 任务id */
+    private Long id;
+
+    /** 菜地id */
+    @Excel(name = "菜地id")
+    private Long gardenId;
+
+    /** 任务类型 */
+    private String taskType;
+
+    /** 任务子类型 */
+    private String taskSubtype;
+
+    /** 任务描述 */
+    @Excel(name = "任务描述")
+    private String description;
+
+    /** 任务阶段 */
+    @Excel(name = "任务阶段")
+    private String executionPhase;
+
+    /** 金币花费 */
+    @Excel(name = "金币花费")
+    private BigDecimal coins;
+
+    /** 任务产生时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "任务产生时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date taskTime;
+
+    /** 反馈时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "反馈时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date feedbackTime;
+
+    /** 反馈结果 */
+    @Excel(name = "反馈结果")
+    private String feedbackResult;
+
+    /** 执行人 */
+    @Excel(name = "执行人")
+    private Long executor;
+
+    /** 反馈人 */
+    @Excel(name = "反馈人")
+    private Long feedbacker;
+
+    /** 是否处理完毕 */
+    @Excel(name = "是否处理完毕")
+    private String isCompleted;
+
+    /** 状态(0正常 1停用) */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setGardenId(Long gardenId) 
+    {
+        this.gardenId = gardenId;
+    }
+
+    public Long getGardenId() 
+    {
+        return gardenId;
+    }
+    public void setTaskType(String taskType) 
+    {
+        this.taskType = taskType;
+    }
+
+    public String getTaskType() 
+    {
+        return taskType;
+    }
+    public void setTaskSubtype(String taskSubtype) 
+    {
+        this.taskSubtype = taskSubtype;
+    }
+
+    public String getTaskSubtype() 
+    {
+        return taskSubtype;
+    }
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+
+    public String getDescription() 
+    {
+        return description;
+    }
+    public void setExecutionPhase(String executionPhase) 
+    {
+        this.executionPhase = executionPhase;
+    }
+
+    public String getExecutionPhase() 
+    {
+        return executionPhase;
+    }
+    public void setCoins(BigDecimal coins) 
+    {
+        this.coins = coins;
+    }
+
+    public BigDecimal getCoins() 
+    {
+        return coins;
+    }
+    public void setTaskTime(Date taskTime) 
+    {
+        this.taskTime = taskTime;
+    }
+
+    public Date getTaskTime() 
+    {
+        return taskTime;
+    }
+    public void setFeedbackTime(Date feedbackTime) 
+    {
+        this.feedbackTime = feedbackTime;
+    }
+
+    public Date getFeedbackTime() 
+    {
+        return feedbackTime;
+    }
+    public void setFeedbackResult(String feedbackResult) 
+    {
+        this.feedbackResult = feedbackResult;
+    }
+
+    public String getFeedbackResult() 
+    {
+        return feedbackResult;
+    }
+    public void setExecutor(Long executor) 
+    {
+        this.executor = executor;
+    }
+
+    public Long getExecutor() 
+    {
+        return executor;
+    }
+    public void setFeedbacker(Long feedbacker) 
+    {
+        this.feedbacker = feedbacker;
+    }
+
+    public Long getFeedbacker() 
+    {
+        return feedbacker;
+    }
+    public void setIsCompleted(String isCompleted) 
+    {
+        this.isCompleted = isCompleted;
+    }
+
+    public String getIsCompleted() 
+    {
+        return isCompleted;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("gardenId", getGardenId())
+            .append("taskType", getTaskType())
+            .append("taskSubtype", getTaskSubtype())
+            .append("description", getDescription())
+            .append("executionPhase", getExecutionPhase())
+            .append("coins", getCoins())
+            .append("taskTime", getTaskTime())
+            .append("feedbackTime", getFeedbackTime())
+            .append("feedbackResult", getFeedbackResult())
+            .append("executor", getExecutor())
+            .append("feedbacker", getFeedbacker())
+            .append("isCompleted", getIsCompleted())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/ArchedRecordMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/ArchedRecordMapper.java
new file mode 100644
index 000000000..357aa81f2
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/ArchedRecordMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.ArchedRecord;
+
+/**
+ * 拱棚使用记录Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface ArchedRecordMapper 
+{
+    /**
+     * 查询拱棚使用记录
+     * 
+     * @param id 拱棚使用记录主键
+     * @return 拱棚使用记录
+     */
+    public ArchedRecord selectArchedRecordById(Long id);
+
+    /**
+     * 查询拱棚使用记录列表
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 拱棚使用记录集合
+     */
+    public List<ArchedRecord> selectArchedRecordList(ArchedRecord archedRecord);
+
+    /**
+     * 新增拱棚使用记录
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 结果
+     */
+    public int insertArchedRecord(ArchedRecord archedRecord);
+
+    /**
+     * 修改拱棚使用记录
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 结果
+     */
+    public int updateArchedRecord(ArchedRecord archedRecord);
+
+    /**
+     * 删除拱棚使用记录
+     * 
+     * @param id 拱棚使用记录主键
+     * @return 结果
+     */
+    public int deleteArchedRecordById(Long id);
+
+    /**
+     * 批量删除拱棚使用记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteArchedRecordByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/CoinRecordMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/CoinRecordMapper.java
new file mode 100644
index 000000000..4bc1ded53
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/CoinRecordMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.CoinRecord;
+
+/**
+ * 金币记录Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface CoinRecordMapper 
+{
+    /**
+     * 查询金币记录
+     * 
+     * @param id 金币记录主键
+     * @return 金币记录
+     */
+    public CoinRecord selectCoinRecordById(Long id);
+
+    /**
+     * 查询金币记录列表
+     * 
+     * @param coinRecord 金币记录
+     * @return 金币记录集合
+     */
+    public List<CoinRecord> selectCoinRecordList(CoinRecord coinRecord);
+
+    /**
+     * 新增金币记录
+     * 
+     * @param coinRecord 金币记录
+     * @return 结果
+     */
+    public int insertCoinRecord(CoinRecord coinRecord);
+
+    /**
+     * 修改金币记录
+     * 
+     * @param coinRecord 金币记录
+     * @return 结果
+     */
+    public int updateCoinRecord(CoinRecord coinRecord);
+
+    /**
+     * 删除金币记录
+     * 
+     * @param id 金币记录主键
+     * @return 结果
+     */
+    public int deleteCoinRecordById(Long id);
+
+    /**
+     * 批量删除金币记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCoinRecordByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/CommunicateRecordMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/CommunicateRecordMapper.java
new file mode 100644
index 000000000..a14914a97
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/CommunicateRecordMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.CommunicateRecord;
+
+/**
+ * 沟通记录Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface CommunicateRecordMapper 
+{
+    /**
+     * 查询沟通记录
+     * 
+     * @param id 沟通记录主键
+     * @return 沟通记录
+     */
+    public CommunicateRecord selectCommunicateRecordById(Long id);
+
+    /**
+     * 查询沟通记录列表
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 沟通记录集合
+     */
+    public List<CommunicateRecord> selectCommunicateRecordList(CommunicateRecord communicateRecord);
+
+    /**
+     * 新增沟通记录
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 结果
+     */
+    public int insertCommunicateRecord(CommunicateRecord communicateRecord);
+
+    /**
+     * 修改沟通记录
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 结果
+     */
+    public int updateCommunicateRecord(CommunicateRecord communicateRecord);
+
+    /**
+     * 删除沟通记录
+     * 
+     * @param id 沟通记录主键
+     * @return 结果
+     */
+    public int deleteCommunicateRecordById(Long id);
+
+    /**
+     * 批量删除沟通记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCommunicateRecordByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/CropFilesMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/CropFilesMapper.java
new file mode 100644
index 000000000..48fa52c1e
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/CropFilesMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.CropFiles;
+
+/**
+ * 作物档案Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-25
+ */
+public interface CropFilesMapper 
+{
+    /**
+     * 查询作物档案
+     * 
+     * @param id 作物档案主键
+     * @return 作物档案
+     */
+    public CropFiles selectCropFilesById(Long id);
+
+    /**
+     * 查询作物档案列表
+     * 
+     * @param cropFiles 作物档案
+     * @return 作物档案集合
+     */
+    public List<CropFiles> selectCropFilesList(CropFiles cropFiles);
+
+    /**
+     * 新增作物档案
+     * 
+     * @param cropFiles 作物档案
+     * @return 结果
+     */
+    public int insertCropFiles(CropFiles cropFiles);
+
+    /**
+     * 修改作物档案
+     * 
+     * @param cropFiles 作物档案
+     * @return 结果
+     */
+    public int updateCropFiles(CropFiles cropFiles);
+
+    /**
+     * 删除作物档案
+     * 
+     * @param id 作物档案主键
+     * @return 结果
+     */
+    public int deleteCropFilesById(Long id);
+
+    /**
+     * 批量删除作物档案
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCropFilesByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/CropPhaseMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/CropPhaseMapper.java
new file mode 100644
index 000000000..66629e059
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/CropPhaseMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.CropPhase;
+
+/**
+ * 作物生长阶段Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public interface CropPhaseMapper 
+{
+    /**
+     * 查询作物生长阶段
+     * 
+     * @param id 作物生长阶段主键
+     * @return 作物生长阶段
+     */
+    public CropPhase selectCropPhaseById(Long id);
+
+    /**
+     * 查询作物生长阶段列表
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 作物生长阶段集合
+     */
+    public List<CropPhase> selectCropPhaseList(CropPhase cropPhase);
+
+    /**
+     * 新增作物生长阶段
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 结果
+     */
+    public int insertCropPhase(CropPhase cropPhase);
+
+    /**
+     * 修改作物生长阶段
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 结果
+     */
+    public int updateCropPhase(CropPhase cropPhase);
+
+    /**
+     * 删除作物生长阶段
+     * 
+     * @param id 作物生长阶段主键
+     * @return 结果
+     */
+    public int deleteCropPhaseById(Long id);
+
+    /**
+     * 批量删除作物生长阶段
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCropPhaseByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/CsaFarmerMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/CsaFarmerMapper.java
new file mode 100644
index 000000000..1205363be
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/CsaFarmerMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.CsaFarmer;
+
+/**
+ * 私家农场会员Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public interface CsaFarmerMapper 
+{
+    /**
+     * 查询私家农场会员
+     * 
+     * @param id 私家农场会员主键
+     * @return 私家农场会员
+     */
+    public CsaFarmer selectCsaFarmerById(Long id);
+
+    /**
+     * 查询私家农场会员列表
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 私家农场会员集合
+     */
+    public List<CsaFarmer> selectCsaFarmerList(CsaFarmer csaFarmer);
+
+    /**
+     * 新增私家农场会员
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 结果
+     */
+    public int insertCsaFarmer(CsaFarmer csaFarmer);
+
+    /**
+     * 修改私家农场会员
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 结果
+     */
+    public int updateCsaFarmer(CsaFarmer csaFarmer);
+
+    /**
+     * 删除私家农场会员
+     * 
+     * @param id 私家农场会员主键
+     * @return 结果
+     */
+    public int deleteCsaFarmerById(Long id);
+
+    /**
+     * 批量删除私家农场会员
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCsaFarmerByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/CsaMemberCardMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/CsaMemberCardMapper.java
new file mode 100644
index 000000000..b6234fd7d
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/CsaMemberCardMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.CsaMemberCard;
+
+/**
+ * 会员卡Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public interface CsaMemberCardMapper 
+{
+    /**
+     * 查询会员卡
+     * 
+     * @param id 会员卡主键
+     * @return 会员卡
+     */
+    public CsaMemberCard selectCsaMemberCardById(Long id);
+
+    /**
+     * 查询会员卡列表
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 会员卡集合
+     */
+    public List<CsaMemberCard> selectCsaMemberCardList(CsaMemberCard csaMemberCard);
+
+    /**
+     * 新增会员卡
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 结果
+     */
+    public int insertCsaMemberCard(CsaMemberCard csaMemberCard);
+
+    /**
+     * 修改会员卡
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 结果
+     */
+    public int updateCsaMemberCard(CsaMemberCard csaMemberCard);
+
+    /**
+     * 删除会员卡
+     * 
+     * @param id 会员卡主键
+     * @return 结果
+     */
+    public int deleteCsaMemberCardById(Long id);
+
+    /**
+     * 批量删除会员卡
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCsaMemberCardByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/GardenLogAttachMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/GardenLogAttachMapper.java
new file mode 100644
index 000000000..39e818e28
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/GardenLogAttachMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.GardenLogAttach;
+
+/**
+ * 菜地日志附件Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface GardenLogAttachMapper 
+{
+    /**
+     * 查询菜地日志附件
+     * 
+     * @param id 菜地日志附件主键
+     * @return 菜地日志附件
+     */
+    public GardenLogAttach selectGardenLogAttachById(Long id);
+
+    /**
+     * 查询菜地日志附件列表
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 菜地日志附件集合
+     */
+    public List<GardenLogAttach> selectGardenLogAttachList(GardenLogAttach gardenLogAttach);
+
+    /**
+     * 新增菜地日志附件
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 结果
+     */
+    public int insertGardenLogAttach(GardenLogAttach gardenLogAttach);
+
+    /**
+     * 修改菜地日志附件
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 结果
+     */
+    public int updateGardenLogAttach(GardenLogAttach gardenLogAttach);
+
+    /**
+     * 删除菜地日志附件
+     * 
+     * @param id 菜地日志附件主键
+     * @return 结果
+     */
+    public int deleteGardenLogAttachById(Long id);
+
+    /**
+     * 批量删除菜地日志附件
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteGardenLogAttachByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/GardenLogMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/GardenLogMapper.java
new file mode 100644
index 000000000..16364ef52
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/GardenLogMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.GardenLog;
+
+/**
+ * 菜地日志Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface GardenLogMapper 
+{
+    /**
+     * 查询菜地日志
+     * 
+     * @param id 菜地日志主键
+     * @return 菜地日志
+     */
+    public GardenLog selectGardenLogById(Long id);
+
+    /**
+     * 查询菜地日志列表
+     * 
+     * @param gardenLog 菜地日志
+     * @return 菜地日志集合
+     */
+    public List<GardenLog> selectGardenLogList(GardenLog gardenLog);
+
+    /**
+     * 新增菜地日志
+     * 
+     * @param gardenLog 菜地日志
+     * @return 结果
+     */
+    public int insertGardenLog(GardenLog gardenLog);
+
+    /**
+     * 修改菜地日志
+     * 
+     * @param gardenLog 菜地日志
+     * @return 结果
+     */
+    public int updateGardenLog(GardenLog gardenLog);
+
+    /**
+     * 删除菜地日志
+     * 
+     * @param id 菜地日志主键
+     * @return 结果
+     */
+    public int deleteGardenLogById(Long id);
+
+    /**
+     * 批量删除菜地日志
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteGardenLogByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/GardenStrainMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/GardenStrainMapper.java
new file mode 100644
index 000000000..f678f991b
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/GardenStrainMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.GardenStrain;
+
+/**
+ * 菜地品种Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface GardenStrainMapper 
+{
+    /**
+     * 查询菜地品种
+     * 
+     * @param id 菜地品种主键
+     * @return 菜地品种
+     */
+    public GardenStrain selectGardenStrainById(Long id);
+
+    /**
+     * 查询菜地品种列表
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 菜地品种集合
+     */
+    public List<GardenStrain> selectGardenStrainList(GardenStrain gardenStrain);
+
+    /**
+     * 新增菜地品种
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 结果
+     */
+    public int insertGardenStrain(GardenStrain gardenStrain);
+
+    /**
+     * 修改菜地品种
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 结果
+     */
+    public int updateGardenStrain(GardenStrain gardenStrain);
+
+    /**
+     * 删除菜地品种
+     * 
+     * @param id 菜地品种主键
+     * @return 结果
+     */
+    public int deleteGardenStrainById(Long id);
+
+    /**
+     * 批量删除菜地品种
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteGardenStrainByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/PickDetailMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/PickDetailMapper.java
new file mode 100644
index 000000000..90729b5a3
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/PickDetailMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.PickDetail;
+
+/**
+ * 采摘任务明细Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface PickDetailMapper 
+{
+    /**
+     * 查询采摘任务明细
+     * 
+     * @param id 采摘任务明细主键
+     * @return 采摘任务明细
+     */
+    public PickDetail selectPickDetailById(Long id);
+
+    /**
+     * 查询采摘任务明细列表
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 采摘任务明细集合
+     */
+    public List<PickDetail> selectPickDetailList(PickDetail pickDetail);
+
+    /**
+     * 新增采摘任务明细
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 结果
+     */
+    public int insertPickDetail(PickDetail pickDetail);
+
+    /**
+     * 修改采摘任务明细
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 结果
+     */
+    public int updatePickDetail(PickDetail pickDetail);
+
+    /**
+     * 删除采摘任务明细
+     * 
+     * @param id 采摘任务明细主键
+     * @return 结果
+     */
+    public int deletePickDetailById(Long id);
+
+    /**
+     * 批量删除采摘任务明细
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePickDetailByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/mapper/TendTaskMapper.java b/private-farm/src/main/java/com/jlt/csa/mapper/TendTaskMapper.java
new file mode 100644
index 000000000..87acad83a
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/mapper/TendTaskMapper.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.mapper;
+
+import java.util.List;
+import com.jlt.csa.domain.TendTask;
+
+/**
+ * 打理任务Mapper接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface TendTaskMapper 
+{
+    /**
+     * 查询打理任务
+     * 
+     * @param id 打理任务主键
+     * @return 打理任务
+     */
+    public TendTask selectTendTaskById(Long id);
+
+    /**
+     * 查询打理任务列表
+     * 
+     * @param tendTask 打理任务
+     * @return 打理任务集合
+     */
+    public List<TendTask> selectTendTaskList(TendTask tendTask);
+
+    /**
+     * 新增打理任务
+     * 
+     * @param tendTask 打理任务
+     * @return 结果
+     */
+    public int insertTendTask(TendTask tendTask);
+
+    /**
+     * 修改打理任务
+     * 
+     * @param tendTask 打理任务
+     * @return 结果
+     */
+    public int updateTendTask(TendTask tendTask);
+
+    /**
+     * 删除打理任务
+     * 
+     * @param id 打理任务主键
+     * @return 结果
+     */
+    public int deleteTendTaskById(Long id);
+
+    /**
+     * 批量删除打理任务
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteTendTaskByIds(Long[] ids);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/IArchedRecordService.java b/private-farm/src/main/java/com/jlt/csa/service/IArchedRecordService.java
new file mode 100644
index 000000000..40a124dfb
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/IArchedRecordService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.ArchedRecord;
+
+/**
+ * 拱棚使用记录Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface IArchedRecordService 
+{
+    /**
+     * 查询拱棚使用记录
+     * 
+     * @param id 拱棚使用记录主键
+     * @return 拱棚使用记录
+     */
+    public ArchedRecord selectArchedRecordById(Long id);
+
+    /**
+     * 查询拱棚使用记录列表
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 拱棚使用记录集合
+     */
+    public List<ArchedRecord> selectArchedRecordList(ArchedRecord archedRecord);
+
+    /**
+     * 新增拱棚使用记录
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 结果
+     */
+    public int insertArchedRecord(ArchedRecord archedRecord);
+
+    /**
+     * 修改拱棚使用记录
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 结果
+     */
+    public int updateArchedRecord(ArchedRecord archedRecord);
+
+    /**
+     * 批量删除拱棚使用记录
+     * 
+     * @param ids 需要删除的拱棚使用记录主键集合
+     * @return 结果
+     */
+    public int deleteArchedRecordByIds(Long[] ids);
+
+    /**
+     * 删除拱棚使用记录信息
+     * 
+     * @param id 拱棚使用记录主键
+     * @return 结果
+     */
+    public int deleteArchedRecordById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/ICoinRecordService.java b/private-farm/src/main/java/com/jlt/csa/service/ICoinRecordService.java
new file mode 100644
index 000000000..8df891658
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/ICoinRecordService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.CoinRecord;
+
+/**
+ * 金币记录Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface ICoinRecordService 
+{
+    /**
+     * 查询金币记录
+     * 
+     * @param id 金币记录主键
+     * @return 金币记录
+     */
+    public CoinRecord selectCoinRecordById(Long id);
+
+    /**
+     * 查询金币记录列表
+     * 
+     * @param coinRecord 金币记录
+     * @return 金币记录集合
+     */
+    public List<CoinRecord> selectCoinRecordList(CoinRecord coinRecord);
+
+    /**
+     * 新增金币记录
+     * 
+     * @param coinRecord 金币记录
+     * @return 结果
+     */
+    public int insertCoinRecord(CoinRecord coinRecord);
+
+    /**
+     * 修改金币记录
+     * 
+     * @param coinRecord 金币记录
+     * @return 结果
+     */
+    public int updateCoinRecord(CoinRecord coinRecord);
+
+    /**
+     * 批量删除金币记录
+     * 
+     * @param ids 需要删除的金币记录主键集合
+     * @return 结果
+     */
+    public int deleteCoinRecordByIds(Long[] ids);
+
+    /**
+     * 删除金币记录信息
+     * 
+     * @param id 金币记录主键
+     * @return 结果
+     */
+    public int deleteCoinRecordById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/ICommunicateRecordService.java b/private-farm/src/main/java/com/jlt/csa/service/ICommunicateRecordService.java
new file mode 100644
index 000000000..a6585a19a
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/ICommunicateRecordService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.CommunicateRecord;
+
+/**
+ * 沟通记录Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface ICommunicateRecordService 
+{
+    /**
+     * 查询沟通记录
+     * 
+     * @param id 沟通记录主键
+     * @return 沟通记录
+     */
+    public CommunicateRecord selectCommunicateRecordById(Long id);
+
+    /**
+     * 查询沟通记录列表
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 沟通记录集合
+     */
+    public List<CommunicateRecord> selectCommunicateRecordList(CommunicateRecord communicateRecord);
+
+    /**
+     * 新增沟通记录
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 结果
+     */
+    public int insertCommunicateRecord(CommunicateRecord communicateRecord);
+
+    /**
+     * 修改沟通记录
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 结果
+     */
+    public int updateCommunicateRecord(CommunicateRecord communicateRecord);
+
+    /**
+     * 批量删除沟通记录
+     * 
+     * @param ids 需要删除的沟通记录主键集合
+     * @return 结果
+     */
+    public int deleteCommunicateRecordByIds(Long[] ids);
+
+    /**
+     * 删除沟通记录信息
+     * 
+     * @param id 沟通记录主键
+     * @return 结果
+     */
+    public int deleteCommunicateRecordById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/ICropFilesService.java b/private-farm/src/main/java/com/jlt/csa/service/ICropFilesService.java
new file mode 100644
index 000000000..28bbbea9d
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/ICropFilesService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.CropFiles;
+
+/**
+ * 作物档案Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-25
+ */
+public interface ICropFilesService 
+{
+    /**
+     * 查询作物档案
+     * 
+     * @param id 作物档案主键
+     * @return 作物档案
+     */
+    public CropFiles selectCropFilesById(Long id);
+
+    /**
+     * 查询作物档案列表
+     * 
+     * @param cropFiles 作物档案
+     * @return 作物档案集合
+     */
+    public List<CropFiles> selectCropFilesList(CropFiles cropFiles);
+
+    /**
+     * 新增作物档案
+     * 
+     * @param cropFiles 作物档案
+     * @return 结果
+     */
+    public int insertCropFiles(CropFiles cropFiles);
+
+    /**
+     * 修改作物档案
+     * 
+     * @param cropFiles 作物档案
+     * @return 结果
+     */
+    public int updateCropFiles(CropFiles cropFiles);
+
+    /**
+     * 批量删除作物档案
+     * 
+     * @param ids 需要删除的作物档案主键集合
+     * @return 结果
+     */
+    public int deleteCropFilesByIds(Long[] ids);
+
+    /**
+     * 删除作物档案信息
+     * 
+     * @param id 作物档案主键
+     * @return 结果
+     */
+    public int deleteCropFilesById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/ICropPhaseService.java b/private-farm/src/main/java/com/jlt/csa/service/ICropPhaseService.java
new file mode 100644
index 000000000..9420faed5
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/ICropPhaseService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.CropPhase;
+
+/**
+ * 作物生长阶段Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public interface ICropPhaseService 
+{
+    /**
+     * 查询作物生长阶段
+     * 
+     * @param id 作物生长阶段主键
+     * @return 作物生长阶段
+     */
+    public CropPhase selectCropPhaseById(Long id);
+
+    /**
+     * 查询作物生长阶段列表
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 作物生长阶段集合
+     */
+    public List<CropPhase> selectCropPhaseList(CropPhase cropPhase);
+
+    /**
+     * 新增作物生长阶段
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 结果
+     */
+    public int insertCropPhase(CropPhase cropPhase);
+
+    /**
+     * 修改作物生长阶段
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 结果
+     */
+    public int updateCropPhase(CropPhase cropPhase);
+
+    /**
+     * 批量删除作物生长阶段
+     * 
+     * @param ids 需要删除的作物生长阶段主键集合
+     * @return 结果
+     */
+    public int deleteCropPhaseByIds(Long[] ids);
+
+    /**
+     * 删除作物生长阶段信息
+     * 
+     * @param id 作物生长阶段主键
+     * @return 结果
+     */
+    public int deleteCropPhaseById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/ICsaFarmerService.java b/private-farm/src/main/java/com/jlt/csa/service/ICsaFarmerService.java
new file mode 100644
index 000000000..826e77f45
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/ICsaFarmerService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.CsaFarmer;
+
+/**
+ * 私家农场会员Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public interface ICsaFarmerService 
+{
+    /**
+     * 查询私家农场会员
+     * 
+     * @param id 私家农场会员主键
+     * @return 私家农场会员
+     */
+    public CsaFarmer selectCsaFarmerById(Long id);
+
+    /**
+     * 查询私家农场会员列表
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 私家农场会员集合
+     */
+    public List<CsaFarmer> selectCsaFarmerList(CsaFarmer csaFarmer);
+
+    /**
+     * 新增私家农场会员
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 结果
+     */
+    public int insertCsaFarmer(CsaFarmer csaFarmer);
+
+    /**
+     * 修改私家农场会员
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 结果
+     */
+    public int updateCsaFarmer(CsaFarmer csaFarmer);
+
+    /**
+     * 批量删除私家农场会员
+     * 
+     * @param ids 需要删除的私家农场会员主键集合
+     * @return 结果
+     */
+    public int deleteCsaFarmerByIds(Long[] ids);
+
+    /**
+     * 删除私家农场会员信息
+     * 
+     * @param id 私家农场会员主键
+     * @return 结果
+     */
+    public int deleteCsaFarmerById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/ICsaMemberCardService.java b/private-farm/src/main/java/com/jlt/csa/service/ICsaMemberCardService.java
new file mode 100644
index 000000000..b3deb654e
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/ICsaMemberCardService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.CsaMemberCard;
+
+/**
+ * 会员卡Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+public interface ICsaMemberCardService 
+{
+    /**
+     * 查询会员卡
+     * 
+     * @param id 会员卡主键
+     * @return 会员卡
+     */
+    public CsaMemberCard selectCsaMemberCardById(Long id);
+
+    /**
+     * 查询会员卡列表
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 会员卡集合
+     */
+    public List<CsaMemberCard> selectCsaMemberCardList(CsaMemberCard csaMemberCard);
+
+    /**
+     * 新增会员卡
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 结果
+     */
+    public int insertCsaMemberCard(CsaMemberCard csaMemberCard);
+
+    /**
+     * 修改会员卡
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 结果
+     */
+    public int updateCsaMemberCard(CsaMemberCard csaMemberCard);
+
+    /**
+     * 批量删除会员卡
+     * 
+     * @param ids 需要删除的会员卡主键集合
+     * @return 结果
+     */
+    public int deleteCsaMemberCardByIds(Long[] ids);
+
+    /**
+     * 删除会员卡信息
+     * 
+     * @param id 会员卡主键
+     * @return 结果
+     */
+    public int deleteCsaMemberCardById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/IGardenLogAttachService.java b/private-farm/src/main/java/com/jlt/csa/service/IGardenLogAttachService.java
new file mode 100644
index 000000000..fc850b7f2
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/IGardenLogAttachService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.GardenLogAttach;
+
+/**
+ * 菜地日志附件Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface IGardenLogAttachService 
+{
+    /**
+     * 查询菜地日志附件
+     * 
+     * @param id 菜地日志附件主键
+     * @return 菜地日志附件
+     */
+    public GardenLogAttach selectGardenLogAttachById(Long id);
+
+    /**
+     * 查询菜地日志附件列表
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 菜地日志附件集合
+     */
+    public List<GardenLogAttach> selectGardenLogAttachList(GardenLogAttach gardenLogAttach);
+
+    /**
+     * 新增菜地日志附件
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 结果
+     */
+    public int insertGardenLogAttach(GardenLogAttach gardenLogAttach);
+
+    /**
+     * 修改菜地日志附件
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 结果
+     */
+    public int updateGardenLogAttach(GardenLogAttach gardenLogAttach);
+
+    /**
+     * 批量删除菜地日志附件
+     * 
+     * @param ids 需要删除的菜地日志附件主键集合
+     * @return 结果
+     */
+    public int deleteGardenLogAttachByIds(Long[] ids);
+
+    /**
+     * 删除菜地日志附件信息
+     * 
+     * @param id 菜地日志附件主键
+     * @return 结果
+     */
+    public int deleteGardenLogAttachById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/IGardenLogService.java b/private-farm/src/main/java/com/jlt/csa/service/IGardenLogService.java
new file mode 100644
index 000000000..a44ad7d7c
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/IGardenLogService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.GardenLog;
+
+/**
+ * 菜地日志Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface IGardenLogService 
+{
+    /**
+     * 查询菜地日志
+     * 
+     * @param id 菜地日志主键
+     * @return 菜地日志
+     */
+    public GardenLog selectGardenLogById(Long id);
+
+    /**
+     * 查询菜地日志列表
+     * 
+     * @param gardenLog 菜地日志
+     * @return 菜地日志集合
+     */
+    public List<GardenLog> selectGardenLogList(GardenLog gardenLog);
+
+    /**
+     * 新增菜地日志
+     * 
+     * @param gardenLog 菜地日志
+     * @return 结果
+     */
+    public int insertGardenLog(GardenLog gardenLog);
+
+    /**
+     * 修改菜地日志
+     * 
+     * @param gardenLog 菜地日志
+     * @return 结果
+     */
+    public int updateGardenLog(GardenLog gardenLog);
+
+    /**
+     * 批量删除菜地日志
+     * 
+     * @param ids 需要删除的菜地日志主键集合
+     * @return 结果
+     */
+    public int deleteGardenLogByIds(Long[] ids);
+
+    /**
+     * 删除菜地日志信息
+     * 
+     * @param id 菜地日志主键
+     * @return 结果
+     */
+    public int deleteGardenLogById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/IGardenStrainService.java b/private-farm/src/main/java/com/jlt/csa/service/IGardenStrainService.java
new file mode 100644
index 000000000..fc8b2fd7b
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/IGardenStrainService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.GardenStrain;
+
+/**
+ * 菜地品种Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface IGardenStrainService 
+{
+    /**
+     * 查询菜地品种
+     * 
+     * @param id 菜地品种主键
+     * @return 菜地品种
+     */
+    public GardenStrain selectGardenStrainById(Long id);
+
+    /**
+     * 查询菜地品种列表
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 菜地品种集合
+     */
+    public List<GardenStrain> selectGardenStrainList(GardenStrain gardenStrain);
+
+    /**
+     * 新增菜地品种
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 结果
+     */
+    public int insertGardenStrain(GardenStrain gardenStrain);
+
+    /**
+     * 修改菜地品种
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 结果
+     */
+    public int updateGardenStrain(GardenStrain gardenStrain);
+
+    /**
+     * 批量删除菜地品种
+     * 
+     * @param ids 需要删除的菜地品种主键集合
+     * @return 结果
+     */
+    public int deleteGardenStrainByIds(Long[] ids);
+
+    /**
+     * 删除菜地品种信息
+     * 
+     * @param id 菜地品种主键
+     * @return 结果
+     */
+    public int deleteGardenStrainById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/IPickDetailService.java b/private-farm/src/main/java/com/jlt/csa/service/IPickDetailService.java
new file mode 100644
index 000000000..aa714048b
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/IPickDetailService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.PickDetail;
+
+/**
+ * 采摘任务明细Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface IPickDetailService 
+{
+    /**
+     * 查询采摘任务明细
+     * 
+     * @param id 采摘任务明细主键
+     * @return 采摘任务明细
+     */
+    public PickDetail selectPickDetailById(Long id);
+
+    /**
+     * 查询采摘任务明细列表
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 采摘任务明细集合
+     */
+    public List<PickDetail> selectPickDetailList(PickDetail pickDetail);
+
+    /**
+     * 新增采摘任务明细
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 结果
+     */
+    public int insertPickDetail(PickDetail pickDetail);
+
+    /**
+     * 修改采摘任务明细
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 结果
+     */
+    public int updatePickDetail(PickDetail pickDetail);
+
+    /**
+     * 批量删除采摘任务明细
+     * 
+     * @param ids 需要删除的采摘任务明细主键集合
+     * @return 结果
+     */
+    public int deletePickDetailByIds(Long[] ids);
+
+    /**
+     * 删除采摘任务明细信息
+     * 
+     * @param id 采摘任务明细主键
+     * @return 结果
+     */
+    public int deletePickDetailById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/ITendTaskService.java b/private-farm/src/main/java/com/jlt/csa/service/ITendTaskService.java
new file mode 100644
index 000000000..82b534acb
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/ITendTaskService.java
@@ -0,0 +1,61 @@
+package com.jlt.csa.service;
+
+import java.util.List;
+import com.jlt.csa.domain.TendTask;
+
+/**
+ * 打理任务Service接口
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+public interface ITendTaskService 
+{
+    /**
+     * 查询打理任务
+     * 
+     * @param id 打理任务主键
+     * @return 打理任务
+     */
+    public TendTask selectTendTaskById(Long id);
+
+    /**
+     * 查询打理任务列表
+     * 
+     * @param tendTask 打理任务
+     * @return 打理任务集合
+     */
+    public List<TendTask> selectTendTaskList(TendTask tendTask);
+
+    /**
+     * 新增打理任务
+     * 
+     * @param tendTask 打理任务
+     * @return 结果
+     */
+    public int insertTendTask(TendTask tendTask);
+
+    /**
+     * 修改打理任务
+     * 
+     * @param tendTask 打理任务
+     * @return 结果
+     */
+    public int updateTendTask(TendTask tendTask);
+
+    /**
+     * 批量删除打理任务
+     * 
+     * @param ids 需要删除的打理任务主键集合
+     * @return 结果
+     */
+    public int deleteTendTaskByIds(Long[] ids);
+
+    /**
+     * 删除打理任务信息
+     * 
+     * @param id 打理任务主键
+     * @return 结果
+     */
+    public int deleteTendTaskById(Long id);
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/ArchedRecordServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/ArchedRecordServiceImpl.java
new file mode 100644
index 000000000..5775768e4
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/ArchedRecordServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.ArchedRecordMapper;
+import com.jlt.csa.domain.ArchedRecord;
+import com.jlt.csa.service.IArchedRecordService;
+
+/**
+ * 拱棚使用记录Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class ArchedRecordServiceImpl implements IArchedRecordService 
+{
+    @Autowired
+    private ArchedRecordMapper archedRecordMapper;
+
+    /**
+     * 查询拱棚使用记录
+     * 
+     * @param id 拱棚使用记录主键
+     * @return 拱棚使用记录
+     */
+    @Override
+    public ArchedRecord selectArchedRecordById(Long id)
+    {
+        return archedRecordMapper.selectArchedRecordById(id);
+    }
+
+    /**
+     * 查询拱棚使用记录列表
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 拱棚使用记录
+     */
+    @Override
+    public List<ArchedRecord> selectArchedRecordList(ArchedRecord archedRecord)
+    {
+        return archedRecordMapper.selectArchedRecordList(archedRecord);
+    }
+
+    /**
+     * 新增拱棚使用记录
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 结果
+     */
+    @Override
+    public int insertArchedRecord(ArchedRecord archedRecord)
+    {
+        archedRecord.setCreateTime(DateUtils.getNowDate());
+        return archedRecordMapper.insertArchedRecord(archedRecord);
+    }
+
+    /**
+     * 修改拱棚使用记录
+     * 
+     * @param archedRecord 拱棚使用记录
+     * @return 结果
+     */
+    @Override
+    public int updateArchedRecord(ArchedRecord archedRecord)
+    {
+        archedRecord.setUpdateTime(DateUtils.getNowDate());
+        return archedRecordMapper.updateArchedRecord(archedRecord);
+    }
+
+    /**
+     * 批量删除拱棚使用记录
+     * 
+     * @param ids 需要删除的拱棚使用记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteArchedRecordByIds(Long[] ids)
+    {
+        return archedRecordMapper.deleteArchedRecordByIds(ids);
+    }
+
+    /**
+     * 删除拱棚使用记录信息
+     * 
+     * @param id 拱棚使用记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteArchedRecordById(Long id)
+    {
+        return archedRecordMapper.deleteArchedRecordById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/CoinRecordServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/CoinRecordServiceImpl.java
new file mode 100644
index 000000000..90d943473
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/CoinRecordServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.CoinRecordMapper;
+import com.jlt.csa.domain.CoinRecord;
+import com.jlt.csa.service.ICoinRecordService;
+
+/**
+ * 金币记录Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class CoinRecordServiceImpl implements ICoinRecordService 
+{
+    @Autowired
+    private CoinRecordMapper coinRecordMapper;
+
+    /**
+     * 查询金币记录
+     * 
+     * @param id 金币记录主键
+     * @return 金币记录
+     */
+    @Override
+    public CoinRecord selectCoinRecordById(Long id)
+    {
+        return coinRecordMapper.selectCoinRecordById(id);
+    }
+
+    /**
+     * 查询金币记录列表
+     * 
+     * @param coinRecord 金币记录
+     * @return 金币记录
+     */
+    @Override
+    public List<CoinRecord> selectCoinRecordList(CoinRecord coinRecord)
+    {
+        return coinRecordMapper.selectCoinRecordList(coinRecord);
+    }
+
+    /**
+     * 新增金币记录
+     * 
+     * @param coinRecord 金币记录
+     * @return 结果
+     */
+    @Override
+    public int insertCoinRecord(CoinRecord coinRecord)
+    {
+        coinRecord.setCreateTime(DateUtils.getNowDate());
+        return coinRecordMapper.insertCoinRecord(coinRecord);
+    }
+
+    /**
+     * 修改金币记录
+     * 
+     * @param coinRecord 金币记录
+     * @return 结果
+     */
+    @Override
+    public int updateCoinRecord(CoinRecord coinRecord)
+    {
+        coinRecord.setUpdateTime(DateUtils.getNowDate());
+        return coinRecordMapper.updateCoinRecord(coinRecord);
+    }
+
+    /**
+     * 批量删除金币记录
+     * 
+     * @param ids 需要删除的金币记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCoinRecordByIds(Long[] ids)
+    {
+        return coinRecordMapper.deleteCoinRecordByIds(ids);
+    }
+
+    /**
+     * 删除金币记录信息
+     * 
+     * @param id 金币记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCoinRecordById(Long id)
+    {
+        return coinRecordMapper.deleteCoinRecordById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/CommunicateRecordServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/CommunicateRecordServiceImpl.java
new file mode 100644
index 000000000..3c318acf3
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/CommunicateRecordServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.CommunicateRecordMapper;
+import com.jlt.csa.domain.CommunicateRecord;
+import com.jlt.csa.service.ICommunicateRecordService;
+
+/**
+ * 沟通记录Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class CommunicateRecordServiceImpl implements ICommunicateRecordService 
+{
+    @Autowired
+    private CommunicateRecordMapper communicateRecordMapper;
+
+    /**
+     * 查询沟通记录
+     * 
+     * @param id 沟通记录主键
+     * @return 沟通记录
+     */
+    @Override
+    public CommunicateRecord selectCommunicateRecordById(Long id)
+    {
+        return communicateRecordMapper.selectCommunicateRecordById(id);
+    }
+
+    /**
+     * 查询沟通记录列表
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 沟通记录
+     */
+    @Override
+    public List<CommunicateRecord> selectCommunicateRecordList(CommunicateRecord communicateRecord)
+    {
+        return communicateRecordMapper.selectCommunicateRecordList(communicateRecord);
+    }
+
+    /**
+     * 新增沟通记录
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 结果
+     */
+    @Override
+    public int insertCommunicateRecord(CommunicateRecord communicateRecord)
+    {
+        communicateRecord.setCreateTime(DateUtils.getNowDate());
+        return communicateRecordMapper.insertCommunicateRecord(communicateRecord);
+    }
+
+    /**
+     * 修改沟通记录
+     * 
+     * @param communicateRecord 沟通记录
+     * @return 结果
+     */
+    @Override
+    public int updateCommunicateRecord(CommunicateRecord communicateRecord)
+    {
+        communicateRecord.setUpdateTime(DateUtils.getNowDate());
+        return communicateRecordMapper.updateCommunicateRecord(communicateRecord);
+    }
+
+    /**
+     * 批量删除沟通记录
+     * 
+     * @param ids 需要删除的沟通记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCommunicateRecordByIds(Long[] ids)
+    {
+        return communicateRecordMapper.deleteCommunicateRecordByIds(ids);
+    }
+
+    /**
+     * 删除沟通记录信息
+     * 
+     * @param id 沟通记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCommunicateRecordById(Long id)
+    {
+        return communicateRecordMapper.deleteCommunicateRecordById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/CropFilesServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/CropFilesServiceImpl.java
new file mode 100644
index 000000000..c6ef5e509
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/CropFilesServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.CropFilesMapper;
+import com.jlt.csa.domain.CropFiles;
+import com.jlt.csa.service.ICropFilesService;
+
+/**
+ * 作物档案Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-25
+ */
+@Service
+public class CropFilesServiceImpl implements ICropFilesService 
+{
+    @Autowired
+    private CropFilesMapper cropFilesMapper;
+
+    /**
+     * 查询作物档案
+     * 
+     * @param id 作物档案主键
+     * @return 作物档案
+     */
+    @Override
+    public CropFiles selectCropFilesById(Long id)
+    {
+        return cropFilesMapper.selectCropFilesById(id);
+    }
+
+    /**
+     * 查询作物档案列表
+     * 
+     * @param cropFiles 作物档案
+     * @return 作物档案
+     */
+    @Override
+    public List<CropFiles> selectCropFilesList(CropFiles cropFiles)
+    {
+        return cropFilesMapper.selectCropFilesList(cropFiles);
+    }
+
+    /**
+     * 新增作物档案
+     * 
+     * @param cropFiles 作物档案
+     * @return 结果
+     */
+    @Override
+    public int insertCropFiles(CropFiles cropFiles)
+    {
+        cropFiles.setCreateTime(DateUtils.getNowDate());
+        return cropFilesMapper.insertCropFiles(cropFiles);
+    }
+
+    /**
+     * 修改作物档案
+     * 
+     * @param cropFiles 作物档案
+     * @return 结果
+     */
+    @Override
+    public int updateCropFiles(CropFiles cropFiles)
+    {
+        cropFiles.setUpdateTime(DateUtils.getNowDate());
+        return cropFilesMapper.updateCropFiles(cropFiles);
+    }
+
+    /**
+     * 批量删除作物档案
+     * 
+     * @param ids 需要删除的作物档案主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCropFilesByIds(Long[] ids)
+    {
+        return cropFilesMapper.deleteCropFilesByIds(ids);
+    }
+
+    /**
+     * 删除作物档案信息
+     * 
+     * @param id 作物档案主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCropFilesById(Long id)
+    {
+        return cropFilesMapper.deleteCropFilesById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/CropPhaseServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/CropPhaseServiceImpl.java
new file mode 100644
index 000000000..a67dce1c7
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/CropPhaseServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.CropPhaseMapper;
+import com.jlt.csa.domain.CropPhase;
+import com.jlt.csa.service.ICropPhaseService;
+
+/**
+ * 作物生长阶段Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+@Service
+public class CropPhaseServiceImpl implements ICropPhaseService 
+{
+    @Autowired
+    private CropPhaseMapper cropPhaseMapper;
+
+    /**
+     * 查询作物生长阶段
+     * 
+     * @param id 作物生长阶段主键
+     * @return 作物生长阶段
+     */
+    @Override
+    public CropPhase selectCropPhaseById(Long id)
+    {
+        return cropPhaseMapper.selectCropPhaseById(id);
+    }
+
+    /**
+     * 查询作物生长阶段列表
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 作物生长阶段
+     */
+    @Override
+    public List<CropPhase> selectCropPhaseList(CropPhase cropPhase)
+    {
+        return cropPhaseMapper.selectCropPhaseList(cropPhase);
+    }
+
+    /**
+     * 新增作物生长阶段
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 结果
+     */
+    @Override
+    public int insertCropPhase(CropPhase cropPhase)
+    {
+        cropPhase.setCreateTime(DateUtils.getNowDate());
+        return cropPhaseMapper.insertCropPhase(cropPhase);
+    }
+
+    /**
+     * 修改作物生长阶段
+     * 
+     * @param cropPhase 作物生长阶段
+     * @return 结果
+     */
+    @Override
+    public int updateCropPhase(CropPhase cropPhase)
+    {
+        cropPhase.setUpdateTime(DateUtils.getNowDate());
+        return cropPhaseMapper.updateCropPhase(cropPhase);
+    }
+
+    /**
+     * 批量删除作物生长阶段
+     * 
+     * @param ids 需要删除的作物生长阶段主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCropPhaseByIds(Long[] ids)
+    {
+        return cropPhaseMapper.deleteCropPhaseByIds(ids);
+    }
+
+    /**
+     * 删除作物生长阶段信息
+     * 
+     * @param id 作物生长阶段主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCropPhaseById(Long id)
+    {
+        return cropPhaseMapper.deleteCropPhaseById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/CsaFarmerServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/CsaFarmerServiceImpl.java
new file mode 100644
index 000000000..279ecc1a4
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/CsaFarmerServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.CsaFarmerMapper;
+import com.jlt.csa.domain.CsaFarmer;
+import com.jlt.csa.service.ICsaFarmerService;
+
+/**
+ * 私家农场会员Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+@Service
+public class CsaFarmerServiceImpl implements ICsaFarmerService 
+{
+    @Autowired
+    private CsaFarmerMapper csaFarmerMapper;
+
+    /**
+     * 查询私家农场会员
+     * 
+     * @param id 私家农场会员主键
+     * @return 私家农场会员
+     */
+    @Override
+    public CsaFarmer selectCsaFarmerById(Long id)
+    {
+        return csaFarmerMapper.selectCsaFarmerById(id);
+    }
+
+    /**
+     * 查询私家农场会员列表
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 私家农场会员
+     */
+    @Override
+    public List<CsaFarmer> selectCsaFarmerList(CsaFarmer csaFarmer)
+    {
+        return csaFarmerMapper.selectCsaFarmerList(csaFarmer);
+    }
+
+    /**
+     * 新增私家农场会员
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 结果
+     */
+    @Override
+    public int insertCsaFarmer(CsaFarmer csaFarmer)
+    {
+        csaFarmer.setCreateTime(DateUtils.getNowDate());
+        return csaFarmerMapper.insertCsaFarmer(csaFarmer);
+    }
+
+    /**
+     * 修改私家农场会员
+     * 
+     * @param csaFarmer 私家农场会员
+     * @return 结果
+     */
+    @Override
+    public int updateCsaFarmer(CsaFarmer csaFarmer)
+    {
+        csaFarmer.setUpdateTime(DateUtils.getNowDate());
+        return csaFarmerMapper.updateCsaFarmer(csaFarmer);
+    }
+
+    /**
+     * 批量删除私家农场会员
+     * 
+     * @param ids 需要删除的私家农场会员主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCsaFarmerByIds(Long[] ids)
+    {
+        return csaFarmerMapper.deleteCsaFarmerByIds(ids);
+    }
+
+    /**
+     * 删除私家农场会员信息
+     * 
+     * @param id 私家农场会员主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCsaFarmerById(Long id)
+    {
+        return csaFarmerMapper.deleteCsaFarmerById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/CsaMemberCardServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/CsaMemberCardServiceImpl.java
new file mode 100644
index 000000000..58025f782
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/CsaMemberCardServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.CsaMemberCardMapper;
+import com.jlt.csa.domain.CsaMemberCard;
+import com.jlt.csa.service.ICsaMemberCardService;
+
+/**
+ * 会员卡Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-26
+ */
+@Service
+public class CsaMemberCardServiceImpl implements ICsaMemberCardService 
+{
+    @Autowired
+    private CsaMemberCardMapper csaMemberCardMapper;
+
+    /**
+     * 查询会员卡
+     * 
+     * @param id 会员卡主键
+     * @return 会员卡
+     */
+    @Override
+    public CsaMemberCard selectCsaMemberCardById(Long id)
+    {
+        return csaMemberCardMapper.selectCsaMemberCardById(id);
+    }
+
+    /**
+     * 查询会员卡列表
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 会员卡
+     */
+    @Override
+    public List<CsaMemberCard> selectCsaMemberCardList(CsaMemberCard csaMemberCard)
+    {
+        return csaMemberCardMapper.selectCsaMemberCardList(csaMemberCard);
+    }
+
+    /**
+     * 新增会员卡
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 结果
+     */
+    @Override
+    public int insertCsaMemberCard(CsaMemberCard csaMemberCard)
+    {
+        csaMemberCard.setCreateTime(DateUtils.getNowDate());
+        return csaMemberCardMapper.insertCsaMemberCard(csaMemberCard);
+    }
+
+    /**
+     * 修改会员卡
+     * 
+     * @param csaMemberCard 会员卡
+     * @return 结果
+     */
+    @Override
+    public int updateCsaMemberCard(CsaMemberCard csaMemberCard)
+    {
+        csaMemberCard.setUpdateTime(DateUtils.getNowDate());
+        return csaMemberCardMapper.updateCsaMemberCard(csaMemberCard);
+    }
+
+    /**
+     * 批量删除会员卡
+     * 
+     * @param ids 需要删除的会员卡主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCsaMemberCardByIds(Long[] ids)
+    {
+        return csaMemberCardMapper.deleteCsaMemberCardByIds(ids);
+    }
+
+    /**
+     * 删除会员卡信息
+     * 
+     * @param id 会员卡主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCsaMemberCardById(Long id)
+    {
+        return csaMemberCardMapper.deleteCsaMemberCardById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogAttachServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogAttachServiceImpl.java
new file mode 100644
index 000000000..4674d118c
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogAttachServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.GardenLogAttachMapper;
+import com.jlt.csa.domain.GardenLogAttach;
+import com.jlt.csa.service.IGardenLogAttachService;
+
+/**
+ * 菜地日志附件Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class GardenLogAttachServiceImpl implements IGardenLogAttachService 
+{
+    @Autowired
+    private GardenLogAttachMapper gardenLogAttachMapper;
+
+    /**
+     * 查询菜地日志附件
+     * 
+     * @param id 菜地日志附件主键
+     * @return 菜地日志附件
+     */
+    @Override
+    public GardenLogAttach selectGardenLogAttachById(Long id)
+    {
+        return gardenLogAttachMapper.selectGardenLogAttachById(id);
+    }
+
+    /**
+     * 查询菜地日志附件列表
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 菜地日志附件
+     */
+    @Override
+    public List<GardenLogAttach> selectGardenLogAttachList(GardenLogAttach gardenLogAttach)
+    {
+        return gardenLogAttachMapper.selectGardenLogAttachList(gardenLogAttach);
+    }
+
+    /**
+     * 新增菜地日志附件
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 结果
+     */
+    @Override
+    public int insertGardenLogAttach(GardenLogAttach gardenLogAttach)
+    {
+        gardenLogAttach.setCreateTime(DateUtils.getNowDate());
+        return gardenLogAttachMapper.insertGardenLogAttach(gardenLogAttach);
+    }
+
+    /**
+     * 修改菜地日志附件
+     * 
+     * @param gardenLogAttach 菜地日志附件
+     * @return 结果
+     */
+    @Override
+    public int updateGardenLogAttach(GardenLogAttach gardenLogAttach)
+    {
+        gardenLogAttach.setUpdateTime(DateUtils.getNowDate());
+        return gardenLogAttachMapper.updateGardenLogAttach(gardenLogAttach);
+    }
+
+    /**
+     * 批量删除菜地日志附件
+     * 
+     * @param ids 需要删除的菜地日志附件主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGardenLogAttachByIds(Long[] ids)
+    {
+        return gardenLogAttachMapper.deleteGardenLogAttachByIds(ids);
+    }
+
+    /**
+     * 删除菜地日志附件信息
+     * 
+     * @param id 菜地日志附件主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGardenLogAttachById(Long id)
+    {
+        return gardenLogAttachMapper.deleteGardenLogAttachById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogServiceImpl.java
new file mode 100644
index 000000000..9f61e3163
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/GardenLogServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.GardenLogMapper;
+import com.jlt.csa.domain.GardenLog;
+import com.jlt.csa.service.IGardenLogService;
+
+/**
+ * 菜地日志Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class GardenLogServiceImpl implements IGardenLogService 
+{
+    @Autowired
+    private GardenLogMapper gardenLogMapper;
+
+    /**
+     * 查询菜地日志
+     * 
+     * @param id 菜地日志主键
+     * @return 菜地日志
+     */
+    @Override
+    public GardenLog selectGardenLogById(Long id)
+    {
+        return gardenLogMapper.selectGardenLogById(id);
+    }
+
+    /**
+     * 查询菜地日志列表
+     * 
+     * @param gardenLog 菜地日志
+     * @return 菜地日志
+     */
+    @Override
+    public List<GardenLog> selectGardenLogList(GardenLog gardenLog)
+    {
+        return gardenLogMapper.selectGardenLogList(gardenLog);
+    }
+
+    /**
+     * 新增菜地日志
+     * 
+     * @param gardenLog 菜地日志
+     * @return 结果
+     */
+    @Override
+    public int insertGardenLog(GardenLog gardenLog)
+    {
+        gardenLog.setCreateTime(DateUtils.getNowDate());
+        return gardenLogMapper.insertGardenLog(gardenLog);
+    }
+
+    /**
+     * 修改菜地日志
+     * 
+     * @param gardenLog 菜地日志
+     * @return 结果
+     */
+    @Override
+    public int updateGardenLog(GardenLog gardenLog)
+    {
+        gardenLog.setUpdateTime(DateUtils.getNowDate());
+        return gardenLogMapper.updateGardenLog(gardenLog);
+    }
+
+    /**
+     * 批量删除菜地日志
+     * 
+     * @param ids 需要删除的菜地日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGardenLogByIds(Long[] ids)
+    {
+        return gardenLogMapper.deleteGardenLogByIds(ids);
+    }
+
+    /**
+     * 删除菜地日志信息
+     * 
+     * @param id 菜地日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGardenLogById(Long id)
+    {
+        return gardenLogMapper.deleteGardenLogById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/GardenStrainServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/GardenStrainServiceImpl.java
new file mode 100644
index 000000000..421880493
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/GardenStrainServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.GardenStrainMapper;
+import com.jlt.csa.domain.GardenStrain;
+import com.jlt.csa.service.IGardenStrainService;
+
+/**
+ * 菜地品种Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class GardenStrainServiceImpl implements IGardenStrainService 
+{
+    @Autowired
+    private GardenStrainMapper gardenStrainMapper;
+
+    /**
+     * 查询菜地品种
+     * 
+     * @param id 菜地品种主键
+     * @return 菜地品种
+     */
+    @Override
+    public GardenStrain selectGardenStrainById(Long id)
+    {
+        return gardenStrainMapper.selectGardenStrainById(id);
+    }
+
+    /**
+     * 查询菜地品种列表
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 菜地品种
+     */
+    @Override
+    public List<GardenStrain> selectGardenStrainList(GardenStrain gardenStrain)
+    {
+        return gardenStrainMapper.selectGardenStrainList(gardenStrain);
+    }
+
+    /**
+     * 新增菜地品种
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 结果
+     */
+    @Override
+    public int insertGardenStrain(GardenStrain gardenStrain)
+    {
+        gardenStrain.setCreateTime(DateUtils.getNowDate());
+        return gardenStrainMapper.insertGardenStrain(gardenStrain);
+    }
+
+    /**
+     * 修改菜地品种
+     * 
+     * @param gardenStrain 菜地品种
+     * @return 结果
+     */
+    @Override
+    public int updateGardenStrain(GardenStrain gardenStrain)
+    {
+        gardenStrain.setUpdateTime(DateUtils.getNowDate());
+        return gardenStrainMapper.updateGardenStrain(gardenStrain);
+    }
+
+    /**
+     * 批量删除菜地品种
+     * 
+     * @param ids 需要删除的菜地品种主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGardenStrainByIds(Long[] ids)
+    {
+        return gardenStrainMapper.deleteGardenStrainByIds(ids);
+    }
+
+    /**
+     * 删除菜地品种信息
+     * 
+     * @param id 菜地品种主键
+     * @return 结果
+     */
+    @Override
+    public int deleteGardenStrainById(Long id)
+    {
+        return gardenStrainMapper.deleteGardenStrainById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/PickDetailServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/PickDetailServiceImpl.java
new file mode 100644
index 000000000..37d4ab267
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/PickDetailServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.PickDetailMapper;
+import com.jlt.csa.domain.PickDetail;
+import com.jlt.csa.service.IPickDetailService;
+
+/**
+ * 采摘任务明细Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class PickDetailServiceImpl implements IPickDetailService 
+{
+    @Autowired
+    private PickDetailMapper pickDetailMapper;
+
+    /**
+     * 查询采摘任务明细
+     * 
+     * @param id 采摘任务明细主键
+     * @return 采摘任务明细
+     */
+    @Override
+    public PickDetail selectPickDetailById(Long id)
+    {
+        return pickDetailMapper.selectPickDetailById(id);
+    }
+
+    /**
+     * 查询采摘任务明细列表
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 采摘任务明细
+     */
+    @Override
+    public List<PickDetail> selectPickDetailList(PickDetail pickDetail)
+    {
+        return pickDetailMapper.selectPickDetailList(pickDetail);
+    }
+
+    /**
+     * 新增采摘任务明细
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 结果
+     */
+    @Override
+    public int insertPickDetail(PickDetail pickDetail)
+    {
+        pickDetail.setCreateTime(DateUtils.getNowDate());
+        return pickDetailMapper.insertPickDetail(pickDetail);
+    }
+
+    /**
+     * 修改采摘任务明细
+     * 
+     * @param pickDetail 采摘任务明细
+     * @return 结果
+     */
+    @Override
+    public int updatePickDetail(PickDetail pickDetail)
+    {
+        pickDetail.setUpdateTime(DateUtils.getNowDate());
+        return pickDetailMapper.updatePickDetail(pickDetail);
+    }
+
+    /**
+     * 批量删除采摘任务明细
+     * 
+     * @param ids 需要删除的采摘任务明细主键
+     * @return 结果
+     */
+    @Override
+    public int deletePickDetailByIds(Long[] ids)
+    {
+        return pickDetailMapper.deletePickDetailByIds(ids);
+    }
+
+    /**
+     * 删除采摘任务明细信息
+     * 
+     * @param id 采摘任务明细主键
+     * @return 结果
+     */
+    @Override
+    public int deletePickDetailById(Long id)
+    {
+        return pickDetailMapper.deletePickDetailById(id);
+    }
+}
diff --git a/private-farm/src/main/java/com/jlt/csa/service/impl/TendTaskServiceImpl.java b/private-farm/src/main/java/com/jlt/csa/service/impl/TendTaskServiceImpl.java
new file mode 100644
index 000000000..19880308a
--- /dev/null
+++ b/private-farm/src/main/java/com/jlt/csa/service/impl/TendTaskServiceImpl.java
@@ -0,0 +1,96 @@
+package com.jlt.csa.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.jlt.csa.mapper.TendTaskMapper;
+import com.jlt.csa.domain.TendTask;
+import com.jlt.csa.service.ITendTaskService;
+
+/**
+ * 打理任务Service业务层处理
+ * 
+ * @author JiaLeitao
+ * @date 2022-03-27
+ */
+@Service
+public class TendTaskServiceImpl implements ITendTaskService 
+{
+    @Autowired
+    private TendTaskMapper tendTaskMapper;
+
+    /**
+     * 查询打理任务
+     * 
+     * @param id 打理任务主键
+     * @return 打理任务
+     */
+    @Override
+    public TendTask selectTendTaskById(Long id)
+    {
+        return tendTaskMapper.selectTendTaskById(id);
+    }
+
+    /**
+     * 查询打理任务列表
+     * 
+     * @param tendTask 打理任务
+     * @return 打理任务
+     */
+    @Override
+    public List<TendTask> selectTendTaskList(TendTask tendTask)
+    {
+        return tendTaskMapper.selectTendTaskList(tendTask);
+    }
+
+    /**
+     * 新增打理任务
+     * 
+     * @param tendTask 打理任务
+     * @return 结果
+     */
+    @Override
+    public int insertTendTask(TendTask tendTask)
+    {
+        tendTask.setCreateTime(DateUtils.getNowDate());
+        return tendTaskMapper.insertTendTask(tendTask);
+    }
+
+    /**
+     * 修改打理任务
+     * 
+     * @param tendTask 打理任务
+     * @return 结果
+     */
+    @Override
+    public int updateTendTask(TendTask tendTask)
+    {
+        tendTask.setUpdateTime(DateUtils.getNowDate());
+        return tendTaskMapper.updateTendTask(tendTask);
+    }
+
+    /**
+     * 批量删除打理任务
+     * 
+     * @param ids 需要删除的打理任务主键
+     * @return 结果
+     */
+    @Override
+    public int deleteTendTaskByIds(Long[] ids)
+    {
+        return tendTaskMapper.deleteTendTaskByIds(ids);
+    }
+
+    /**
+     * 删除打理任务信息
+     * 
+     * @param id 打理任务主键
+     * @return 结果
+     */
+    @Override
+    public int deleteTendTaskById(Long id)
+    {
+        return tendTaskMapper.deleteTendTaskById(id);
+    }
+}
diff --git a/private-farm/src/main/resources/mapper/csa/ArchedRecordMapper.xml b/private-farm/src/main/resources/mapper/csa/ArchedRecordMapper.xml
new file mode 100644
index 000000000..7bae4de75
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/ArchedRecordMapper.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.ArchedRecordMapper">
+    
+    <resultMap type="ArchedRecord" id="ArchedRecordResult">
+        <result property="id"    column="id"    />
+        <result property="memberId"    column="member_id"    />
+        <result property="gardenId"    column="garden_id"    />
+        <result property="yearNo"    column="year_no"    />
+        <result property="consumYear"    column="consum_year"    />
+        <result property="remainingYears"    column="remaining_years"    />
+        <result property="doerId"    column="doer_id"    />
+        <result property="doTime"    column="do_time"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectArchedRecordVo">
+        select id, member_id, garden_id, year_no, consum_year, remaining_years, doer_id, do_time, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_arched_record
+    </sql>
+
+    <select id="selectArchedRecordList" parameterType="ArchedRecord" resultMap="ArchedRecordResult">
+        <include refid="selectArchedRecordVo"/>
+        <where>  
+            <if test="memberId != null "> and member_id = #{memberId}</if>
+            <if test="gardenId != null "> and garden_id = #{gardenId}</if>
+            <if test="yearNo != null "> and year_no = #{yearNo}</if>
+            <if test="doerId != null "> and doer_id = #{doerId}</if>
+            <if test="doTime != null "> and do_time = #{doTime}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectArchedRecordById" parameterType="Long" resultMap="ArchedRecordResult">
+        <include refid="selectArchedRecordVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertArchedRecord" parameterType="ArchedRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_arched_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">member_id,</if>
+            <if test="gardenId != null">garden_id,</if>
+            <if test="yearNo != null">year_no,</if>
+            <if test="consumYear != null">consum_year,</if>
+            <if test="remainingYears != null">remaining_years,</if>
+            <if test="doerId != null">doer_id,</if>
+            <if test="doTime != null">do_time,</if>
+            <if test="status != null and status != ''">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">#{memberId},</if>
+            <if test="gardenId != null">#{gardenId},</if>
+            <if test="yearNo != null">#{yearNo},</if>
+            <if test="consumYear != null">#{consumYear},</if>
+            <if test="remainingYears != null">#{remainingYears},</if>
+            <if test="doerId != null">#{doerId},</if>
+            <if test="doTime != null">#{doTime},</if>
+            <if test="status != null and status != ''">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateArchedRecord" parameterType="ArchedRecord">
+        update csa_arched_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="memberId != null">member_id = #{memberId},</if>
+            <if test="gardenId != null">garden_id = #{gardenId},</if>
+            <if test="yearNo != null">year_no = #{yearNo},</if>
+            <if test="consumYear != null">consum_year = #{consumYear},</if>
+            <if test="remainingYears != null">remaining_years = #{remainingYears},</if>
+            <if test="doerId != null">doer_id = #{doerId},</if>
+            <if test="doTime != null">do_time = #{doTime},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteArchedRecordById" parameterType="Long">
+        delete from csa_arched_record where id = #{id}
+    </delete>
+
+    <delete id="deleteArchedRecordByIds" parameterType="String">
+        delete from csa_arched_record where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/CoinRecordMapper.xml b/private-farm/src/main/resources/mapper/csa/CoinRecordMapper.xml
new file mode 100644
index 000000000..982adc2a4
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/CoinRecordMapper.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.CoinRecordMapper">
+    
+    <resultMap type="CoinRecord" id="CoinRecordResult">
+        <result property="id"    column="id"    />
+        <result property="memberId"    column="member_id"    />
+        <result property="opId"    column="op_id"    />
+        <result property="opType"    column="op_type"    />
+        <result property="coins"    column="coins"    />
+        <result property="coinBalance"    column="coin_balance"    />
+        <result property="description"    column="description"    />
+        <result property="opTime"    column="op_time"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectCoinRecordVo">
+        select id, member_id, op_id, op_type, coins, coin_balance, description, op_time, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_coin_record
+    </sql>
+
+    <select id="selectCoinRecordList" parameterType="CoinRecord" resultMap="CoinRecordResult">
+        <include refid="selectCoinRecordVo"/>
+        <where>  
+            <if test="memberId != null "> and member_id = #{memberId}</if>
+            <if test="opType != null  and opType != ''"> and op_type = #{opType}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectCoinRecordById" parameterType="Long" resultMap="CoinRecordResult">
+        <include refid="selectCoinRecordVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCoinRecord" parameterType="CoinRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_coin_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">member_id,</if>
+            <if test="opId != null">op_id,</if>
+            <if test="opType != null and opType != ''">op_type,</if>
+            <if test="coins != null">coins,</if>
+            <if test="coinBalance != null">coin_balance,</if>
+            <if test="description != null">description,</if>
+            <if test="opTime != null">op_time,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">#{memberId},</if>
+            <if test="opId != null">#{opId},</if>
+            <if test="opType != null and opType != ''">#{opType},</if>
+            <if test="coins != null">#{coins},</if>
+            <if test="coinBalance != null">#{coinBalance},</if>
+            <if test="description != null">#{description},</if>
+            <if test="opTime != null">#{opTime},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCoinRecord" parameterType="CoinRecord">
+        update csa_coin_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="memberId != null">member_id = #{memberId},</if>
+            <if test="opId != null">op_id = #{opId},</if>
+            <if test="opType != null and opType != ''">op_type = #{opType},</if>
+            <if test="coins != null">coins = #{coins},</if>
+            <if test="coinBalance != null">coin_balance = #{coinBalance},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="opTime != null">op_time = #{opTime},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCoinRecordById" parameterType="Long">
+        delete from csa_coin_record where id = #{id}
+    </delete>
+
+    <delete id="deleteCoinRecordByIds" parameterType="String">
+        delete from csa_coin_record where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/CommunicateRecordMapper.xml b/private-farm/src/main/resources/mapper/csa/CommunicateRecordMapper.xml
new file mode 100644
index 000000000..bbd692cb3
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/CommunicateRecordMapper.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.CommunicateRecordMapper">
+    
+    <resultMap type="CommunicateRecord" id="CommunicateRecordResult">
+        <result property="id"    column="id"    />
+        <result property="memberId"    column="member_id"    />
+        <result property="gardenId"    column="garden_id"    />
+        <result property="recorder"    column="recorder"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="commType"    column="comm_type"    />
+        <result property="content"    column="content"    />
+        <result property="result"    column="result"    />
+        <result property="isCompleted"    column="is_completed"    />
+        <result property="commTime"    column="comm_time"    />
+        <result property="doTime"    column="do_time"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectCommunicateRecordVo">
+        select id, member_id, garden_id, recorder, task_id, comm_type, content, result, is_completed, comm_time, do_time, del_flag, create_by, create_time, update_by, update_time, remark from csa_communicate_record
+    </sql>
+
+    <select id="selectCommunicateRecordList" parameterType="CommunicateRecord" resultMap="CommunicateRecordResult">
+        <include refid="selectCommunicateRecordVo"/>
+        <where>  
+            <if test="memberId != null "> and member_id = #{memberId}</if>
+            <if test="gardenId != null "> and garden_id = #{gardenId}</if>
+            <if test="recorder != null "> and recorder = #{recorder}</if>
+            <if test="taskId != null "> and task_id = #{taskId}</if>
+            <if test="commType != null  and commType != ''"> and comm_type = #{commType}</if>
+            <if test="isCompleted != null  and isCompleted != ''"> and is_completed = #{isCompleted}</if>
+            <if test="commTime != null "> and comm_time = #{commTime}</if>
+            <if test="doTime != null "> and do_time = #{doTime}</if>
+        </where>
+    </select>
+    
+    <select id="selectCommunicateRecordById" parameterType="Long" resultMap="CommunicateRecordResult">
+        <include refid="selectCommunicateRecordVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCommunicateRecord" parameterType="CommunicateRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_communicate_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">member_id,</if>
+            <if test="gardenId != null">garden_id,</if>
+            <if test="recorder != null">recorder,</if>
+            <if test="taskId != null">task_id,</if>
+            <if test="commType != null and commType != ''">comm_type,</if>
+            <if test="content != null and content != ''">content,</if>
+            <if test="result != null">result,</if>
+            <if test="isCompleted != null">is_completed,</if>
+            <if test="commTime != null">comm_time,</if>
+            <if test="doTime != null">do_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">#{memberId},</if>
+            <if test="gardenId != null">#{gardenId},</if>
+            <if test="recorder != null">#{recorder},</if>
+            <if test="taskId != null">#{taskId},</if>
+            <if test="commType != null and commType != ''">#{commType},</if>
+            <if test="content != null and content != ''">#{content},</if>
+            <if test="result != null">#{result},</if>
+            <if test="isCompleted != null">#{isCompleted},</if>
+            <if test="commTime != null">#{commTime},</if>
+            <if test="doTime != null">#{doTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCommunicateRecord" parameterType="CommunicateRecord">
+        update csa_communicate_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="memberId != null">member_id = #{memberId},</if>
+            <if test="gardenId != null">garden_id = #{gardenId},</if>
+            <if test="recorder != null">recorder = #{recorder},</if>
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="commType != null and commType != ''">comm_type = #{commType},</if>
+            <if test="content != null and content != ''">content = #{content},</if>
+            <if test="result != null">result = #{result},</if>
+            <if test="isCompleted != null">is_completed = #{isCompleted},</if>
+            <if test="commTime != null">comm_time = #{commTime},</if>
+            <if test="doTime != null">do_time = #{doTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCommunicateRecordById" parameterType="Long">
+        delete from csa_communicate_record where id = #{id}
+    </delete>
+
+    <delete id="deleteCommunicateRecordByIds" parameterType="String">
+        delete from csa_communicate_record where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/CropFilesMapper.xml b/private-farm/src/main/resources/mapper/csa/CropFilesMapper.xml
new file mode 100644
index 000000000..3c2bdfb38
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/CropFilesMapper.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.CropFilesMapper">
+    
+    <resultMap type="CropFiles" id="CropFilesResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="plantGuide"    column="plant_guide"    />
+        <result property="picture"    column="picture"    />
+        <result property="description"    column="description"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectCropFilesVo">
+        select id, name, plant_guide, picture, description, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_crop_files
+    </sql>
+
+    <select id="selectCropFilesList" parameterType="CropFiles" resultMap="CropFilesResult">
+        <include refid="selectCropFilesVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectCropFilesById" parameterType="Long" resultMap="CropFilesResult">
+        <include refid="selectCropFilesVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCropFiles" parameterType="CropFiles" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_crop_files
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">name,</if>
+            <if test="plantGuide != null">plant_guide,</if>
+            <if test="picture != null">picture,</if>
+            <if test="description != null">description,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="plantGuide != null">#{plantGuide},</if>
+            <if test="picture != null">#{picture},</if>
+            <if test="description != null">#{description},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCropFiles" parameterType="CropFiles">
+        update csa_crop_files
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="plantGuide != null">plant_guide = #{plantGuide},</if>
+            <if test="picture != null">picture = #{picture},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCropFilesById" parameterType="Long">
+        delete from csa_crop_files where id = #{id}
+    </delete>
+
+    <delete id="deleteCropFilesByIds" parameterType="String">
+        delete from csa_crop_files where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/CropPhaseMapper.xml b/private-farm/src/main/resources/mapper/csa/CropPhaseMapper.xml
new file mode 100644
index 000000000..e4090fcd7
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/CropPhaseMapper.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.CropPhaseMapper">
+    
+    <resultMap type="CropPhase" id="CropPhaseResult">
+        <result property="id"    column="id"    />
+        <result property="cropId"    column="crop_id"    />
+        <result property="name"    column="name"    />
+        <result property="production"    column="production"    />
+        <result property="picture"    column="picture"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectCropPhaseVo">
+        select id, crop_id, name, production, picture, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_crop_phase
+    </sql>
+
+    <select id="selectCropPhaseList" parameterType="CropPhase" resultMap="CropPhaseResult">
+        <include refid="selectCropPhaseVo"/>
+        <where>  
+            <if test="cropId != null "> and crop_id = #{cropId}</if>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectCropPhaseById" parameterType="Long" resultMap="CropPhaseResult">
+        <include refid="selectCropPhaseVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCropPhase" parameterType="CropPhase" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_crop_phase
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="cropId != null">crop_id,</if>
+            <if test="name != null and name != ''">name,</if>
+            <if test="production != null">production,</if>
+            <if test="picture != null">picture,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="cropId != null">#{cropId},</if>
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="production != null">#{production},</if>
+            <if test="picture != null">#{picture},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCropPhase" parameterType="CropPhase">
+        update csa_crop_phase
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="cropId != null">crop_id = #{cropId},</if>
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="production != null">production = #{production},</if>
+            <if test="picture != null">picture = #{picture},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCropPhaseById" parameterType="Long">
+        delete from csa_crop_phase where id = #{id}
+    </delete>
+
+    <delete id="deleteCropPhaseByIds" parameterType="String">
+        delete from csa_crop_phase where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/CsaFarmerMapper.xml b/private-farm/src/main/resources/mapper/csa/CsaFarmerMapper.xml
new file mode 100644
index 000000000..0c45b4aaf
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/CsaFarmerMapper.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.CsaFarmerMapper">
+    
+    <resultMap type="CsaFarmer" id="CsaFarmerResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="gender"    column="gender"    />
+        <result property="coins"    column="coins"    />
+        <result property="balance"    column="balance"    />
+        <result property="weight"    column="weight"    />
+        <result property="archedYears"    column="arched_years"    />
+        <result property="joinDate"    column="join_date"    />
+        <result property="dueDate"    column="due_date"    />
+        <result property="isExpire"    column="is_expire"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectCsaFarmerVo">
+        select id, name, gender, coins, balance, weight, arched_years, join_date, due_date, is_expire, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_farmer
+    </sql>
+
+    <select id="selectCsaFarmerList" parameterType="CsaFarmer" resultMap="CsaFarmerResult">
+        <include refid="selectCsaFarmerVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="dueDate != null "> and due_date = #{dueDate}</if>
+            <if test="isExpire != null  and isExpire != ''"> and is_expire = #{isExpire}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectCsaFarmerById" parameterType="Long" resultMap="CsaFarmerResult">
+        <include refid="selectCsaFarmerVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCsaFarmer" parameterType="CsaFarmer" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_farmer
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">name,</if>
+            <if test="gender != null">gender,</if>
+            <if test="coins != null">coins,</if>
+            <if test="balance != null">balance,</if>
+            <if test="weight != null">weight,</if>
+            <if test="archedYears != null">arched_years,</if>
+            <if test="joinDate != null">join_date,</if>
+            <if test="dueDate != null">due_date,</if>
+            <if test="isExpire != null">is_expire,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="gender != null">#{gender},</if>
+            <if test="coins != null">#{coins},</if>
+            <if test="balance != null">#{balance},</if>
+            <if test="weight != null">#{weight},</if>
+            <if test="archedYears != null">#{archedYears},</if>
+            <if test="joinDate != null">#{joinDate},</if>
+            <if test="dueDate != null">#{dueDate},</if>
+            <if test="isExpire != null">#{isExpire},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCsaFarmer" parameterType="CsaFarmer">
+        update csa_farmer
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="gender != null">gender = #{gender},</if>
+            <if test="coins != null">coins = #{coins},</if>
+            <if test="balance != null">balance = #{balance},</if>
+            <if test="weight != null">weight = #{weight},</if>
+            <if test="archedYears != null">arched_years = #{archedYears},</if>
+            <if test="joinDate != null">join_date = #{joinDate},</if>
+            <if test="dueDate != null">due_date = #{dueDate},</if>
+            <if test="isExpire != null">is_expire = #{isExpire},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCsaFarmerById" parameterType="Long">
+        delete from csa_farmer where id = #{id}
+    </delete>
+
+    <delete id="deleteCsaFarmerByIds" parameterType="String">
+        delete from csa_farmer where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/CsaMemberCardMapper.xml b/private-farm/src/main/resources/mapper/csa/CsaMemberCardMapper.xml
new file mode 100644
index 000000000..9a8e30053
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/CsaMemberCardMapper.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.CsaMemberCardMapper">
+    
+    <resultMap type="CsaMemberCard" id="CsaMemberCardResult">
+        <result property="id"    column="id"    />
+        <result property="cardno"    column="cardno"    />
+        <result property="passwd"    column="passwd"    />
+        <result property="activationValidity"    column="activation_validity"    />
+        <result property="usabilityStatus"    column="usability_status"    />
+        <result property="activeStatus"    column="active_status"    />
+        <result property="m2"    column="m2"    />
+        <result property="landYears"    column="land_years"    />
+        <result property="archedYears"    column="arched_years"    />
+        <result property="coins"    column="coins"    />
+        <result property="balance"    column="balance"    />
+        <result property="weight"    column="weight"    />
+        <result property="setMeal"    column="set_meal"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectCsaMemberCardVo">
+        select id, cardno, passwd, activation_validity, usability_status, active_status, m2, land_years, arched_years, coins, balance, weight, set_meal, del_flag, create_by, create_time, update_by, update_time, remark from csa_member_card
+    </sql>
+
+    <select id="selectCsaMemberCardList" parameterType="CsaMemberCard" resultMap="CsaMemberCardResult">
+        <include refid="selectCsaMemberCardVo"/>
+        <where>  
+            <if test="cardno != null  and cardno != ''"> and cardno = #{cardno}</if>
+            <if test="usabilityStatus != null  and usabilityStatus != ''"> and usability_status = #{usabilityStatus}</if>
+            <if test="activeStatus != null  and activeStatus != ''"> and active_status = #{activeStatus}</if>
+            <if test="landYears != null "> and land_years = #{landYears}</if>
+            <if test="archedYears != null "> and arched_years = #{archedYears}</if>
+            <if test="setMeal != null  and setMeal != ''"> and set_meal = #{setMeal}</if>
+        </where>
+    </select>
+    
+    <select id="selectCsaMemberCardById" parameterType="Long" resultMap="CsaMemberCardResult">
+        <include refid="selectCsaMemberCardVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCsaMemberCard" parameterType="CsaMemberCard" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_member_card
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="cardno != null and cardno != ''">cardno,</if>
+            <if test="passwd != null and passwd != ''">passwd,</if>
+            <if test="activationValidity != null">activation_validity,</if>
+            <if test="usabilityStatus != null">usability_status,</if>
+            <if test="activeStatus != null">active_status,</if>
+            <if test="m2 != null">m2,</if>
+            <if test="landYears != null">land_years,</if>
+            <if test="archedYears != null">arched_years,</if>
+            <if test="coins != null">coins,</if>
+            <if test="balance != null">balance,</if>
+            <if test="weight != null">weight,</if>
+            <if test="setMeal != null">set_meal,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="cardno != null and cardno != ''">#{cardno},</if>
+            <if test="passwd != null and passwd != ''">#{passwd},</if>
+            <if test="activationValidity != null">#{activationValidity},</if>
+            <if test="usabilityStatus != null">#{usabilityStatus},</if>
+            <if test="activeStatus != null">#{activeStatus},</if>
+            <if test="m2 != null">#{m2},</if>
+            <if test="landYears != null">#{landYears},</if>
+            <if test="archedYears != null">#{archedYears},</if>
+            <if test="coins != null">#{coins},</if>
+            <if test="balance != null">#{balance},</if>
+            <if test="weight != null">#{weight},</if>
+            <if test="setMeal != null">#{setMeal},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCsaMemberCard" parameterType="CsaMemberCard">
+        update csa_member_card
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="cardno != null and cardno != ''">cardno = #{cardno},</if>
+            <if test="passwd != null and passwd != ''">passwd = #{passwd},</if>
+            <if test="activationValidity != null">activation_validity = #{activationValidity},</if>
+            <if test="usabilityStatus != null">usability_status = #{usabilityStatus},</if>
+            <if test="activeStatus != null">active_status = #{activeStatus},</if>
+            <if test="m2 != null">m2 = #{m2},</if>
+            <if test="landYears != null">land_years = #{landYears},</if>
+            <if test="archedYears != null">arched_years = #{archedYears},</if>
+            <if test="coins != null">coins = #{coins},</if>
+            <if test="balance != null">balance = #{balance},</if>
+            <if test="weight != null">weight = #{weight},</if>
+            <if test="setMeal != null">set_meal = #{setMeal},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCsaMemberCardById" parameterType="Long">
+        delete from csa_member_card where id = #{id}
+    </delete>
+
+    <delete id="deleteCsaMemberCardByIds" parameterType="String">
+        delete from csa_member_card where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/GardenLogAttachMapper.xml b/private-farm/src/main/resources/mapper/csa/GardenLogAttachMapper.xml
new file mode 100644
index 000000000..43e63b926
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/GardenLogAttachMapper.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.GardenLogAttachMapper">
+    
+    <resultMap type="GardenLogAttach" id="GardenLogAttachResult">
+        <result property="id"    column="id"    />
+        <result property="logId"    column="log_id"    />
+        <result property="attachType"    column="attach_type"    />
+        <result property="filename"    column="filename"    />
+        <result property="url"    column="url"    />
+        <result property="width"    column="width"    />
+        <result property="height"    column="height"    />
+        <result property="bytes"    column="bytes"    />
+        <result property="publishTime"    column="publish_time"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectGardenLogAttachVo">
+        select id, log_id, attach_type, filename, url, width, height, bytes, publish_time, del_flag, create_by, create_time, update_by, update_time, remark from csa_garden_log_attach
+    </sql>
+
+    <select id="selectGardenLogAttachList" parameterType="GardenLogAttach" resultMap="GardenLogAttachResult">
+        <include refid="selectGardenLogAttachVo"/>
+        <where>  
+            <if test="logId != null "> and log_id = #{logId}</if>
+            <if test="attachType != null  and attachType != ''"> and attach_type = #{attachType}</if>
+            <if test="publishTime != null "> and publish_time = #{publishTime}</if>
+        </where>
+    </select>
+    
+    <select id="selectGardenLogAttachById" parameterType="Long" resultMap="GardenLogAttachResult">
+        <include refid="selectGardenLogAttachVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertGardenLogAttach" parameterType="GardenLogAttach" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_garden_log_attach
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="logId != null">log_id,</if>
+            <if test="attachType != null and attachType != ''">attach_type,</if>
+            <if test="filename != null">filename,</if>
+            <if test="url != null">url,</if>
+            <if test="width != null">width,</if>
+            <if test="height != null">height,</if>
+            <if test="bytes != null">bytes,</if>
+            <if test="publishTime != null">publish_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="logId != null">#{logId},</if>
+            <if test="attachType != null and attachType != ''">#{attachType},</if>
+            <if test="filename != null">#{filename},</if>
+            <if test="url != null">#{url},</if>
+            <if test="width != null">#{width},</if>
+            <if test="height != null">#{height},</if>
+            <if test="bytes != null">#{bytes},</if>
+            <if test="publishTime != null">#{publishTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateGardenLogAttach" parameterType="GardenLogAttach">
+        update csa_garden_log_attach
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="logId != null">log_id = #{logId},</if>
+            <if test="attachType != null and attachType != ''">attach_type = #{attachType},</if>
+            <if test="filename != null">filename = #{filename},</if>
+            <if test="url != null">url = #{url},</if>
+            <if test="width != null">width = #{width},</if>
+            <if test="height != null">height = #{height},</if>
+            <if test="bytes != null">bytes = #{bytes},</if>
+            <if test="publishTime != null">publish_time = #{publishTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteGardenLogAttachById" parameterType="Long">
+        delete from csa_garden_log_attach where id = #{id}
+    </delete>
+
+    <delete id="deleteGardenLogAttachByIds" parameterType="String">
+        delete from csa_garden_log_attach where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/GardenLogMapper.xml b/private-farm/src/main/resources/mapper/csa/GardenLogMapper.xml
new file mode 100644
index 000000000..db50d27ff
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/GardenLogMapper.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.GardenLogMapper">
+    
+    <resultMap type="GardenLog" id="GardenLogResult">
+        <result property="id"    column="id"    />
+        <result property="memberId"    column="member_id"    />
+        <result property="gardenId"    column="garden_id"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="logType"    column="log_type"    />
+        <result property="content"    column="content"    />
+        <result property="publishTime"    column="publish_time"    />
+        <result property="publisher"    column="publisher"    />
+        <result property="publishStatus"    column="publish_status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectGardenLogVo">
+        select id, member_id, garden_id, task_id, log_type, content, publish_time, publisher, publish_status, del_flag, create_by, create_time, update_by, update_time, remark from csa_garden_log
+    </sql>
+
+    <select id="selectGardenLogList" parameterType="GardenLog" resultMap="GardenLogResult">
+        <include refid="selectGardenLogVo"/>
+        <where>  
+            <if test="memberId != null "> and member_id = #{memberId}</if>
+            <if test="gardenId != null "> and garden_id = #{gardenId}</if>
+            <if test="taskId != null "> and task_id = #{taskId}</if>
+            <if test="logType != null  and logType != ''"> and log_type = #{logType}</if>
+            <if test="publishTime != null "> and publish_time = #{publishTime}</if>
+            <if test="publisher != null "> and publisher = #{publisher}</if>
+            <if test="publishStatus != null  and publishStatus != ''"> and publish_status = #{publishStatus}</if>
+        </where>
+    </select>
+    
+    <select id="selectGardenLogById" parameterType="Long" resultMap="GardenLogResult">
+        <include refid="selectGardenLogVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertGardenLog" parameterType="GardenLog" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_garden_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">member_id,</if>
+            <if test="gardenId != null">garden_id,</if>
+            <if test="taskId != null">task_id,</if>
+            <if test="logType != null and logType != ''">log_type,</if>
+            <if test="content != null and content != ''">content,</if>
+            <if test="publishTime != null">publish_time,</if>
+            <if test="publisher != null">publisher,</if>
+            <if test="publishStatus != null and publishStatus != ''">publish_status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="memberId != null">#{memberId},</if>
+            <if test="gardenId != null">#{gardenId},</if>
+            <if test="taskId != null">#{taskId},</if>
+            <if test="logType != null and logType != ''">#{logType},</if>
+            <if test="content != null and content != ''">#{content},</if>
+            <if test="publishTime != null">#{publishTime},</if>
+            <if test="publisher != null">#{publisher},</if>
+            <if test="publishStatus != null and publishStatus != ''">#{publishStatus},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateGardenLog" parameterType="GardenLog">
+        update csa_garden_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="memberId != null">member_id = #{memberId},</if>
+            <if test="gardenId != null">garden_id = #{gardenId},</if>
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="logType != null and logType != ''">log_type = #{logType},</if>
+            <if test="content != null and content != ''">content = #{content},</if>
+            <if test="publishTime != null">publish_time = #{publishTime},</if>
+            <if test="publisher != null">publisher = #{publisher},</if>
+            <if test="publishStatus != null and publishStatus != ''">publish_status = #{publishStatus},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteGardenLogById" parameterType="Long">
+        delete from csa_garden_log where id = #{id}
+    </delete>
+
+    <delete id="deleteGardenLogByIds" parameterType="String">
+        delete from csa_garden_log where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/GardenMapper.xml b/private-farm/src/main/resources/mapper/csa/GardenMapper.xml
index 7ee7eeaa9..283c7bb0f 100644
--- a/private-farm/src/main/resources/mapper/csa/GardenMapper.xml
+++ b/private-farm/src/main/resources/mapper/csa/GardenMapper.xml
@@ -14,7 +14,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="managerId"    column="manager_id"    />
         <result property="workerId"    column="worker_id"    />
         <result property="contacterId"    column="contacter_id"    />
-        <result property="coins"    column="coins"    />
         <result property="isFarming"    column="is_farming"    />
         <result property="isSelled"    column="is_selled"    />
         <result property="isCompleted"    column="is_completed"    />
@@ -28,7 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectGardenVo">
-        select id, code, zone_code, name, m2, member_id, manager_id, worker_id, contacter_id, coins, is_farming, is_selled, is_completed, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_garden
+        select id, code, zone_code, name, m2, member_id, manager_id, worker_id, contacter_id, is_farming, is_selled, is_completed, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_garden
     </sql>
 
     <select id="selectGardenList" parameterType="Garden" resultMap="GardenResult">
@@ -64,7 +63,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="managerId != null">manager_id,</if>
             <if test="workerId != null">worker_id,</if>
             <if test="contacterId != null">contacter_id,</if>
-            <if test="coins != null">coins,</if>
             <if test="isFarming != null">is_farming,</if>
             <if test="isSelled != null">is_selled,</if>
             <if test="isCompleted != null">is_completed,</if>
@@ -86,7 +84,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="managerId != null">#{managerId},</if>
             <if test="workerId != null">#{workerId},</if>
             <if test="contacterId != null">#{contacterId},</if>
-            <if test="coins != null">#{coins},</if>
             <if test="isFarming != null">#{isFarming},</if>
             <if test="isSelled != null">#{isSelled},</if>
             <if test="isCompleted != null">#{isCompleted},</if>
@@ -111,7 +108,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="managerId != null">manager_id = #{managerId},</if>
             <if test="workerId != null">worker_id = #{workerId},</if>
             <if test="contacterId != null">contacter_id = #{contacterId},</if>
-            <if test="coins != null">coins = #{coins},</if>
             <if test="isFarming != null">is_farming = #{isFarming},</if>
             <if test="isSelled != null">is_selled = #{isSelled},</if>
             <if test="isCompleted != null">is_completed = #{isCompleted},</if>
diff --git a/private-farm/src/main/resources/mapper/csa/GardenStrainMapper.xml b/private-farm/src/main/resources/mapper/csa/GardenStrainMapper.xml
new file mode 100644
index 000000000..fb944d6d4
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/GardenStrainMapper.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.GardenStrainMapper">
+    
+    <resultMap type="GardenStrain" id="GardenStrainResult">
+        <result property="id"    column="id"    />
+        <result property="gardenId"    column="garden_id"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="cropId"    column="crop_id"    />
+        <result property="cropPhaseId"    column="crop_phase_id"    />
+        <result property="m2"    column="m2"    />
+        <result property="outputWeight"    column="output_weight"    />
+        <result property="isDefinite"    column="is_definite"    />
+        <result property="isPlanted"    column="is_planted"    />
+        <result property="isEnded"    column="is_ended"    />
+        <result property="definiteDate"    column="definite_date"    />
+        <result property="plantedDate"    column="planted_date"    />
+        <result property="endedDate"    column="ended_date"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectGardenStrainVo">
+        select id, garden_id, task_id, crop_id, crop_phase_id, m2, output_weight, is_definite, is_planted, is_ended, definite_date, planted_date, ended_date, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_garden_strain
+    </sql>
+
+    <select id="selectGardenStrainList" parameterType="GardenStrain" resultMap="GardenStrainResult">
+        <include refid="selectGardenStrainVo"/>
+        <where>  
+            <if test="gardenId != null "> and garden_id = #{gardenId}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectGardenStrainById" parameterType="Long" resultMap="GardenStrainResult">
+        <include refid="selectGardenStrainVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertGardenStrain" parameterType="GardenStrain" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_garden_strain
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="gardenId != null">garden_id,</if>
+            <if test="taskId != null">task_id,</if>
+            <if test="cropId != null">crop_id,</if>
+            <if test="cropPhaseId != null">crop_phase_id,</if>
+            <if test="m2 != null">m2,</if>
+            <if test="outputWeight != null">output_weight,</if>
+            <if test="isDefinite != null and isDefinite != ''">is_definite,</if>
+            <if test="isPlanted != null and isPlanted != ''">is_planted,</if>
+            <if test="isEnded != null and isEnded != ''">is_ended,</if>
+            <if test="definiteDate != null">definite_date,</if>
+            <if test="plantedDate != null">planted_date,</if>
+            <if test="endedDate != null">ended_date,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="gardenId != null">#{gardenId},</if>
+            <if test="taskId != null">#{taskId},</if>
+            <if test="cropId != null">#{cropId},</if>
+            <if test="cropPhaseId != null">#{cropPhaseId},</if>
+            <if test="m2 != null">#{m2},</if>
+            <if test="outputWeight != null">#{outputWeight},</if>
+            <if test="isDefinite != null and isDefinite != ''">#{isDefinite},</if>
+            <if test="isPlanted != null and isPlanted != ''">#{isPlanted},</if>
+            <if test="isEnded != null and isEnded != ''">#{isEnded},</if>
+            <if test="definiteDate != null">#{definiteDate},</if>
+            <if test="plantedDate != null">#{plantedDate},</if>
+            <if test="endedDate != null">#{endedDate},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateGardenStrain" parameterType="GardenStrain">
+        update csa_garden_strain
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="gardenId != null">garden_id = #{gardenId},</if>
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="cropId != null">crop_id = #{cropId},</if>
+            <if test="cropPhaseId != null">crop_phase_id = #{cropPhaseId},</if>
+            <if test="m2 != null">m2 = #{m2},</if>
+            <if test="outputWeight != null">output_weight = #{outputWeight},</if>
+            <if test="isDefinite != null and isDefinite != ''">is_definite = #{isDefinite},</if>
+            <if test="isPlanted != null and isPlanted != ''">is_planted = #{isPlanted},</if>
+            <if test="isEnded != null and isEnded != ''">is_ended = #{isEnded},</if>
+            <if test="definiteDate != null">definite_date = #{definiteDate},</if>
+            <if test="plantedDate != null">planted_date = #{plantedDate},</if>
+            <if test="endedDate != null">ended_date = #{endedDate},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteGardenStrainById" parameterType="Long">
+        delete from csa_garden_strain where id = #{id}
+    </delete>
+
+    <delete id="deleteGardenStrainByIds" parameterType="String">
+        delete from csa_garden_strain where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/PickDetailMapper.xml b/private-farm/src/main/resources/mapper/csa/PickDetailMapper.xml
new file mode 100644
index 000000000..15ae4a1f4
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/PickDetailMapper.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.PickDetailMapper">
+    
+    <resultMap type="PickDetail" id="PickDetailResult">
+        <result property="id"    column="id"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="strainId"    column="strain_id"    />
+        <result property="planWeight"    column="plan_weight"    />
+        <result property="resultWeight"    column="result_weight"    />
+        <result property="isCompleted"    column="is_completed"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectPickDetailVo">
+        select id, task_id, strain_id, plan_weight, result_weight, is_completed, del_flag, create_by, create_time, update_by, update_time, remark from csa_pick_detail
+    </sql>
+
+    <select id="selectPickDetailList" parameterType="PickDetail" resultMap="PickDetailResult">
+        <include refid="selectPickDetailVo"/>
+        <where>  
+            <if test="taskId != null "> and task_id = #{taskId}</if>
+            <if test="isCompleted != null  and isCompleted != ''"> and is_completed = #{isCompleted}</if>
+        </where>
+    </select>
+    
+    <select id="selectPickDetailById" parameterType="Long" resultMap="PickDetailResult">
+        <include refid="selectPickDetailVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPickDetail" parameterType="PickDetail" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_pick_detail
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="taskId != null">task_id,</if>
+            <if test="strainId != null">strain_id,</if>
+            <if test="planWeight != null">plan_weight,</if>
+            <if test="resultWeight != null">result_weight,</if>
+            <if test="isCompleted != null and isCompleted != ''">is_completed,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="taskId != null">#{taskId},</if>
+            <if test="strainId != null">#{strainId},</if>
+            <if test="planWeight != null">#{planWeight},</if>
+            <if test="resultWeight != null">#{resultWeight},</if>
+            <if test="isCompleted != null and isCompleted != ''">#{isCompleted},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePickDetail" parameterType="PickDetail">
+        update csa_pick_detail
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="strainId != null">strain_id = #{strainId},</if>
+            <if test="planWeight != null">plan_weight = #{planWeight},</if>
+            <if test="resultWeight != null">result_weight = #{resultWeight},</if>
+            <if test="isCompleted != null and isCompleted != ''">is_completed = #{isCompleted},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePickDetailById" parameterType="Long">
+        delete from csa_pick_detail where id = #{id}
+    </delete>
+
+    <delete id="deletePickDetailByIds" parameterType="String">
+        delete from csa_pick_detail where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/private-farm/src/main/resources/mapper/csa/TendTaskMapper.xml b/private-farm/src/main/resources/mapper/csa/TendTaskMapper.xml
new file mode 100644
index 000000000..a9ddf8a24
--- /dev/null
+++ b/private-farm/src/main/resources/mapper/csa/TendTaskMapper.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jlt.csa.mapper.TendTaskMapper">
+    
+    <resultMap type="TendTask" id="TendTaskResult">
+        <result property="id"    column="id"    />
+        <result property="gardenId"    column="garden_id"    />
+        <result property="taskType"    column="task_type"    />
+        <result property="taskSubtype"    column="task_subtype"    />
+        <result property="description"    column="description"    />
+        <result property="executionPhase"    column="execution_phase"    />
+        <result property="coins"    column="coins"    />
+        <result property="taskTime"    column="task_time"    />
+        <result property="feedbackTime"    column="feedback_time"    />
+        <result property="feedbackResult"    column="feedback_result"    />
+        <result property="executor"    column="executor"    />
+        <result property="feedbacker"    column="feedbacker"    />
+        <result property="isCompleted"    column="is_completed"    />
+        <result property="status"    column="status"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectTendTaskVo">
+        select id, garden_id, task_type, task_subtype, description, execution_phase, coins, task_time, feedback_time, feedback_result, executor, feedbacker, is_completed, status, del_flag, create_by, create_time, update_by, update_time, remark from csa_tend_task
+    </sql>
+
+    <select id="selectTendTaskList" parameterType="TendTask" resultMap="TendTaskResult">
+        <include refid="selectTendTaskVo"/>
+        <where>  
+            <if test="gardenId != null "> and garden_id = #{gardenId}</if>
+            <if test="taskType != null  and taskType != ''"> and task_type = #{taskType}</if>
+            <if test="executionPhase != null  and executionPhase != ''"> and execution_phase = #{executionPhase}</if>
+            <if test="executor != null "> and executor = #{executor}</if>
+            <if test="feedbacker != null "> and feedbacker = #{feedbacker}</if>
+            <if test="isCompleted != null  and isCompleted != ''"> and is_completed = #{isCompleted}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectTendTaskById" parameterType="Long" resultMap="TendTaskResult">
+        <include refid="selectTendTaskVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertTendTask" parameterType="TendTask" useGeneratedKeys="true" keyProperty="id">
+        insert into csa_tend_task
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="gardenId != null">garden_id,</if>
+            <if test="taskType != null and taskType != ''">task_type,</if>
+            <if test="taskSubtype != null">task_subtype,</if>
+            <if test="description != null">description,</if>
+            <if test="executionPhase != null and executionPhase != ''">execution_phase,</if>
+            <if test="coins != null">coins,</if>
+            <if test="taskTime != null">task_time,</if>
+            <if test="feedbackTime != null">feedback_time,</if>
+            <if test="feedbackResult != null">feedback_result,</if>
+            <if test="executor != null">executor,</if>
+            <if test="feedbacker != null">feedbacker,</if>
+            <if test="isCompleted != null and isCompleted != ''">is_completed,</if>
+            <if test="status != null">status,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="gardenId != null">#{gardenId},</if>
+            <if test="taskType != null and taskType != ''">#{taskType},</if>
+            <if test="taskSubtype != null">#{taskSubtype},</if>
+            <if test="description != null">#{description},</if>
+            <if test="executionPhase != null and executionPhase != ''">#{executionPhase},</if>
+            <if test="coins != null">#{coins},</if>
+            <if test="taskTime != null">#{taskTime},</if>
+            <if test="feedbackTime != null">#{feedbackTime},</if>
+            <if test="feedbackResult != null">#{feedbackResult},</if>
+            <if test="executor != null">#{executor},</if>
+            <if test="feedbacker != null">#{feedbacker},</if>
+            <if test="isCompleted != null and isCompleted != ''">#{isCompleted},</if>
+            <if test="status != null">#{status},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTendTask" parameterType="TendTask">
+        update csa_tend_task
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="gardenId != null">garden_id = #{gardenId},</if>
+            <if test="taskType != null and taskType != ''">task_type = #{taskType},</if>
+            <if test="taskSubtype != null">task_subtype = #{taskSubtype},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="executionPhase != null and executionPhase != ''">execution_phase = #{executionPhase},</if>
+            <if test="coins != null">coins = #{coins},</if>
+            <if test="taskTime != null">task_time = #{taskTime},</if>
+            <if test="feedbackTime != null">feedback_time = #{feedbackTime},</if>
+            <if test="feedbackResult != null">feedback_result = #{feedbackResult},</if>
+            <if test="executor != null">executor = #{executor},</if>
+            <if test="feedbacker != null">feedbacker = #{feedbacker},</if>
+            <if test="isCompleted != null and isCompleted != ''">is_completed = #{isCompleted},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteTendTaskById" parameterType="Long">
+        delete from csa_tend_task where id = #{id}
+    </delete>
+
+    <delete id="deleteTendTaskByIds" parameterType="String">
+        delete from csa_tend_task where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-generator/src/main/resources/generator.yml
index 4544c8c24..ad01bbe0b 100644
--- a/ruoyi-generator/src/main/resources/generator.yml
+++ b/ruoyi-generator/src/main/resources/generator.yml
@@ -1,10 +1,10 @@
 # 代码生成
 gen: 
   # 作者
-  author: ruoyi
+  author: JiaLeitao
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
-  packageName: com.ruoyi.system
+  packageName: com.jlt.csa
   # 自动去除表前缀,默认是false
-  autoRemovePre: false
+  autoRemovePre: true
   # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
-  tablePrefix: sys_
\ No newline at end of file
+  tablePrefix: csa_
\ No newline at end of file
diff --git a/ruoyi-ui/src/api/csa/archedrecord.js b/ruoyi-ui/src/api/csa/archedrecord.js
new file mode 100644
index 000000000..bea5afdc4
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/archedrecord.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询拱棚使用记录列表
+export function listArchedrecord(query) {
+  return request({
+    url: '/csa/archedrecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询拱棚使用记录详细
+export function getArchedrecord(id) {
+  return request({
+    url: '/csa/archedrecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增拱棚使用记录
+export function addArchedrecord(data) {
+  return request({
+    url: '/csa/archedrecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改拱棚使用记录
+export function updateArchedrecord(data) {
+  return request({
+    url: '/csa/archedrecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除拱棚使用记录
+export function delArchedrecord(id) {
+  return request({
+    url: '/csa/archedrecord/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/attach.js b/ruoyi-ui/src/api/csa/attach.js
new file mode 100644
index 000000000..82e0eb885
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/attach.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询菜地日志附件列表
+export function listAttach(query) {
+  return request({
+    url: '/csa/attach/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询菜地日志附件详细
+export function getAttach(id) {
+  return request({
+    url: '/csa/attach/' + id,
+    method: 'get'
+  })
+}
+
+// 新增菜地日志附件
+export function addAttach(data) {
+  return request({
+    url: '/csa/attach',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改菜地日志附件
+export function updateAttach(data) {
+  return request({
+    url: '/csa/attach',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除菜地日志附件
+export function delAttach(id) {
+  return request({
+    url: '/csa/attach/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/card.js b/ruoyi-ui/src/api/csa/card.js
new file mode 100644
index 000000000..e1ffb14d3
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/card.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询会员卡列表
+export function listCard(query) {
+  return request({
+    url: '/csa/card/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询会员卡详细
+export function getCard(id) {
+  return request({
+    url: '/csa/card/' + id,
+    method: 'get'
+  })
+}
+
+// 新增会员卡
+export function addCard(data) {
+  return request({
+    url: '/csa/card',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改会员卡
+export function updateCard(data) {
+  return request({
+    url: '/csa/card',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除会员卡
+export function delCard(id) {
+  return request({
+    url: '/csa/card/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/coinrecord.js b/ruoyi-ui/src/api/csa/coinrecord.js
new file mode 100644
index 000000000..9cfc235d6
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/coinrecord.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询金币记录列表
+export function listCoinrecord(query) {
+  return request({
+    url: '/csa/coinrecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询金币记录详细
+export function getCoinrecord(id) {
+  return request({
+    url: '/csa/coinrecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增金币记录
+export function addCoinrecord(data) {
+  return request({
+    url: '/csa/coinrecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改金币记录
+export function updateCoinrecord(data) {
+  return request({
+    url: '/csa/coinrecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除金币记录
+export function delCoinrecord(id) {
+  return request({
+    url: '/csa/coinrecord/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/commrecord.js b/ruoyi-ui/src/api/csa/commrecord.js
new file mode 100644
index 000000000..d08470b81
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/commrecord.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询沟通记录列表
+export function listCommrecord(query) {
+  return request({
+    url: '/csa/commrecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询沟通记录详细
+export function getCommrecord(id) {
+  return request({
+    url: '/csa/commrecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增沟通记录
+export function addCommrecord(data) {
+  return request({
+    url: '/csa/commrecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改沟通记录
+export function updateCommrecord(data) {
+  return request({
+    url: '/csa/commrecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除沟通记录
+export function delCommrecord(id) {
+  return request({
+    url: '/csa/commrecord/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/cropfiles.js b/ruoyi-ui/src/api/csa/cropfiles.js
new file mode 100644
index 000000000..9a4fddc7c
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/cropfiles.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询作物档案列表
+export function listCropfiles(query) {
+  return request({
+    url: '/csa/cropfiles/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询作物档案详细
+export function getCropfiles(id) {
+  return request({
+    url: '/csa/cropfiles/' + id,
+    method: 'get'
+  })
+}
+
+// 新增作物档案
+export function addCropfiles(data) {
+  return request({
+    url: '/csa/cropfiles',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改作物档案
+export function updateCropfiles(data) {
+  return request({
+    url: '/csa/cropfiles',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除作物档案
+export function delCropfiles(id) {
+  return request({
+    url: '/csa/cropfiles/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/detail.js b/ruoyi-ui/src/api/csa/detail.js
new file mode 100644
index 000000000..4d6cd6fb0
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/detail.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询采摘任务明细列表
+export function listDetail(query) {
+  return request({
+    url: '/csa/detail/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询采摘任务明细详细
+export function getDetail(id) {
+  return request({
+    url: '/csa/detail/' + id,
+    method: 'get'
+  })
+}
+
+// 新增采摘任务明细
+export function addDetail(data) {
+  return request({
+    url: '/csa/detail',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改采摘任务明细
+export function updateDetail(data) {
+  return request({
+    url: '/csa/detail',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除采摘任务明细
+export function delDetail(id) {
+  return request({
+    url: '/csa/detail/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/farmer.js b/ruoyi-ui/src/api/csa/farmer.js
new file mode 100644
index 000000000..1df7dc248
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/farmer.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询私家农场会员列表
+export function listFarmer(query) {
+  return request({
+    url: '/csa/farmer/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询私家农场会员详细
+export function getFarmer(id) {
+  return request({
+    url: '/csa/farmer/' + id,
+    method: 'get'
+  })
+}
+
+// 新增私家农场会员
+export function addFarmer(data) {
+  return request({
+    url: '/csa/farmer',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改私家农场会员
+export function updateFarmer(data) {
+  return request({
+    url: '/csa/farmer',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除私家农场会员
+export function delFarmer(id) {
+  return request({
+    url: '/csa/farmer/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/log.js b/ruoyi-ui/src/api/csa/log.js
new file mode 100644
index 000000000..e6a44ce38
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/log.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询菜地日志列表
+export function listLog(query) {
+  return request({
+    url: '/csa/log/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询菜地日志详细
+export function getLog(id) {
+  return request({
+    url: '/csa/log/' + id,
+    method: 'get'
+  })
+}
+
+// 新增菜地日志
+export function addLog(data) {
+  return request({
+    url: '/csa/log',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改菜地日志
+export function updateLog(data) {
+  return request({
+    url: '/csa/log',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除菜地日志
+export function delLog(id) {
+  return request({
+    url: '/csa/log/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/phase.js b/ruoyi-ui/src/api/csa/phase.js
new file mode 100644
index 000000000..095a2f377
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/phase.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询作物生长阶段列表
+export function listPhase(query) {
+  return request({
+    url: '/csa/phase/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询作物生长阶段详细
+export function getPhase(id) {
+  return request({
+    url: '/csa/phase/' + id,
+    method: 'get'
+  })
+}
+
+// 新增作物生长阶段
+export function addPhase(data) {
+  return request({
+    url: '/csa/phase',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改作物生长阶段
+export function updatePhase(data) {
+  return request({
+    url: '/csa/phase',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除作物生长阶段
+export function delPhase(id) {
+  return request({
+    url: '/csa/phase/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/strain.js b/ruoyi-ui/src/api/csa/strain.js
new file mode 100644
index 000000000..c4b5a7c20
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/strain.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询菜地品种列表
+export function listStrain(query) {
+  return request({
+    url: '/csa/strain/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询菜地品种详细
+export function getStrain(id) {
+  return request({
+    url: '/csa/strain/' + id,
+    method: 'get'
+  })
+}
+
+// 新增菜地品种
+export function addStrain(data) {
+  return request({
+    url: '/csa/strain',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改菜地品种
+export function updateStrain(data) {
+  return request({
+    url: '/csa/strain',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除菜地品种
+export function delStrain(id) {
+  return request({
+    url: '/csa/strain/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/csa/task.js b/ruoyi-ui/src/api/csa/task.js
new file mode 100644
index 000000000..512cf420f
--- /dev/null
+++ b/ruoyi-ui/src/api/csa/task.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询打理任务列表
+export function listTask(query) {
+  return request({
+    url: '/csa/task/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询打理任务详细
+export function getTask(id) {
+  return request({
+    url: '/csa/task/' + id,
+    method: 'get'
+  })
+}
+
+// 新增打理任务
+export function addTask(data) {
+  return request({
+    url: '/csa/task',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改打理任务
+export function updateTask(data) {
+  return request({
+    url: '/csa/task',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除打理任务
+export function delTask(id) {
+  return request({
+    url: '/csa/task/' + id,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/views/csa/archedrecord/index.vue b/ruoyi-ui/src/views/csa/archedrecord/index.vue
new file mode 100644
index 000000000..11c4fef80
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/archedrecord/index.vue
@@ -0,0 +1,357 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="会员id" prop="memberId">
+        <el-input
+          v-model="queryParams.memberId"
+          placeholder="请输入会员id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="菜地id" prop="gardenId">
+        <el-input
+          v-model="queryParams.gardenId"
+          placeholder="请输入菜地id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="对应年份" prop="yearNo">
+        <el-input
+          v-model="queryParams.yearNo"
+          placeholder="请输入对应年份"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作人id" prop="doerId">
+        <el-input
+          v-model="queryParams.doerId"
+          placeholder="请输入操作人id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="处理时间" prop="doTime">
+        <el-date-picker clearable
+          v-model="queryParams.doTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择处理时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:archedrecord:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:archedrecord:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:archedrecord:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:archedrecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="archedrecordList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="拱棚使用记录id" align="center" prop="id" />
+      <el-table-column label="对应年份" align="center" prop="yearNo" />
+      <el-table-column label="剩余年份" align="center" prop="remainingYears" />
+      <el-table-column label="操作人id" align="center" prop="doerId" />
+      <el-table-column label="处理时间" align="center" prop="doTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.doTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="有效状态" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:archedrecord:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:archedrecord:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改拱棚使用记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="会员id" prop="memberId">
+          <el-input v-model="form.memberId" placeholder="请输入会员id" />
+        </el-form-item>
+        <el-form-item label="菜地id" prop="gardenId">
+          <el-input v-model="form.gardenId" placeholder="请输入菜地id" />
+        </el-form-item>
+        <el-form-item label="对应年份" prop="yearNo">
+          <el-input v-model="form.yearNo" placeholder="请输入对应年份" />
+        </el-form-item>
+        <el-form-item label="消耗年份" prop="consumYear">
+          <el-input v-model="form.consumYear" placeholder="请输入消耗年份" />
+        </el-form-item>
+        <el-form-item label="剩余年份" prop="remainingYears">
+          <el-input v-model="form.remainingYears" placeholder="请输入剩余年份" />
+        </el-form-item>
+        <el-form-item label="操作人id" prop="doerId">
+          <el-input v-model="form.doerId" placeholder="请输入操作人id" />
+        </el-form-item>
+        <el-form-item label="处理时间" prop="doTime">
+          <el-date-picker clearable
+            v-model="form.doTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择处理时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listArchedrecord, getArchedrecord, delArchedrecord, addArchedrecord, updateArchedrecord } from "@/api/csa/archedrecord";
+
+export default {
+  name: "Archedrecord",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 拱棚使用记录表格数据
+      archedrecordList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        memberId: null,
+        gardenId: null,
+        yearNo: null,
+        doerId: null,
+        doTime: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        memberId: [
+          { required: true, message: "会员id不能为空", trigger: "blur" }
+        ],
+        gardenId: [
+          { required: true, message: "菜地id不能为空", trigger: "blur" }
+        ],
+        yearNo: [
+          { required: true, message: "对应年份不能为空", trigger: "blur" }
+        ],
+        consumYear: [
+          { required: true, message: "消耗年份不能为空", trigger: "blur" }
+        ],
+        remainingYears: [
+          { required: true, message: "剩余年份不能为空", trigger: "blur" }
+        ],
+        doerId: [
+          { required: true, message: "操作人id不能为空", trigger: "blur" }
+        ],
+        doTime: [
+          { required: true, message: "处理时间不能为空", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "有效状态不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询拱棚使用记录列表 */
+    getList() {
+      this.loading = true;
+      listArchedrecord(this.queryParams).then(response => {
+        this.archedrecordList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        memberId: null,
+        gardenId: null,
+        yearNo: null,
+        consumYear: null,
+        remainingYears: null,
+        doerId: null,
+        doTime: null,
+        status: "0",
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加拱棚使用记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getArchedrecord(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改拱棚使用记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateArchedrecord(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addArchedrecord(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除拱棚使用记录编号为"' + ids + '"的数据项?').then(function() {
+        return delArchedrecord(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/archedrecord/export', {
+        ...this.queryParams
+      }, `archedrecord_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/attach/index.vue b/ruoyi-ui/src/views/csa/attach/index.vue
new file mode 100644
index 000000000..745c75526
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/attach/index.vue
@@ -0,0 +1,317 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="菜地日志" prop="logId">
+        <el-input
+          v-model="queryParams.logId"
+          placeholder="请输入菜地日志"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="发布时间" prop="publishTime">
+        <el-date-picker clearable
+          v-model="queryParams.publishTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择发布时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:attach:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:attach:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:attach:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:attach:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="attachList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="附件id" align="center" prop="id" />
+      <el-table-column label="附件类型" align="center" prop="attachType" />
+      <el-table-column label="文件名" align="center" prop="filename" />
+      <el-table-column label="URL" align="center" prop="url" />
+      <el-table-column label="附件宽度" align="center" prop="width" />
+      <el-table-column label="附件高度" align="center" prop="height" />
+      <el-table-column label="字节数" align="center" prop="bytes" />
+      <el-table-column label="发布时间" align="center" prop="publishTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.publishTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:attach:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:attach:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改菜地日志附件对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="菜地日志" prop="logId">
+          <el-input v-model="form.logId" placeholder="请输入菜地日志" />
+        </el-form-item>
+        <el-form-item label="文件名" prop="filename">
+          <el-input v-model="form.filename" placeholder="请输入文件名" />
+        </el-form-item>
+        <el-form-item label="URL" prop="url">
+          <el-input v-model="form.url" placeholder="请输入URL" />
+        </el-form-item>
+        <el-form-item label="附件宽度" prop="width">
+          <el-input v-model="form.width" placeholder="请输入附件宽度" />
+        </el-form-item>
+        <el-form-item label="附件高度" prop="height">
+          <el-input v-model="form.height" placeholder="请输入附件高度" />
+        </el-form-item>
+        <el-form-item label="字节数" prop="bytes">
+          <el-input v-model="form.bytes" placeholder="请输入字节数" />
+        </el-form-item>
+        <el-form-item label="发布时间" prop="publishTime">
+          <el-date-picker clearable
+            v-model="form.publishTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择发布时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listAttach, getAttach, delAttach, addAttach, updateAttach } from "@/api/csa/attach";
+
+export default {
+  name: "Attach",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 菜地日志附件表格数据
+      attachList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        logId: null,
+        attachType: null,
+        publishTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        logId: [
+          { required: true, message: "菜地日志不能为空", trigger: "blur" }
+        ],
+        attachType: [
+          { required: true, message: "附件类型不能为空", trigger: "change" }
+        ],
+        publishTime: [
+          { required: true, message: "发布时间不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询菜地日志附件列表 */
+    getList() {
+      this.loading = true;
+      listAttach(this.queryParams).then(response => {
+        this.attachList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        logId: null,
+        attachType: null,
+        filename: null,
+        url: null,
+        width: null,
+        height: null,
+        bytes: null,
+        publishTime: null,
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加菜地日志附件";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getAttach(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改菜地日志附件";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateAttach(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addAttach(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除菜地日志附件编号为"' + ids + '"的数据项?').then(function() {
+        return delAttach(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/attach/export', {
+        ...this.queryParams
+      }, `attach_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/card/index.vue b/ruoyi-ui/src/views/csa/card/index.vue
new file mode 100644
index 000000000..0b40b7b15
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/card/index.vue
@@ -0,0 +1,368 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="卡号" prop="cardno">
+        <el-input
+          v-model="queryParams.cardno"
+          placeholder="请输入卡号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="土地年限" prop="landYears">
+        <el-input
+          v-model="queryParams.landYears"
+          placeholder="请输入土地年限"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="拱棚年限" prop="archedYears">
+        <el-input
+          v-model="queryParams.archedYears"
+          placeholder="请输入拱棚年限"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="套餐代码" prop="setMeal">
+        <el-input
+          v-model="queryParams.setMeal"
+          placeholder="请输入套餐代码"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:card:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:card:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:card:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:card:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="cardList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="卡id" align="center" prop="id" />
+      <el-table-column label="卡号" align="center" prop="cardno" />
+      <el-table-column label="激活有效期" align="center" prop="activationValidity" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.activationValidity, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="可用状态" align="center" prop="usabilityStatus" />
+      <el-table-column label="激活状态" align="center" prop="activeStatus" />
+      <el-table-column label="平方米" align="center" prop="m2" />
+      <el-table-column label="土地年限" align="center" prop="landYears" />
+      <el-table-column label="拱棚年限" align="center" prop="archedYears" />
+      <el-table-column label="金币" align="center" prop="coins" />
+      <el-table-column label="金额" align="center" prop="balance" />
+      <el-table-column label="重量" align="center" prop="weight" />
+      <el-table-column label="套餐代码" align="center" prop="setMeal" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:card:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:card:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改会员卡对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="卡号" prop="cardno">
+          <el-input v-model="form.cardno" placeholder="请输入卡号" />
+        </el-form-item>
+        <el-form-item label="密码" prop="passwd">
+          <el-input v-model="form.passwd" placeholder="请输入密码" />
+        </el-form-item>
+        <el-form-item label="激活有效期" prop="activationValidity">
+          <el-date-picker clearable
+            v-model="form.activationValidity"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择激活有效期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="平方米" prop="m2">
+          <el-input v-model="form.m2" placeholder="请输入平方米" />
+        </el-form-item>
+        <el-form-item label="土地年限" prop="landYears">
+          <el-input v-model="form.landYears" placeholder="请输入土地年限" />
+        </el-form-item>
+        <el-form-item label="拱棚年限" prop="archedYears">
+          <el-input v-model="form.archedYears" placeholder="请输入拱棚年限" />
+        </el-form-item>
+        <el-form-item label="金币" prop="coins">
+          <el-input v-model="form.coins" placeholder="请输入金币" />
+        </el-form-item>
+        <el-form-item label="金额" prop="balance">
+          <el-input v-model="form.balance" placeholder="请输入金额" />
+        </el-form-item>
+        <el-form-item label="重量" prop="weight">
+          <el-input v-model="form.weight" placeholder="请输入重量" />
+        </el-form-item>
+        <el-form-item label="套餐代码" prop="setMeal">
+          <el-input v-model="form.setMeal" placeholder="请输入套餐代码" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCard, getCard, delCard, addCard, updateCard } from "@/api/csa/card";
+
+export default {
+  name: "Card",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 会员卡表格数据
+      cardList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        cardno: null,
+        usabilityStatus: null,
+        activeStatus: null,
+        landYears: null,
+        archedYears: null,
+        setMeal: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        cardno: [
+          { required: true, message: "卡号不能为空", trigger: "blur" }
+        ],
+        passwd: [
+          { required: true, message: "密码不能为空", trigger: "blur" }
+        ],
+        m2: [
+          { required: true, message: "平方米不能为空", trigger: "blur" }
+        ],
+        landYears: [
+          { required: true, message: "土地年限不能为空", trigger: "blur" }
+        ],
+        archedYears: [
+          { required: true, message: "拱棚年限不能为空", trigger: "blur" }
+        ],
+        coins: [
+          { required: true, message: "金币不能为空", trigger: "blur" }
+        ],
+        balance: [
+          { required: true, message: "金额不能为空", trigger: "blur" }
+        ],
+        weight: [
+          { required: true, message: "重量不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询会员卡列表 */
+    getList() {
+      this.loading = true;
+      listCard(this.queryParams).then(response => {
+        this.cardList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        cardno: null,
+        passwd: null,
+        activationValidity: null,
+        usabilityStatus: "0",
+        activeStatus: "0",
+        m2: null,
+        landYears: null,
+        archedYears: null,
+        coins: null,
+        balance: null,
+        weight: null,
+        setMeal: null,
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加会员卡";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCard(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改会员卡";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCard(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCard(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除会员卡编号为"' + ids + '"的数据项?').then(function() {
+        return delCard(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/card/export', {
+        ...this.queryParams
+      }, `card_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/coinrecord/index.vue b/ruoyi-ui/src/views/csa/coinrecord/index.vue
new file mode 100644
index 000000000..ac7bbe177
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/coinrecord/index.vue
@@ -0,0 +1,315 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="会员id" prop="memberId">
+        <el-input
+          v-model="queryParams.memberId"
+          placeholder="请输入会员id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:coinrecord:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:coinrecord:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:coinrecord:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:coinrecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="coinrecordList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="记录id" align="center" prop="id" />
+      <el-table-column label="会员id" align="center" prop="memberId" />
+      <el-table-column label="业务类型" align="center" prop="opType" />
+      <el-table-column label="金币花费" align="center" prop="coins" />
+      <el-table-column label="金币余额" align="center" prop="coinBalance" />
+      <el-table-column label="描述" align="center" prop="description" />
+      <el-table-column label="业务发生时间" align="center" prop="opTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.opTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:coinrecord:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:coinrecord:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改金币记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="会员id" prop="memberId">
+          <el-input v-model="form.memberId" placeholder="请输入会员id" />
+        </el-form-item>
+        <el-form-item label="业务id" prop="opId">
+          <el-input v-model="form.opId" placeholder="请输入业务id" />
+        </el-form-item>
+        <el-form-item label="金币花费" prop="coins">
+          <el-input v-model="form.coins" placeholder="请输入金币花费" />
+        </el-form-item>
+        <el-form-item label="金币余额" prop="coinBalance">
+          <el-input v-model="form.coinBalance" placeholder="请输入金币余额" />
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <el-input v-model="form.description" placeholder="请输入描述" />
+        </el-form-item>
+        <el-form-item label="业务发生时间" prop="opTime">
+          <el-date-picker clearable
+            v-model="form.opTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择业务发生时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCoinrecord, getCoinrecord, delCoinrecord, addCoinrecord, updateCoinrecord } from "@/api/csa/coinrecord";
+
+export default {
+  name: "Coinrecord",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 金币记录表格数据
+      coinrecordList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        memberId: null,
+        opType: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        memberId: [
+          { required: true, message: "会员id不能为空", trigger: "blur" }
+        ],
+        opId: [
+          { required: true, message: "业务id不能为空", trigger: "blur" }
+        ],
+        opType: [
+          { required: true, message: "业务类型不能为空", trigger: "change" }
+        ],
+        coins: [
+          { required: true, message: "金币花费不能为空", trigger: "blur" }
+        ],
+        coinBalance: [
+          { required: true, message: "金币余额不能为空", trigger: "blur" }
+        ],
+        opTime: [
+          { required: true, message: "业务发生时间不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询金币记录列表 */
+    getList() {
+      this.loading = true;
+      listCoinrecord(this.queryParams).then(response => {
+        this.coinrecordList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        memberId: null,
+        opId: null,
+        opType: null,
+        coins: null,
+        coinBalance: null,
+        description: null,
+        opTime: null,
+        status: "0",
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加金币记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCoinrecord(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改金币记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCoinrecord(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCoinrecord(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除金币记录编号为"' + ids + '"的数据项?').then(function() {
+        return delCoinrecord(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/coinrecord/export', {
+        ...this.queryParams
+      }, `coinrecord_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/commrecord/index.vue b/ruoyi-ui/src/views/csa/commrecord/index.vue
new file mode 100644
index 000000000..24078f209
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/commrecord/index.vue
@@ -0,0 +1,388 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="会员" prop="memberId">
+        <el-input
+          v-model="queryParams.memberId"
+          placeholder="请输入会员"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="菜地id" prop="gardenId">
+        <el-input
+          v-model="queryParams.gardenId"
+          placeholder="请输入菜地id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="发布人" prop="recorder">
+        <el-input
+          v-model="queryParams.recorder"
+          placeholder="请输入发布人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="种植任务id" prop="taskId">
+        <el-input
+          v-model="queryParams.taskId"
+          placeholder="请输入种植任务id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否处理" prop="isCompleted">
+        <el-input
+          v-model="queryParams.isCompleted"
+          placeholder="请输入是否处理"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="沟通时间" prop="commTime">
+        <el-date-picker clearable
+          v-model="queryParams.commTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择沟通时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="处理时间" prop="doTime">
+        <el-date-picker clearable
+          v-model="queryParams.doTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择处理时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:commrecord:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:commrecord:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:commrecord:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:commrecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="commrecordList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="沟通日志记录id" align="center" prop="id" />
+      <el-table-column label="会员" align="center" prop="memberId" />
+      <el-table-column label="菜地id" align="center" prop="gardenId" />
+      <el-table-column label="发布人" align="center" prop="recorder" />
+      <el-table-column label="种植任务id" align="center" prop="taskId" />
+      <el-table-column label="沟通类型" align="center" prop="commType" />
+      <el-table-column label="沟通内容" align="center" prop="content" />
+      <el-table-column label="处理结果" align="center" prop="result" />
+      <el-table-column label="是否处理" align="center" prop="isCompleted" />
+      <el-table-column label="沟通时间" align="center" prop="commTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.commTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="处理时间" align="center" prop="doTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.doTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:commrecord:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:commrecord:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改沟通记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="会员" prop="memberId">
+          <el-input v-model="form.memberId" placeholder="请输入会员" />
+        </el-form-item>
+        <el-form-item label="菜地id" prop="gardenId">
+          <el-input v-model="form.gardenId" placeholder="请输入菜地id" />
+        </el-form-item>
+        <el-form-item label="发布人" prop="recorder">
+          <el-input v-model="form.recorder" placeholder="请输入发布人" />
+        </el-form-item>
+        <el-form-item label="种植任务id" prop="taskId">
+          <el-input v-model="form.taskId" placeholder="请输入种植任务id" />
+        </el-form-item>
+        <el-form-item label="沟通内容">
+          <editor v-model="form.content" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="处理结果" prop="result">
+          <el-input v-model="form.result" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="是否处理" prop="isCompleted">
+          <el-input v-model="form.isCompleted" placeholder="请输入是否处理" />
+        </el-form-item>
+        <el-form-item label="沟通时间" prop="commTime">
+          <el-date-picker clearable
+            v-model="form.commTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择沟通时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="处理时间" prop="doTime">
+          <el-date-picker clearable
+            v-model="form.doTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择处理时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCommrecord, getCommrecord, delCommrecord, addCommrecord, updateCommrecord } from "@/api/csa/commrecord";
+
+export default {
+  name: "Commrecord",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 沟通记录表格数据
+      commrecordList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        memberId: null,
+        gardenId: null,
+        recorder: null,
+        taskId: null,
+        commType: null,
+        isCompleted: null,
+        commTime: null,
+        doTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        memberId: [
+          { required: true, message: "会员不能为空", trigger: "blur" }
+        ],
+        recorder: [
+          { required: true, message: "发布人不能为空", trigger: "blur" }
+        ],
+        commType: [
+          { required: true, message: "沟通类型不能为空", trigger: "change" }
+        ],
+        content: [
+          { required: true, message: "沟通内容不能为空", trigger: "blur" }
+        ],
+        commTime: [
+          { required: true, message: "沟通时间不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询沟通记录列表 */
+    getList() {
+      this.loading = true;
+      listCommrecord(this.queryParams).then(response => {
+        this.commrecordList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        memberId: null,
+        gardenId: null,
+        recorder: null,
+        taskId: null,
+        commType: null,
+        content: null,
+        result: null,
+        isCompleted: null,
+        commTime: null,
+        doTime: null,
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加沟通记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCommrecord(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改沟通记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCommrecord(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCommrecord(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除沟通记录编号为"' + ids + '"的数据项?').then(function() {
+        return delCommrecord(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/commrecord/export', {
+        ...this.queryParams
+      }, `commrecord_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/cropfiles/index.vue b/ruoyi-ui/src/views/csa/cropfiles/index.vue
new file mode 100644
index 000000000..907c27629
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/cropfiles/index.vue
@@ -0,0 +1,272 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="作物名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入作物名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:cropfiles:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:cropfiles:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:cropfiles:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:cropfiles:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="cropfilesList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="作物名称" align="center" prop="name" />
+      <el-table-column label="生长阶段" align="center" prop="name">
+        <template slot-scope="scope">
+          <el-button>生长阶段</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="代表图片" align="center" prop="picture" />
+      <el-table-column label="状态" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:cropfiles:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:cropfiles:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改作物档案对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="作物名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入作物名称" />
+        </el-form-item>
+        <el-form-item label="种植指南" prop="plantGuide">
+          <el-input v-model="form.plantGuide" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="代表图片" prop="picture">
+          <el-input v-model="form.picture" placeholder="请输入代表图片" />
+        </el-form-item>
+        <el-form-item label="作物描述" prop="description">
+          <el-input v-model="form.description" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCropfiles, getCropfiles, delCropfiles, addCropfiles, updateCropfiles } from "@/api/csa/cropfiles";
+
+export default {
+  name: "Cropfiles",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 作物档案表格数据
+      cropfilesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [
+          { required: true, message: "作物名称不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询作物档案列表 */
+    getList() {
+      this.loading = true;
+      listCropfiles(this.queryParams).then(response => {
+        this.cropfilesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        plantGuide: null,
+        picture: null,
+        description: null,
+        status: "0",
+        delFlag: "0",
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加作物档案";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCropfiles(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改作物档案";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCropfiles(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCropfiles(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除作物档案编号为"' + ids + '"的数据项?').then(function() {
+        return delCropfiles(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/cropfiles/export', {
+        ...this.queryParams
+      }, `cropfiles_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/detail/index.vue b/ruoyi-ui/src/views/csa/detail/index.vue
new file mode 100644
index 000000000..840d73152
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/detail/index.vue
@@ -0,0 +1,291 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="任务id" prop="taskId">
+        <el-input
+          v-model="queryParams.taskId"
+          placeholder="请输入任务id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否处理完毕" prop="isCompleted">
+        <el-input
+          v-model="queryParams.isCompleted"
+          placeholder="请输入是否处理完毕"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:detail:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:detail:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:detail:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:detail:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="detailList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="采摘明细id" align="center" prop="id" />
+      <el-table-column label="计划重量" align="center" prop="planWeight" />
+      <el-table-column label="实际重量" align="center" prop="resultWeight" />
+      <el-table-column label="是否处理完毕" align="center" prop="isCompleted" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:detail:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:detail:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改采摘任务明细对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="任务id" prop="taskId">
+          <el-input v-model="form.taskId" placeholder="请输入任务id" />
+        </el-form-item>
+        <el-form-item label="菜地品种id" prop="strainId">
+          <el-input v-model="form.strainId" placeholder="请输入菜地品种id" />
+        </el-form-item>
+        <el-form-item label="计划重量" prop="planWeight">
+          <el-input v-model="form.planWeight" placeholder="请输入计划重量" />
+        </el-form-item>
+        <el-form-item label="实际重量" prop="resultWeight">
+          <el-input v-model="form.resultWeight" placeholder="请输入实际重量" />
+        </el-form-item>
+        <el-form-item label="是否处理完毕" prop="isCompleted">
+          <el-input v-model="form.isCompleted" placeholder="请输入是否处理完毕" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDetail, getDetail, delDetail, addDetail, updateDetail } from "@/api/csa/detail";
+
+export default {
+  name: "Detail",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 采摘任务明细表格数据
+      detailList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskId: null,
+        isCompleted: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        taskId: [
+          { required: true, message: "任务id不能为空", trigger: "blur" }
+        ],
+        isCompleted: [
+          { required: true, message: "是否处理完毕不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询采摘任务明细列表 */
+    getList() {
+      this.loading = true;
+      listDetail(this.queryParams).then(response => {
+        this.detailList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        taskId: null,
+        strainId: null,
+        planWeight: null,
+        resultWeight: null,
+        isCompleted: null,
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加采摘任务明细";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDetail(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改采摘任务明细";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDetail(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDetail(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除采摘任务明细编号为"' + ids + '"的数据项?').then(function() {
+        return delDetail(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/detail/export', {
+        ...this.queryParams
+      }, `detail_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/farmer/index.vue b/ruoyi-ui/src/views/csa/farmer/index.vue
new file mode 100644
index 000000000..cc0f7b58d
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/farmer/index.vue
@@ -0,0 +1,340 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="会员姓名" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入会员姓名"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="到期日期" prop="dueDate">
+        <el-date-picker clearable
+          v-model="queryParams.dueDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择到期日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="是否过期" prop="isExpire">
+        <el-input
+          v-model="queryParams.isExpire"
+          placeholder="请输入是否过期"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:farmer:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:farmer:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:farmer:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:farmer:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="farmerList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="会员id" align="center" prop="id" />
+      <el-table-column label="会员姓名" align="center" prop="name" />
+      <el-table-column label="性别" align="center" prop="gender" />
+      <el-table-column label="金币余额" align="center" prop="coins" />
+      <el-table-column label="账户余额" align="center" prop="balance" />
+      <el-table-column label="重量余额" align="center" prop="weight" />
+      <el-table-column label="拱棚年限余额" align="center" prop="archedYears" />
+      <el-table-column label="加入日期" align="center" prop="joinDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.joinDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="到期日期" align="center" prop="dueDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.dueDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="是否过期" align="center" prop="isExpire" />
+      <el-table-column label="状态" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:farmer:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:farmer:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改私家农场会员对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="会员姓名" prop="name">
+          <el-input v-model="form.name" placeholder="请输入会员姓名" />
+        </el-form-item>
+        <el-form-item label="性别" prop="gender">
+          <el-input v-model="form.gender" placeholder="请输入性别" />
+        </el-form-item>
+        <el-form-item label="金币余额" prop="coins">
+          <el-input v-model="form.coins" placeholder="请输入金币余额" />
+        </el-form-item>
+        <el-form-item label="账户余额" prop="balance">
+          <el-input v-model="form.balance" placeholder="请输入账户余额" />
+        </el-form-item>
+        <el-form-item label="重量余额" prop="weight">
+          <el-input v-model="form.weight" placeholder="请输入重量余额" />
+        </el-form-item>
+        <el-form-item label="拱棚年限余额" prop="archedYears">
+          <el-input v-model="form.archedYears" placeholder="请输入拱棚年限余额" />
+        </el-form-item>
+        <el-form-item label="加入日期" prop="joinDate">
+          <el-date-picker clearable
+            v-model="form.joinDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择加入日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="到期日期" prop="dueDate">
+          <el-date-picker clearable
+            v-model="form.dueDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择到期日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="是否过期" prop="isExpire">
+          <el-input v-model="form.isExpire" placeholder="请输入是否过期" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listFarmer, getFarmer, delFarmer, addFarmer, updateFarmer } from "@/api/csa/farmer";
+
+export default {
+  name: "Farmer",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 私家农场会员表格数据
+      farmerList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        dueDate: null,
+        isExpire: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [
+          { required: true, message: "会员姓名不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询私家农场会员列表 */
+    getList() {
+      this.loading = true;
+      listFarmer(this.queryParams).then(response => {
+        this.farmerList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        gender: null,
+        coins: null,
+        balance: null,
+        weight: null,
+        archedYears: null,
+        joinDate: null,
+        dueDate: null,
+        isExpire: null,
+        status: "0",
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加私家农场会员";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getFarmer(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改私家农场会员";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateFarmer(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addFarmer(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除私家农场会员编号为"' + ids + '"的数据项?').then(function() {
+        return delFarmer(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/farmer/export', {
+        ...this.queryParams
+      }, `farmer_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/log/index.vue b/ruoyi-ui/src/views/csa/log/index.vue
new file mode 100644
index 000000000..90d250489
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/log/index.vue
@@ -0,0 +1,355 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="会员" prop="memberId">
+        <el-input
+          v-model="queryParams.memberId"
+          placeholder="请输入会员"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="菜地" prop="gardenId">
+        <el-input
+          v-model="queryParams.gardenId"
+          placeholder="请输入菜地"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="种植任务" prop="taskId">
+        <el-input
+          v-model="queryParams.taskId"
+          placeholder="请输入种植任务"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="发布时间" prop="publishTime">
+        <el-date-picker clearable
+          v-model="queryParams.publishTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="请选择发布时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="发布人" prop="publisher">
+        <el-input
+          v-model="queryParams.publisher"
+          placeholder="请输入发布人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:log:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:log:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:log:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:log:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="logList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="菜地日志id" align="center" prop="id" />
+      <el-table-column label="会员" align="center" prop="memberId" />
+      <el-table-column label="菜地" align="center" prop="gardenId" />
+      <el-table-column label="种植任务" align="center" prop="taskId" />
+      <el-table-column label="日志类型" align="center" prop="logType" />
+      <el-table-column label="日志内容" align="center" prop="content" />
+      <el-table-column label="发布时间" align="center" prop="publishTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.publishTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="发布人" align="center" prop="publisher" />
+      <el-table-column label="发布状态" align="center" prop="publishStatus" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:log:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:log:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改菜地日志对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="会员" prop="memberId">
+          <el-input v-model="form.memberId" placeholder="请输入会员" />
+        </el-form-item>
+        <el-form-item label="菜地" prop="gardenId">
+          <el-input v-model="form.gardenId" placeholder="请输入菜地" />
+        </el-form-item>
+        <el-form-item label="种植任务" prop="taskId">
+          <el-input v-model="form.taskId" placeholder="请输入种植任务" />
+        </el-form-item>
+        <el-form-item label="日志内容">
+          <editor v-model="form.content" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="发布时间" prop="publishTime">
+          <el-date-picker clearable
+            v-model="form.publishTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择发布时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="发布人" prop="publisher">
+          <el-input v-model="form.publisher" placeholder="请输入发布人" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLog, getLog, delLog, addLog, updateLog } from "@/api/csa/log";
+
+export default {
+  name: "Log",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 菜地日志表格数据
+      logList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        memberId: null,
+        gardenId: null,
+        taskId: null,
+        logType: null,
+        publishTime: null,
+        publisher: null,
+        publishStatus: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        memberId: [
+          { required: true, message: "会员不能为空", trigger: "blur" }
+        ],
+        gardenId: [
+          { required: true, message: "菜地不能为空", trigger: "blur" }
+        ],
+        logType: [
+          { required: true, message: "日志类型不能为空", trigger: "change" }
+        ],
+        content: [
+          { required: true, message: "日志内容不能为空", trigger: "blur" }
+        ],
+        publishTime: [
+          { required: true, message: "发布时间不能为空", trigger: "blur" }
+        ],
+        publisher: [
+          { required: true, message: "发布人不能为空", trigger: "blur" }
+        ],
+        publishStatus: [
+          { required: true, message: "发布状态不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询菜地日志列表 */
+    getList() {
+      this.loading = true;
+      listLog(this.queryParams).then(response => {
+        this.logList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        memberId: null,
+        gardenId: null,
+        taskId: null,
+        logType: null,
+        content: null,
+        publishTime: null,
+        publisher: null,
+        publishStatus: "0",
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加菜地日志";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLog(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改菜地日志";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLog(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLog(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除菜地日志编号为"' + ids + '"的数据项?').then(function() {
+        return delLog(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/log/export', {
+        ...this.queryParams
+      }, `log_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/phase/index.vue b/ruoyi-ui/src/views/csa/phase/index.vue
new file mode 100644
index 000000000..bd11c6928
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/phase/index.vue
@@ -0,0 +1,290 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="作物id" prop="cropId">
+        <el-input
+          v-model="queryParams.cropId"
+          placeholder="请输入作物id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="阶段名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入阶段名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:phase:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:phase:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:phase:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:phase:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="phaseList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="阶段id" align="center" prop="id" />
+      <el-table-column label="阶段名称" align="center" prop="name" />
+      <el-table-column label="产出" align="center" prop="production" />
+      <el-table-column label="代表图片" align="center" prop="picture" />
+      <el-table-column label="状态" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:phase:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:phase:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改作物生长阶段对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="作物id" prop="cropId">
+          <el-input v-model="form.cropId" placeholder="请输入作物id" />
+        </el-form-item>
+        <el-form-item label="阶段名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入阶段名称" />
+        </el-form-item>
+        <el-form-item label="产出" prop="production">
+          <el-input v-model="form.production" placeholder="请输入产出" />
+        </el-form-item>
+        <el-form-item label="代表图片" prop="picture">
+          <el-input v-model="form.picture" placeholder="请输入代表图片" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listPhase, getPhase, delPhase, addPhase, updatePhase } from "@/api/csa/phase";
+
+export default {
+  name: "Phase",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 作物生长阶段表格数据
+      phaseList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        cropId: null,
+        name: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        cropId: [
+          { required: true, message: "作物id不能为空", trigger: "blur" }
+        ],
+        name: [
+          { required: true, message: "阶段名称不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询作物生长阶段列表 */
+    getList() {
+      this.loading = true;
+      listPhase(this.queryParams).then(response => {
+        this.phaseList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        cropId: null,
+        name: null,
+        production: null,
+        picture: null,
+        status: "0",
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加作物生长阶段";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPhase(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改作物生长阶段";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updatePhase(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPhase(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除作物生长阶段编号为"' + ids + '"的数据项?').then(function() {
+        return delPhase(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/phase/export', {
+        ...this.queryParams
+      }, `phase_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/strain/index.vue b/ruoyi-ui/src/views/csa/strain/index.vue
new file mode 100644
index 000000000..f80ecdb30
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/strain/index.vue
@@ -0,0 +1,363 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="菜地" prop="gardenId">
+        <el-input
+          v-model="queryParams.gardenId"
+          placeholder="请输入菜地"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:strain:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:strain:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:strain:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:strain:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="strainList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="菜地品种id" align="center" prop="id" />
+      <el-table-column label="种植任务" align="center" prop="taskId" />
+      <el-table-column label="作物id" align="center" prop="cropId" />
+      <el-table-column label="作物阶段" align="center" prop="cropPhaseId" />
+      <el-table-column label="平方米" align="center" prop="m2" />
+      <el-table-column label="产出重量" align="center" prop="outputWeight" />
+      <el-table-column label="是否确定" align="center" prop="isDefinite" />
+      <el-table-column label="是否种植" align="center" prop="isPlanted" />
+      <el-table-column label="是否拉秧" align="center" prop="isEnded" />
+      <el-table-column label="确定时间" align="center" prop="definiteDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.definiteDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="种植日期" align="center" prop="plantedDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.plantedDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="拉秧日期" align="center" prop="endedDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.endedDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:strain:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:strain:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改菜地品种对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="菜地" prop="gardenId">
+          <el-input v-model="form.gardenId" placeholder="请输入菜地" />
+        </el-form-item>
+        <el-form-item label="种植任务" prop="taskId">
+          <el-input v-model="form.taskId" placeholder="请输入种植任务" />
+        </el-form-item>
+        <el-form-item label="作物id" prop="cropId">
+          <el-input v-model="form.cropId" placeholder="请输入作物id" />
+        </el-form-item>
+        <el-form-item label="作物阶段" prop="cropPhaseId">
+          <el-input v-model="form.cropPhaseId" placeholder="请输入作物阶段" />
+        </el-form-item>
+        <el-form-item label="平方米" prop="m2">
+          <el-input v-model="form.m2" placeholder="请输入平方米" />
+        </el-form-item>
+        <el-form-item label="产出重量" prop="outputWeight">
+          <el-input v-model="form.outputWeight" placeholder="请输入产出重量" />
+        </el-form-item>
+        <el-form-item label="是否确定" prop="isDefinite">
+          <el-input v-model="form.isDefinite" placeholder="请输入是否确定" />
+        </el-form-item>
+        <el-form-item label="是否种植" prop="isPlanted">
+          <el-input v-model="form.isPlanted" placeholder="请输入是否种植" />
+        </el-form-item>
+        <el-form-item label="是否拉秧" prop="isEnded">
+          <el-input v-model="form.isEnded" placeholder="请输入是否拉秧" />
+        </el-form-item>
+        <el-form-item label="确定时间" prop="definiteDate">
+          <el-date-picker clearable
+            v-model="form.definiteDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择确定时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="种植日期" prop="plantedDate">
+          <el-date-picker clearable
+            v-model="form.plantedDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择种植日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="拉秧日期" prop="endedDate">
+          <el-date-picker clearable
+            v-model="form.endedDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择拉秧日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listStrain, getStrain, delStrain, addStrain, updateStrain } from "@/api/csa/strain";
+
+export default {
+  name: "Strain",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 菜地品种表格数据
+      strainList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        gardenId: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        gardenId: [
+          { required: true, message: "菜地不能为空", trigger: "blur" }
+        ],
+        cropId: [
+          { required: true, message: "作物id不能为空", trigger: "blur" }
+        ],
+        m2: [
+          { required: true, message: "平方米不能为空", trigger: "blur" }
+        ],
+        outputWeight: [
+          { required: true, message: "产出重量不能为空", trigger: "blur" }
+        ],
+        isDefinite: [
+          { required: true, message: "是否确定不能为空", trigger: "blur" }
+        ],
+        isPlanted: [
+          { required: true, message: "是否种植不能为空", trigger: "blur" }
+        ],
+        isEnded: [
+          { required: true, message: "是否拉秧不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询菜地品种列表 */
+    getList() {
+      this.loading = true;
+      listStrain(this.queryParams).then(response => {
+        this.strainList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        gardenId: null,
+        taskId: null,
+        cropId: null,
+        cropPhaseId: null,
+        m2: null,
+        outputWeight: null,
+        isDefinite: null,
+        isPlanted: null,
+        isEnded: null,
+        definiteDate: null,
+        plantedDate: null,
+        endedDate: null,
+        status: "0",
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加菜地品种";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getStrain(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改菜地品种";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateStrain(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addStrain(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除菜地品种编号为"' + ids + '"的数据项?').then(function() {
+        return delStrain(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/strain/export', {
+        ...this.queryParams
+      }, `strain_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/ruoyi-ui/src/views/csa/task/index.vue b/ruoyi-ui/src/views/csa/task/index.vue
new file mode 100644
index 000000000..886239e9c
--- /dev/null
+++ b/ruoyi-ui/src/views/csa/task/index.vue
@@ -0,0 +1,381 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="菜地id" prop="gardenId">
+        <el-input
+          v-model="queryParams.gardenId"
+          placeholder="请输入菜地id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="任务阶段" prop="executionPhase">
+        <el-input
+          v-model="queryParams.executionPhase"
+          placeholder="请输入任务阶段"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="执行人" prop="executor">
+        <el-input
+          v-model="queryParams.executor"
+          placeholder="请输入执行人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="反馈人" prop="feedbacker">
+        <el-input
+          v-model="queryParams.feedbacker"
+          placeholder="请输入反馈人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否处理完毕" prop="isCompleted">
+        <el-input
+          v-model="queryParams.isCompleted"
+          placeholder="请输入是否处理完毕"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['csa:task:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['csa:task:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['csa:task:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['csa:task:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="任务id" align="center" prop="id" />
+      <el-table-column label="菜地id" align="center" prop="gardenId" />
+      <el-table-column label="任务描述" align="center" prop="description" />
+      <el-table-column label="任务阶段" align="center" prop="executionPhase" />
+      <el-table-column label="金币花费" align="center" prop="coins" />
+      <el-table-column label="任务产生时间" align="center" prop="taskTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.taskTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="反馈时间" align="center" prop="feedbackTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.feedbackTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="反馈结果" align="center" prop="feedbackResult" />
+      <el-table-column label="执行人" align="center" prop="executor" />
+      <el-table-column label="反馈人" align="center" prop="feedbacker" />
+      <el-table-column label="是否处理完毕" align="center" prop="isCompleted" />
+      <el-table-column label="状态" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['csa:task:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['csa:task:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改打理任务对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="菜地id" prop="gardenId">
+          <el-input v-model="form.gardenId" placeholder="请输入菜地id" />
+        </el-form-item>
+        <el-form-item label="任务描述" prop="description">
+          <el-input v-model="form.description" placeholder="请输入任务描述" />
+        </el-form-item>
+        <el-form-item label="任务阶段" prop="executionPhase">
+          <el-input v-model="form.executionPhase" placeholder="请输入任务阶段" />
+        </el-form-item>
+        <el-form-item label="金币花费" prop="coins">
+          <el-input v-model="form.coins" placeholder="请输入金币花费" />
+        </el-form-item>
+        <el-form-item label="任务产生时间" prop="taskTime">
+          <el-date-picker clearable
+            v-model="form.taskTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择任务产生时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="反馈时间" prop="feedbackTime">
+          <el-date-picker clearable
+            v-model="form.feedbackTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择反馈时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="反馈结果" prop="feedbackResult">
+          <el-input v-model="form.feedbackResult" placeholder="请输入反馈结果" />
+        </el-form-item>
+        <el-form-item label="执行人" prop="executor">
+          <el-input v-model="form.executor" placeholder="请输入执行人" />
+        </el-form-item>
+        <el-form-item label="反馈人" prop="feedbacker">
+          <el-input v-model="form.feedbacker" placeholder="请输入反馈人" />
+        </el-form-item>
+        <el-form-item label="是否处理完毕" prop="isCompleted">
+          <el-input v-model="form.isCompleted" placeholder="请输入是否处理完毕" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTask, getTask, delTask, addTask, updateTask } from "@/api/csa/task";
+
+export default {
+  name: "Task",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 打理任务表格数据
+      taskList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        gardenId: null,
+        taskType: null,
+        executionPhase: null,
+        executor: null,
+        feedbacker: null,
+        isCompleted: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        gardenId: [
+          { required: true, message: "菜地id不能为空", trigger: "blur" }
+        ],
+        taskType: [
+          { required: true, message: "任务类型不能为空", trigger: "change" }
+        ],
+        executionPhase: [
+          { required: true, message: "任务阶段不能为空", trigger: "blur" }
+        ],
+        coins: [
+          { required: true, message: "金币花费不能为空", trigger: "blur" }
+        ],
+        taskTime: [
+          { required: true, message: "任务产生时间不能为空", trigger: "blur" }
+        ],
+        isCompleted: [
+          { required: true, message: "是否处理完毕不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询打理任务列表 */
+    getList() {
+      this.loading = true;
+      listTask(this.queryParams).then(response => {
+        this.taskList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        gardenId: null,
+        taskType: null,
+        taskSubtype: null,
+        description: null,
+        executionPhase: null,
+        coins: null,
+        taskTime: null,
+        feedbackTime: null,
+        feedbackResult: null,
+        executor: null,
+        feedbacker: null,
+        isCompleted: null,
+        status: "0",
+        delFlag: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加打理任务";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getTask(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改打理任务";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateTask(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTask(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除打理任务编号为"' + ids + '"的数据项?').then(function() {
+        return delTask(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('csa/task/export', {
+        ...this.queryParams
+      }, `task_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>