diff --git a/.gitignore b/.gitignore
index 6dcd014..c11d6f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,6 @@
/out/
/.idea/
/taikai2312.iml
+.project
+.classpath
+.settings
\ No newline at end of file
diff --git a/uapbd/META-INF/stordocManageResource.rest b/uapbd/META-INF/stordocManageResource.rest
new file mode 100644
index 0000000..e28a0b7
--- /dev/null
+++ b/uapbd/META-INF/stordocManageResource.rest
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uapbd/src/public/nccloud/api/uapbd/stordocmanage/storedoc/StordocManageResource.java b/uapbd/src/public/nccloud/api/uapbd/stordocmanage/storedoc/StordocManageResource.java
new file mode 100644
index 0000000..bf366db
--- /dev/null
+++ b/uapbd/src/public/nccloud/api/uapbd/stordocmanage/storedoc/StordocManageResource.java
@@ -0,0 +1,252 @@
+package nccloud.api.uapbd.stordocmanage.storedoc;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import nc.bs.dao.BaseDAO;
+import nc.impl.pubapp.pattern.database.SqlBuilderUtil;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.bd.stordoc.StordocVO;
+import nccloud.api.rest.utils.OpenApiPageInfo;
+import nccloud.api.rest.utils.ResultMessageUtil;
+import nccloud.api.uapbd.common.utils.OpenApiPagenationUtils;
+import nccloud.commons.lang.StringUtils;
+import nccloud.ws.rest.resource.AbstractNCCRestResource;
+import org.json.JSONString;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import java.util.*;
+
+/**
+ * 仓库接口
+ */
+@Path("uapbd/stordoc/stordoc")
+public class StordocManageResource extends AbstractNCCRestResource {
+
+ public static final BaseDAO BASE_DAO = new BaseDAO();
+
+ @Override
+ public String getModule() {
+ return "uapbd";
+ }
+
+ /**
+ * 手动构建SQL条件
+ *
+ * @param paramMap 参数Map
+ * @return SQL条件字符串
+ */
+ private String buildCondition(Map paramMap) {
+ List conditions = new ArrayList<>();
+
+ // 处理code数组 - 使用IN条件
+ if (paramMap.containsKey("code")) {
+ String[] codes = (String[]) paramMap.get("code");
+ if (codes != null && codes.length > 0) {
+ StringBuilder codeCondition = new StringBuilder("code in (");
+ for (int i = 0; i < codes.length; i++) {
+ if (i > 0) {
+ codeCondition.append(",");
+ }
+ codeCondition.append("'").append(escapeSql(codes[i])).append("'");
+ }
+ codeCondition.append(")");
+ conditions.add(codeCondition.toString());
+ }
+ }
+ // 处理pk_group数组 - 使用IN条件
+ if (paramMap.containsKey("pk_group")) {
+ String[] pk_groups = (String[]) paramMap.get("pk_group");
+ if (pk_groups != null && pk_groups.length > 0) {
+ StringBuilder codeCondition = new StringBuilder("pk_group in (");
+ for (int i = 0; i < pk_groups.length; i++) {
+ if (i > 0) {
+ codeCondition.append(",");
+ }
+ codeCondition.append("'").append(escapeSql(pk_groups[i])).append("'");
+ }
+ codeCondition.append(")");
+ conditions.add(codeCondition.toString());
+ }
+ }
+ // 处理pk_org数组 - 使用IN条件
+ if (paramMap.containsKey("pk_org")) {
+ String[] pk_orgs = (String[]) paramMap.get("pk_org");
+ if (pk_orgs != null && pk_orgs.length > 0) {
+ StringBuilder codeCondition = new StringBuilder("pk_org in (");
+ for (int i = 0; i < pk_orgs.length; i++) {
+ if (i > 0) {
+ codeCondition.append(",");
+ }
+ codeCondition.append("'").append(escapeSql(pk_orgs[i])).append("'");
+ }
+ codeCondition.append(")");
+ conditions.add(codeCondition.toString());
+ }
+ }
+
+ // 处理name数组 - 使IN条件
+ if (paramMap.containsKey("name")) {
+ String[] names = (String[]) paramMap.get("name");
+ if (names != null && names.length > 0) {
+ StringBuilder nameCondition = new StringBuilder("name in (");
+ for (int i = 0; i < names.length; i++) {
+ if (i > 0) {
+ nameCondition.append(",");
+ }
+ nameCondition.append("'").append(escapeSql(names[i])).append("'");
+ }
+ nameCondition.append(")");
+ conditions.add(nameCondition.toString());
+ }
+ }
+
+ return conditions.isEmpty() ? "" : String.join(" and ", conditions);
+ }
+
+ /**
+ * SQL注入防护 - 转义单引号
+ *
+ * @param input 输入字符串
+ * @return 转义后的字符串
+ */
+ private String escapeSql(String input) {
+ return input == null ? null : input.replace("'", "''");
+ }
+
+ /**
+ * 查询仓库信息
+ * 示例:
+ * JSON输入示例:
+ * {
+ * "ufinterface": {
+ * "data": {
+ * "code": ["仓库code", "ST002"],
+ * "name": ["仓库name", "仓库B"],
+ * "org_code": ["ORG01", "ORG02"],
+ * "group_codes": ["GROUP001", "GROUP002"]
+ * },
+ * "pageInfo": {
+ * "pageNo": 1,
+ * "pageSize": 10
+ * }
+ * }
+ * }
+ *
+ * @param json 输入的JSON字符串
+ * @return JSONString 包含查询结果或错误信息
+ */
+ @POST
+ @Path("queryStordoc")
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public JSONString queryStordoc(JSONString json) {
+ JSONObject jObject = JSON.parseObject(json.toJSONString());
+ if (jObject == null) {
+ return ResultMessageUtil.exceptionToJSON(new NullPointerException("请求JSON对象为null"));
+ }
+ JSONObject ufinterfaceObj = jObject.getJSONObject("ufinterface");
+ if (ufinterfaceObj == null) {
+ return ResultMessageUtil.exceptionToJSON(new NullPointerException("ufinterface节点为null"));
+ }
+ JSONObject data = ufinterfaceObj.getJSONObject("data"); // 查询条件
+ JSONObject pageInfoJson = ufinterfaceObj.getJSONObject("pageInfo"); // 分页信息
+ if (data == null) {
+ data = new JSONObject();
+ }
+ Map paramMap = new HashMap<>();
+ JSONArray code_json = data.getJSONArray("code");
+ JSONArray name_json = data.getJSONArray("name");
+ JSONArray orgCodeArr = data.getJSONArray("org_code");
+ JSONArray groupCodeArr = data.getJSONArray("group_codes");
+
+ // 处理数组类型的参数
+ if (code_json != null && !code_json.isEmpty()) {
+ paramMap.put("code", code_json.toArray(new String[0]));
+ }
+ if (name_json != null && !name_json.isEmpty()) {
+ paramMap.put("name", name_json.toArray(new String[0]));
+ }
+
+ try {
+ // 将 org_code 转换为主键保存到 paramMap
+ if (orgCodeArr != null && !orgCodeArr.isEmpty()) {
+ List pkOrgList = new ArrayList<>();
+ StringBuilder cond = new StringBuilder("code in (");
+ for (int i = 0; i < orgCodeArr.size(); i++) {
+ if (i > 0) {
+ cond.append(",");
+ }
+ cond.append("'").append(escapeSql(orgCodeArr.getString(i))).append("'");
+ }
+ cond.append(")");
+ Collection stockOrgs = BASE_DAO.retrieveByClause(nc.vo.org.StockOrgVO.class, cond.toString(), new String[]{"pk_stockorg"});
+ if (stockOrgs != null) {
+ for (Object obj : stockOrgs) {
+ nc.vo.org.StockOrgVO vo = (nc.vo.org.StockOrgVO) obj;
+ pkOrgList.add(vo.getPk_stockorg());
+ }
+ }
+ if (!pkOrgList.isEmpty()) {
+ paramMap.put("pk_org", pkOrgList.toArray(new String[0]));
+ }
+ }
+
+ // 将 group_codes 转换为主键保存到 paramMap
+ if (groupCodeArr != null && !groupCodeArr.isEmpty()) {
+ List pkGroupList = new ArrayList<>();
+ StringBuilder cond = new StringBuilder("code in (");
+ for (int i = 0; i < groupCodeArr.size(); i++) {
+ if (i > 0) {
+ cond.append(",");
+ }
+ cond.append("'").append(escapeSql(groupCodeArr.getString(i))).append("'");
+ }
+ cond.append(")");
+ Collection groups = BASE_DAO.retrieveByClause(nc.vo.org.GroupVO.class, cond.toString(), new String[]{"pk_group"});
+ if (groups != null) {
+ for (Object obj : groups) {
+ nc.vo.org.GroupVO vo = (nc.vo.org.GroupVO) obj;
+ pkGroupList.add(vo.getPk_group());
+ }
+ }
+ if (!pkGroupList.isEmpty()) {
+ paramMap.put("pk_group", pkGroupList.toArray(new String[0]));
+ }
+ }
+
+ // 使用自定义方法替代工具类
+ String condition = buildCondition(paramMap);
+ if (StringUtils.isNotBlank(condition)) {
+ condition = "dr = 0 and " + condition;
+ } else {
+ condition = "dr=0";
+ }
+
+ String sql = "SELECT pk_stordoc FROM bd_stordoc WHERE " + condition;
+ List allPks = (List) BASE_DAO.executeQuery(sql, new ColumnListProcessor());
+ OpenApiPageInfo openApiPageInfo = new OpenApiPageInfo();
+ String[] currPks = OpenApiPagenationUtils.getCurrentPagePksAndPageInfo(allPks, pageInfoJson, openApiPageInfo);
+
+ if (currPks == null || currPks.length == 0) {
+ return ResultMessageUtil.toJSONByPage(new StordocVO[0], openApiPageInfo, false);
+ }
+
+ SqlBuilderUtil sqlBuilderUtil = new SqlBuilderUtil();
+ String wherePartForRetrieve = sqlBuilderUtil.buildSQL("pk_stordoc", currPks, null);
+
+ StordocVO[] vos = (StordocVO[]) BASE_DAO.retrieveByClause(StordocVO.class, wherePartForRetrieve)
+ .toArray(new StordocVO[0]);
+
+ return ResultMessageUtil.toJSONByPage(vos, openApiPageInfo, false);
+
+ } catch (Exception e) {
+ return ResultMessageUtil.exceptionToJSON(e);
+ }
+ }
+
+}