diff --git a/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java b/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java
index fa81301..ad55b90 100644
--- a/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java
+++ b/src/main/java/mjkf/xinke/main/constant/HttpErrorResponseEnum.java
@@ -29,6 +29,8 @@ public enum HttpErrorResponseEnum implements NcHttpErrorResponseInterface {
PRICE_PUBLISH_YEAR_MONTH_NEEDED("缺少年份或月份", 1201, HttpStatus.SC_NOT_FOUND),
PRICE_PUBLISH_NOT_FOUND("未找到对应数据", 1202, HttpStatus.SC_NOT_FOUND),
+
+ BUDGET_NOT_FOUND("未找到对应数据", 1301, HttpStatus.SC_NOT_FOUND),
;
private String message;
diff --git a/src/main/java/mjkf/xinke/main/controller/BudgetController.java b/src/main/java/mjkf/xinke/main/controller/BudgetController.java
new file mode 100644
index 0000000..3b8c741
--- /dev/null
+++ b/src/main/java/mjkf/xinke/main/controller/BudgetController.java
@@ -0,0 +1,142 @@
+package mjkf.xinke.main.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jgy.xxs.core.http.exp.NcHttpException;
+import com.jgy.xxs.core.http.resp.HttpResponse;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import mjkf.xinke.auth.core.util.StpLoginUserUtil;
+import mjkf.xinke.main.common.http.FuHttpResponse;
+import mjkf.xinke.main.constant.HttpErrorResponseEnum;
+import mjkf.xinke.main.model.db.Budget;
+import mjkf.xinke.main.model.db.BudgetItem;
+import mjkf.xinke.main.model.db.PricePublish;
+import mjkf.xinke.main.model.vo.BudgetCreateRequest;
+import mjkf.xinke.main.model.vo.BudgetDetail;
+import mjkf.xinke.main.service.BudgetItemService;
+import mjkf.xinke.main.service.BudgetService;
+import mjkf.xinke.main.service.PricePublishService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * 预算 前端控制器
+ *
+ *
+ * @author han0
+ * @since 2023-12-14
+ */
+@RestController
+@RequestMapping("/budget")
+public class BudgetController {
+
+ @Resource
+ BudgetService budgetService;
+
+ @Resource
+ BudgetItemService budgetItemService;
+
+ @Resource
+ PricePublishService pricePublishService;
+
+ @ApiOperation("新增预算")
+ @PostMapping("/")
+ @Transactional
+ public HttpResponse create (
+ @ApiParam("参数") @RequestBody BudgetCreateRequest params
+ ) throws Exception {
+ params.check();
+ var user = StpLoginUserUtil.getLoginUser();
+
+ // 查询各月份材料价格
+ LambdaQueryWrapper query = pricePublishService.getQuery(params);
+ // 转换查询结果为键值对 材料id,月份 => 价格
+ var priceMap = pricePublishService.getPriceMapEntryByMaterialIdAndMonth(query);
+ // 各月份求和
+ var totalMap = new HashMap();
+ var budgetItemList = new ArrayList();
+ for (var item: params.getItems()) {
+ var meta = new ArrayList